私は現在これをフォローしています 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テストを生成するにはどうすればよいですか?
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
ただし、その時点では、テストは基本的に同じですが、全体的なボイラープレートとコードが少なくて済むため、関数を定義するだけでなくクラスを使用しているのはなぜかという疑問が生じます。
最後に、@ 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