Pytestのドキュメントには、テストケースのさまざまな例が記載されています。それらのほとんどは、機能のテストを示しています。しかし、クラスとクラスメソッドをテストする方法の例がありません。テストするモジュール_cool.py
_に次のクラスがあるとしましょう:
_class SuperCool(object):
def action(self, x):
return x * x
_
_tests/test_cool.py
_の対応するテストクラスはどのように見える必要がありますか?
_class TestSuperCool():
def test_action(self, x):
pass
_
test_action()
を使用してaction()
をテストするにはどうすればよいですか?
クラスメソッドをテストするために必要なことは、そのクラスをインスタンス化し、そのインスタンスでメソッドを呼び出すことだけです。
def test_action(self):
sc = SuperCool()
assert sc.action(1) == 1
1つの方法は、テストメソッド内でオブジェクトを作成し、そこから操作することです。
def test_action(self, x):
o = SuperCool()
assert o.action(2) == 4
次のメソッドを使用して、古典的なsetup
およびteardown
スタイルのユニットテストのようなものを使用できるようです。 http://doc.pytest.org/en/latest/xunit_setup.html
Pytestのドキュメントはterribleであるため、それらの使用方法について100%確信はありません。
編集:そうですね
class TestSuperCool():
def setup(self):
self.sc = SuperCool()
...
# test using self.sc down here
フィクスチャは、テスト環境(データベース接続など)またはデータのパラメーター化を作成するためにのみ使用します。
データが比較的簡単な場合は、テストケース内で定義できます。
def test_action_without_fixtures():
sc = SuperCool()
sc.element = 'snow'
sc.melt()
assert sc.element == 'water'
パラメータ化の例:
@pytest.mark.parametrize("element, expected", [('snow', 'water'), ('tin', 'solder')])
def test_action_with_parametrization(element, expected):
sc = SuperCool()
sc.element = element
sc.melt()
assert sc.element == expected
クラスの初期化が高価であるが、クラスメソッドで多くのパラメータ化されたテストを実行する必要がある場合、メソッド定義を変更して外部入力を許可できます。その後、テストループの外側で一度初期化し、メソッドで好きなだけテストを実行できます。例えば:
これの代わりに:
class SuperCool():
def action(self):
return self.attribute ** 2
外部入力を許可するように書き換えます:
class SuperCool():
def action(self, x=None):
if x is None:
x = self.attribute
return x ** 2
これで、テストスクリプトは次のようになります。
sc = SuperCool()
@pytest.mark.parametrize("x, y", [(1, 1), (2, 4)])
def test_action_with_parametrization(x, y):
assert sc.action(x) == y
しかし、私は経験豊富なプログラマーではないため、これが何らかのアンチパターンXDではないことを願っています