web-dev-qa-db-ja.com

Py.test:クラスからのテストケースをパラメータ化します

私は現在これをフォローしています py.test 例であり、クラスを使用しない場合は機能しますが、テストケースをクラスに導入すると失敗します。

私が何とか書いた最小のケースは次のとおりです。

import unittest

import pytest

class FixtureTestCase(unittest.TestCase):

    @pytest.mark.parametrize("test_input,expected", [
    ("3+5", 8),
    ("2+4", 6),
    ("6*9", 42),
    ])
    def test_1(self, a, b):
        self.assertEqual(a, b)

残念ながら実行すると

  py.test  test_suite.py

エラーメッセージが表示されます:

  TypeError: test_1() takes exactly 3 arguments (1 given)

一連のtest_1テストを生成するにはどうすればよいですか?

19
pafede2

unittest.TestCaseからサブクラス化する場合、テストメソッドに追加の引数を含めることはできません。単にobjectからサブクラス化すると、機能します(ただし、TestCase.assertEqualメソッドの代わりに通常のassertステートメントを使用する必要があります。

import unittest

import pytest

class TestCase(object):

    @pytest.mark.parametrize("test_input,expected", [
    ("3+5", 8),
    ("2+4", 6),
    ("6*9", 42),
    ])
    def test_1(self, a, b):
        assert eval(a) == b

ただし、その時点では、テストは基本的に同じですが、全体的なボイラープレートとコードが少なくて済むため、関数を定義するだけでなくクラスを使用しているのはなぜかという疑問が生じます。

20
Brendan Abel

最後に、@ Brendan Abelによる返信とコメントを検討すると、次のことを行うことで、意図したとおりに成功することができました。

class TestCase(object):

    @parameterized.expand([
    ("negative", -1.5, -2.0),
    ("integer", 1, 1.0),
    ("large fraction", 1.6, 1),
    ])
    def test_floor(self, name, input, expected):
        assert_equal(math.floor(input), expected)


    @parameterized.expand([
    ("3+5", 8),
    ("2+4", 6),
    ("6*9", 42),
    ])
    def test_1(self, a, b):
        assert_equal(eval(a), b)

次に、 nosetests コマンドでテストを実行できます。

  nosetests -v --with-id class.py
1
pafede2