今回の講座の導入文
みなさん、Pythonってほんまに便利なプログラミング言語やけど、コード書いてるときにバグが出たりせえへん?それを防ぐために必要なんが「テスト」やねん。テストをちゃんとすることで、コードの品質が上がるし、後からの修正も楽になるで!
たとえば、料理するときに味見せんとそのまま出したら、味がめちゃくちゃになってしまうやん?テストもそれと同じで、完成したコードをちゃんと確認して、間違いがないかチェックするもんやねん。
今回は「Pytest」っていうテスト用のライブラリを使って、ユニットテストの基本を一緒に学んでいこうと思うで!これをマスターすれば、コードの信頼性がぐーんとアップするから、しっかり付いてきてな!
① テストファイルとテスト関数の作成
まずは、テストファイルとテスト関数を作るところから始めるで!Pytestを使うと、簡単にテストを作成できるんや。ここでは、基本的なテストファイルの構成とテスト関数の書き方を説明するで。
テストファイルの作成
テストファイルは、通常「test_」で始まる名前にするんがルールや。たとえば、計算機の機能をテストするファイルを作るなら、test_calculator.py
って名前にするのがええな。
テスト関数の作成
テスト関数は、テストしたい機能ごとに作成するんや。関数名は「test_」で始めるんが基本や。例えば、足し算をテストする関数はこんな感じになるで。
def test_addition():
assert add(1, 2) == 3
このコードでは、add
関数が正しく動くかを確認しとるんや。assert
文を使って、期待する結果と実際の結果を比べることで、テストが成功したか失敗したかを判断できるで。
実際にテストを実行する
テストファイルを作ったら、コマンドラインで以下のコマンドを実行するだけでテストができるで!
pytest test_calculator.py
これで、書いたテストが実行されて、問題があれば教えてくれるから、しっかり確認してな!これがテストファイルとテスト関数の基本やで。次は、アサーションの使い方を見ていこう!
② アサーションの使用方法
次は、テストの中で使う「アサーション」について詳しく見ていくで!アサーションは、期待する結果と実際の結果を比べるための方法や。これを上手に使うことで、テストがより効果的になるんや。
アサーションの基本
アサーションを使うときは、assert
キーワードを使うんや。基本的に使い方は以下のようになるで。
assert 実際の値 == 期待する値
この形式で、実際の値が期待する値と一致するかどうかを確認することができるんや。たとえば、足し算の関数が正しく動いてるかを確認する場合はこうなるで。
def test_addition():
assert add(2, 3) == 5
ここでは、add(2, 3)
の結果が5と一致するかをチェックしとるんや。もし一致せえへんかったら、テストは失敗するで。
より多くのアサーション
アサーションにはいろいろな種類があって、単に値の比較だけちゃうねん。たとえば、リストが特定の要素を含んでるかを確認する場合は、in
を使うこともできるで。
def test_contains():
my_list = [1, 2, 3, 4]
assert 3 in my_list
このコードでは、リストmy_list
の中に3が含まれてるかどうかを確認しとるんや。
エラーメッセージを活用する
もしテストが失敗したとき、エラーメッセージを使うことで、何が問題やったかを把握しやすくなるで。こうやって書くと、メッセージを追加できるんや。
def test_addition():
assert add(2, 2) == 5, "足し算が間違ってるで!"
これで、テストが失敗したときに「足し算が間違ってるで!」ってメッセージが表示されるから、どこがあかんかったかすぐに分かるで。
アサーションをうまく使うことで、テストの精度が上がるから、ぜひ活用してな!次は、フィクスチャの活用について見ていくで!
③ フィクスチャの活用
さて、次は「フィクスチャ」について学んでいくで!フィクスチャは、テストの前に準備を整えたり、テスト後の後片付けをするための仕組みや。これを使うことで、コードがすっきりして、テストがもっと効率的になるんや!
フィクスチャの基本
フィクスチャを使うためには、@pytest.fixture
デコレーターを使うんや。これによって、必要なデータや環境をセットアップできるで。例えば、データベースの接続や、テストに必要なオブジェクトの生成なんかに使えるんや。
以下は、簡単なフィクスチャの例やで。
import pytest
@pytest.fixture
def sample_data():
return [1, 2, 3, 4, 5]
このsample_data
フィクスチャは、テストで使うリストを返すだけのもんや。
テスト関数でのフィクスチャの使用
フィクスチャをテスト関数で使うには、テスト関数の引数にフィクスチャの名前を指定するだけや。そうすると、テストが実行されるときに自動的にフィクスチャが呼び出されるんや。
def test_list_length(sample_data):
assert len(sample_data) == 5
ここでは、sample_data
フィクスチャを使って、リストの長さが5かどうかを確認しとるで。
フィクスチャのスコープ
フィクスチャにはスコープを設定することもできるんや。デフォルトでは、フィクスチャは各テスト関数ごとに新しく作られるけど、scope
引数を使うことで変えられるで。例えば、モジュールごとにフィクスチャを共有したい場合は、こんな風に書くんや。
@pytest.fixture(scope="module")
def database_connection():
# データベースの接続を作成
conn = create_connection()
yield conn
# 後片付け
conn.close()
このようにすれば、モジュール内のテスト関数で同じ接続を使い回せるようになるんや。
フィクスチャを使うことで、テストがすっきりして、コードの再利用性が高まるから、ぜひ取り入れてみてな!次は、パラメータ化テストについて学んでいこう!
④ パラメータ化テスト
次は「パラメータ化テスト」についてや!これを使うことで、一つのテスト関数で複数の入力データを使ってテストを実行できるんや。つまり、同じテストを何回も書かんでも、いろんなケースをまとめてチェックできるってことやで。
パラメータ化の基本
Pytestでは、@pytest.mark.parametrize
デコレーターを使って、テスト関数に複数のパラメータを渡すことができるんや。基本的な使い方はこんな感じや。
import pytest
@pytest.mark.parametrize("input_a, input_b, expected", [
(1, 2, 3),
(2, 3, 5),
(5, 5, 10),
])
def test_addition(input_a, input_b, expected):
assert add(input_a, input_b) == expected
この例では、test_addition
関数が3つの異なる入力を使ってテストされるんや。それぞれのタプルがテストケースを表し、input_a
とinput_b
を足してexpected
と比較する仕組みになっとる。
テストの実行結果
パラメータ化テストを使うと、各ケースが独立して実行されるから、テストが失敗した場合にはどのケースが問題やったかも一目で分かるで。実行結果はこんな感じになるんや。
test_addition PASSED
test_addition PASSED
test_addition FAILED
失敗したケースの詳細も表示されるから、デバッグもしやすいで。
より複雑なパラメータ化
パラメータ化は、単純なデータだけちゃうねん。オブジェクトや辞書など、複雑なデータも使えるで。
@pytest.mark.parametrize("data, expected", [
({"a": 1, "b": 2}, 3),
({"a": 3, "b": 4}, 7),
])
def test_dict_addition(data, expected):
assert add(data["a"], data["b"]) == expected
このように、辞書を使ってキーで値を取り出して計算することもできるんや。
パラメータ化テストを使えば、テストの効率がグッと上がるから、ぜひ活用してみてな!次は、テストカバレッジの測定について学んでいくで!
⑤ テストカバレッジの測定
さて、最後に「テストカバレッジの測定」について学ぶで!テストカバレッジっていうのは、書いたテストがどれだけコードをカバーしているかを示す指標や。これを測定することで、どの部分がテストされていないか、どこをもっとテストすべきかが分かるんや。
カバレッジツールのインストール
テストカバレッジを測定するためには、pytest-cov
というプラグインを使うんや。まずはこれをインストールしような。
pip install pytest-cov
これで準備はバッチリやで!
テストカバレッジの実行
カバレッジを測定してテストを実行するには、以下のコマンドを使うんや。
pytest --cov=your_module tests/
ここで、your_module
はテストしたいモジュールの名前、tests/
はテストファイルが入ってるディレクトリ名や。これを実行すると、テストが終わった後にカバレッジの結果が表示されるで。
カバレッジレポートの解釈
テストが終わったら、こんな感じの結果が返ってくるんや。
Name Stmts Miss Cover
-----------------------------------------
your_module.py 50 5 90%
tests/test_module.py 20 0 100%
この表では、各ファイルのステートメント数、ミスしたステートメント数、カバレッジ率が表示されるんや。たとえば、your_module.py
が50行中5行が未テストやから、カバレッジは90%ということや。
HTMLレポートの生成
もっと見やすいレポートが欲しい場合は、HTML形式でレポートを生成することもできるで。以下のコマンドを使ってみてな。
pytest --cov=your_module --cov-report html
これを実行すると、htmlcov
というフォルダが作成され、その中にHTMLファイルが生成されるんや。ブラウザで開くと、どの行がカバーされていて、どの行がカバーされていないかが視覚的に分かるで。
テストカバレッジを測定することで、テストの質を向上させることができるから、ぜひ活用して、自分のコードがしっかりテストされてるか確認してみてな!
これで、Pytestの基本的な使い方とテスト手法についての章は終わりや!テストはコードの品質を保つために重要やから、しっかり学んで実践していこうな!
【Pytestの基本をマスター】フィクスチャやパラメータ化テストで効率的なユニットテストを実現しよう!