web-dev-qa-db-ja.com

pytestでクラスメソッドをテストする

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()をテストするにはどうすればよいですか?

24
laserbrain

クラスメソッドをテストするために必要なことは、そのクラスをインスタンス化し、そのインスタンスでメソッドを呼び出すことだけです。

def test_action(self):
    sc = SuperCool()
    assert sc.action(1) == 1
22
elethan

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
9
Tyler Sebastian

フィクスチャは、テスト環境(データベース接続など)またはデータのパラメーター化を作成するためにのみ使用します。

データが比較的簡単な場合は、テストケース内で定義できます。

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
4
Kirill

クラスの初期化が高価であるが、クラスメソッドで多くのパラメータ化されたテストを実行する必要がある場合、メソッド定義を変更して外部入力を許可できます。その後、テストループの外側で一度初期化し、メソッドで好きなだけテストを実行できます。例えば:

これの代わりに:

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ではないことを願っています

0
Trenton