$ pip install pytest
$ py.test test_foo.py
py.testコマンドを実行するとpytest.iniがあると自動的に読み込まれる。 ここにカスタムマーカーを定義しておける。
定義済みマーカーを確認するにはpy.testに --markers オプションを付ける。:
(py27)oyakata@ubuntu:~/Documents/ptst$ py.test --markers @pytest.mark.heavy: Very slow, heavy test. @pytest.mark.with_http: Tests uses http connection. (以下略)
pytest.mark.parametrizeデコレータを使ってテストの内容と条件を分けて書ける。 サンプルコードにもあるが、簡単な例を示すと以下の通り。
例:
import pytest def foo(a, b): return a + b @pytest.mark.parametrize(("num1", "num2", "expect"), [ (1, 2, 3), (3, 4, 7), ]) def test_foo(num1, num2, expect): assert foo(num1, num2) == expect
pytestにはfuncargsという仕組みがある。
funcargsとはテストメソッドの引数のファクトリで、 py.testコマンドのオプションを独自に定義してその値に応じてテスト条件を変えたりテストをスキップできる。
また、py.testのビルトインfuncargsもいくつかあって、 例えばtmpdirという名前の引数は自動的にpy.path.localのオブジェクトに置き換わる。
考え方やアプローチとしては良さそうなのだが、unittestと共存できない点に注意。 (unittest.TestCaseのメソッドはself一つだけを引数に取るので、 funcargsを注入しようとするとエラーになってしまう。)