Pythonテストの書き方:pytestとunittestを使いこなす
Pythonでテストを書く方法を初心者向けに解説。pytestとunittestの基本的な使い方、TDDの流れ、自動テストの実践例を紹介。
はじめに
Pythonでプログラムを書く際、テストは品質を保証するために欠かせません。本記事では、Pythonの標準ライブラリunittestと、よりシンプルで強力なpytestを使ったテストの書き方を解説します。また、テスト駆動開発(TDD)の基本的な流れも紹介します。
テストの基本構造
テストは、特定の関数やメソッドが期待通り動作するかを確認するコードです。テストフレームワークを使うことで、自動化・効率化できます。
unittestの基本
unittestはPython標準ライブラリです。テストはunittest.TestCaseを継承したクラスにメソッドとして記述します。
import unittest
def add(a, b):
return a + b
class TestAdd(unittest.TestCase):
def test_add_positive(self):
self.assertEqual(add(1, 2), 3)
def test_add_negative(self):
self.assertEqual(add(-1, -2), -3)
if __name__ == '__main__':
unittest.main()
assertEqualの他に、assertTrue、assertFalse、assertRaisesなどがあります。
pytestの基本
pytestはサードパーティのフレームワークで、より簡潔に書けます。
<h1>test_sample.py</h1>
def add(a, b):
return a + b
def test_add_positive():
assert add(1, 2) == 3
def test_add_negative():
assert add(-1, -2) == -3
pytestはtest_で始まる関数や、Testで始まるクラスを自動で見つけて実行します。アサーションはPythonのassert文を使うだけです。
テストの実行方法
unittestの実行
コマンドラインから直接ファイルを実行するか、python -m unittestで実行します。
python -m unittest test_module.py
pytestの実行
pytestコマンドを使います。
pytest test_sample.py
pytestは詳細なレポートを出力し、失敗箇所をわかりやすく表示します。
TDD(テスト駆動開発)の流れ
TDDは「Red-Green-Refactor」のサイクルで進めます。
例:FizzBuzz関数
<h1>1. Red: テストを書く</h1>
def test_fizzbuzz_returns_fizz_for_multiple_of_3():
assert fizzbuzz(3) == "Fizz"
def test_fizzbuzz_returns_buzz_for_multiple_of_5():
assert fizzbuzz(5) == "Buzz"
def test_fizzbuzz_returns_fizzbuzz_for_multiple_of_15():
assert fizzbuzz(15) == "FizzBuzz"
def test_fizzbuzz_returns_number_otherwise():
assert fizzbuzz(1) == "1"
<h1>2. Green: 最小限の実装</h1>
def fizzbuzz(n):
if n % 15 == 0:
return "FizzBuzz"
if n % 3 == 0:
return "Fizz"
if n % 5 == 0:
return "Buzz"
return str(n)
テストのベストプラクティス
pytestのfixture
import pytest
@pytest.fixture
def sample_data():
return {"name": "Alice", "age": 30}
def test_sample_data(sample_data):
assert sample_data["name"] == "Alice"
unittestのsetUp/tearDown
import unittest
class TestSample(unittest.TestCase):
def setUp(self):
self.data = {"name": "Alice", "age": 30}
def test_sample(self):
self.assertEqual(self.data["name"], "Alice")
自動テストの実践例
実際のプロジェクトでは、テストを自動化して継続的に実行します。GitHub ActionsやJenkinsなどのCIツールと組み合わせます。
GitHub Actionsの例
name: Python Tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
pip install pytest
- name: Run tests
run: pytest
まとめ
Pythonでのテストは、unittestとpytestの2つの選択肢があります。初心者にはシンプルなpytestがおすすめです。TDDのサイクルを取り入れることで、バグの少ないコードを効率的に書けるようになります。ぜひ、テストを書く習慣をつけてください。