きり丸の技術日記

技術検証したり、資格等をここに残していきます。

PythonでSoftAssersionをする(use pytest-check, avoid assertion roulette)

自動テストの原則として、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で修正依頼を出せるようなエンジニアムーブをどんどんやっていきたいです。