自動テストの原則として、1テストに1検証とした方が良いです。これが複数あった時には失敗箇所が分かりづらくなってしまうため、その状態をバッドパターンとしてAssertion Rouletteと呼びます。
今回の記事では、PythonのTestフレームワークであるPytestを拡張しているpytest-check
を使用してAssertion Rouletteを回避するのを紹介します。
環境
- Python
- 3.12.3
- pytest-check
- 2.3.1
使用方法
Assertion Rouletteを回避するなら、pytest-check
を依存関係に含めてcheck.xxx
メソッドを使用するだけです。これをするだけでテストが途中で止まらず、最後にエラー箇所をまとめてくれます。
from pytest_check import check def test_01(): check.equal(1, 2) check.equal(2, 3) # これと等価 assert 1 == 2 assert 2 == 3 def test_httpx_get_with_helpers(): r = httpx.get('https://www.example.org/') assert r.status_code == 200 check.is_false(r.is_redirect) check.equal(r.encoding, 'utf-8') check.is_in('Example Domain', r.text)
備考
その他にも、is_(a, b, msg="")
やalmost_equal(a, b, rel=None, abs=None, msg="")
等々の便利なチェックメソッドがあるので、もしpytest-check
を使用する場合はこちらのチェックメソッドで表現を増やすといいと思います。
個人的には難しくなるので、equal
だけ覚えれば十分だと考えてます。エラーメッセージが丁寧になる等のメリットはあるのですが、pytest-check
がデファクトスタンダードと呼べるようなライブラリではないのでデメリットの方が多いと考えてます。
ただ、正直なところassert
だとIDEのサポートで文字色を変更する等のサポートをしてくれるのに、check
だとデフォルトで色がつかないこともあって実適用は避けました。便利ではあるけれど、チームに強要するほどのメリットが見当たらなかったです。
ソースコード
なし
終わりに
いいライブラリではあるのですが、GitHub Star数が300強程度しかないので、どうしてもAssertion Rouletteが我慢できないときに導入するライブラリかなと考えてます。
ちなみに、short test summary info
にエラーメッセージが出ないことも問題だったので、PullRequestを出してマージしてもらってます。
こんな感じでOSSを積極的に利用して、気になった点はPullRequestで修正依頼を出せるようなエンジニアムーブをどんどんやっていきたいです。