编写自写测试方法的python方法

编写自写测试方法的python方法,python,unit-testing,Python,Unit Testing,我定义了以下测试类。它使用我通常不喜欢的东西 class FubarTest(unittest.TestCase): lst = [(True, True), (False, False)] for t in lst: function = """def test_{}_is_{}(self): self.assertTrue({} is {}) """.format(t[0], t[1], t[0], t[1

我定义了以下测试类。它使用我通常不喜欢的东西

class FubarTest(unittest.TestCase):
    lst = [(True, True),
           (False, False)]
    for t in lst:
        function = """def test_{}_is_{}(self):
        self.assertTrue({} is {})
        """.format(t[0], t[1], t[0], t[1])
        exec function
当我运行它时(通过,但这不重要),我得到:

============================= test session starts ==============================
platform linux2 -- Python 2.7.3 -- pytest-2.3.4 -- /usr/bin/python
plugins: capturelog, cov, twisted, xdist

model/test/test_hframe5.py <- <string>:1: HFrame5Test.test_False_is_False PASSED
model/test/test_hframe5.py <- <string>:1: HFrame5Test.test_True_is_True PASSED
=========================== 2 passed in 0.49 seconds ===========================
=================================================测试会话开始==============================
平台linux2--python2.7.3--pytest-2.3.4--/usr/bin/Python
插件:capturelog、cov、twisted、xdist

model/test/test_hframe5.py我通常会犯更多测试而不是更少测试的错误,真的不管它是如何完成的。你可能很好

您需要参数化测试。例如,使用:

使用:


几乎可以肯定,您不需要使用
exec
。只需使用“setattr”向类添加合适的函数,并使用嵌套范围绑定测试值。例如,我认为这应该有效:

class FubarTest(unittest.TestCase):
    pass

def createTest(cls, arg1, arg2):
    def test(self):
        self.assertTrue(arg1 is arg2)
    testname = "test_{}_is_{}".format(arg1, arg2)
    setattr(cls, testname, test)

def createTests():
    lst = [(True, True),
        (False, False)]
    for a,b in lst:
        createTest(FubarTest, a, b)

createTests()

如果您使用nose,您可以使用:


声明有时,测试证明了方法的合理性。然而,如果我能让这个测试成为pythonic测试,并且遵循“美丽胜于丑陋”的说法,那就更好了。有趣的是,这正是我使用py.test的基础,因为我已经在使用py.test了。啊,太好了,我还将给出一个pytest示例。我认为这是一个很棒的测试框架。我不使用nose,但这是一个有用的答案。非常感谢。
import pytest

@pytest.mark.parametrize(
    ("value", "expected"),
    [
        (True, True),
        (False, False),
    ]
)
def test_identical(value, expected):
    assert value is expected
class FubarTest(unittest.TestCase):
    pass

def createTest(cls, arg1, arg2):
    def test(self):
        self.assertTrue(arg1 is arg2)
    testname = "test_{}_is_{}".format(arg1, arg2)
    setattr(cls, testname, test)

def createTests():
    lst = [(True, True),
        (False, False)]
    for a,b in lst:
        createTest(FubarTest, a, b)

createTests()
class FubarTest(object):

    def check_is(self, a, b):
        assert {} is {}

    def test_is(self):
        lst = [(True, True), (False, False)]
        for a, b in lst:
            self.check_is(a, b)