はじめに
開発工程で知った素敵な技術フレームワークを紹介します!
Pythonで開発している時のテスト方法は何を使用していますか?
ソフトウェア開発において、テストは品質を保証するための重要なプロセスです。
Pythonでは、pytestが非常に人気のあるテストフレームワークとして広く使用されています。本記事では、書籍を参照しつつ、pytestの基本的な使い方、特にassert文を使ったテストの書き方を解説します。また、さまざまなテストパターンを実例とともに紹介し、テストコードを書く際のヒントを提供します。
ざっくり理解
「Pythonで作成した関数をテストするツール」です!
①「関数に入力する仮データを準備する」
②「予め期待される値を準備する」
③これら①と②の二つを突合させるためのスクリプトを書いた別ファイルを準備する
④テスト用の別ファイルを実行して結果を確認する
などです。
pytestの基本
assert文によるテスト
まず、pytestの基本となるのがassert文を使ったテストです。assert文は、条件が真であることを確認するためのPython標準の構文であり、これを活用してテストを記述します。
シンプルなテストケース
例えば、リストの合計値をテストする場合、以下のように書くことができます。
def test_sum(): assert sum([1, 2, 3]) == 6, "合計が間違っています!"
このテストでは、sum([1, 2, 3])の結果が6であることを確認しています。もしassert文の条件が満たされない場合、テストは失敗し、エラーメッセージが表示されます。
実践的なテストパターン
pytestは非常に柔軟なフレームワークであり、様々なテストパターンをサポートしています。ここでは、いくつかの代表的なパターンを紹介します。
1. 例外処理のテスト
特定の条件下でエラーが発生するかを確認するテストは重要です。pytestでは、pytest.raisesを使って例外が発生するかをテストできます。
import pytest
def testzerodivision():
with pytest.raises(ZeroDivisionError):
1 / 0
このテストでは、1 / 0がZeroDivisionErrorを発生させることを確認しています。
2. パラメータ化テスト
複数の入力に対して同じテストを行いたい場合、pytestのパラメータ化機能が役立ちます。
@pytest.mark.parametrize("input,expected", [
([1, 2, 3], 6),
([1, 1, 1], 3),
([0, 0, 0], 0),
])
def test_sum(input, expected):
assert sum(input) == expected
これにより、異なるデータセットで同じ関数をテストできます。
3. フィクスチャを使ったテストの再利用
共通のセットアップコードを複数のテストで使い回したい場合、pytestのフィクスチャ機能を使用します。
import pytest
@pytest.fixture
def sample_data():
return [1, 2, 3, 4, 5]
def test_sum(sample_data):
assert sum(sample_data) == 15
この例では、sample_dataというフィクスチャがテスト関数に渡され、その結果を使ってテストを行っています。
4. カスタムマーカーを使った条件付きテスト
特定の条件下でのみテストを実行したい場合、カスタムマーカーを使うことができます。
import pytest
@pytest.mark.slow
def test_slow_function():
import time
time.sleep(2)
assert True
このテストは、pytest -m slowと指定することでのみ実行されます。
まとめ
pytestは、そのシンプルさと強力な機能で、Python開発におけるテストを効率的に行うためのツールです。assert文を使った基本的なテストから、例外処理やパラメータ化、フィクスチャなどの実践的なパターンまで、多様なテスト手法を使いこなすことで、品質の高いソフトウェアを開発することができます。
参考図書:『テスト駆動開発 Pythonでの実践』第2版