在单元测试python中出现故障步骤时运行测试用例

Nit*_*esh 3 python python-unittest

我在Python中有一个testSuite,有几个使用单元测试框架的测试用例.我正在使用进口单元测试

如果测试用例中的测试步骤失败,则测试用例将进入拆解类.即使一个测试用例失败,我还想继续测试用例的其余部分.

单元测试的默认行为:如果任何测试步骤失败,它将拆除类并结束测试用例.

测试步骤:我的意思是断言相等并且像这个内置的proc,它定义了它是失败还是通过

oli*_*der 6

考虑到你有这样的事情:

class TestFoo(unittest.TestCase):
    def test_case_1(self):
        self.assertEqual(1, 2)
        self.assertEqual(1, 3)
        self.assertEqual(1, 1)
Run Code Online (Sandbox Code Playgroud)

第一个断言将失败,并且以下的断言将不会运行但测试将结束并且将调用self.tearDown方法.

当你断言你的意思是条件是强有力的,或者继续没有意义.你的意思是:"如果一个人不等于二,那么生活就再也没有意义......":)

大多数情况都是如此.例如,如果结果代码不是预期的结果代码,则不希望检查其余API的结果体.

你应该在一步中测试所有的平等,以确保它们都将被检查.您可以将它们分组为元组,例如:

class TestFoo(unittest.TestCase):
    def test_case_1(self):
        self.assertEqual((1, 1, 1), (2, 3, 1))
Run Code Online (Sandbox Code Playgroud)

然后你会得到这样的输出:

AssertionError: Tuples differ: (1, 1, 1) != (2, 3, 1)

First differing element 0:
1
2

- (1, 1, 1)
?  ^  ^

+ (2, 3, 1)
?  ^  ^
Run Code Online (Sandbox Code Playgroud)

从python文档:

assertEqual(first,second,msg = None)测试第一个和第二个是否相等.如果值不相等, 则测试将失败.

此外,如果第一个和第二个是完全相同的类型,并且是list,tuple,dict,set,frozenset或str之一或子类向addTypeEqualityFunc()注册的任何类型,则将调用特定于类型的相等函数以生成更有用的默认错误消息(另请参见特定于类型的方法列表).

https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertEqual https://docs.python.org/3.6/library/unittest.html#unittest.TestCase.assertEqual

[编辑] - 经过一些关于这个问题的澄清评论本身但没有代码示例.

考虑到你有不同的东西,像这样:

class TestBar(unittest.TestCase):
    def test_rest_api_foo(self):
        r = request("http://dummyurl")
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.text, "hello world")
Run Code Online (Sandbox Code Playgroud)

你可以做许多(hacky)事情,比如计算失败,而不是在最后断言和断言计数器值:

class TestBar(unittest.TestCase):
    def test_rest_api_foo(self):
        r = request("http://dummyurl")
        errors = (r.status_code != 200)
        errors += (r.text != "hello world")
        self.assertEqual(errors, 0)
Run Code Online (Sandbox Code Playgroud)

或者创建一个辅助函数来断言,记录,计数和吞下异常,然后在结尾处断言计数器.有很多种可能性.

但是,一般来说,最好的(最简单,最清楚,最无聊的)方式将是评论中已经建议的方式:

class TestBar(unittest.TestCase):
    def test_rest_api_status_code_foo(self):
        r = request("http://dummyurl")
        self.assertEqual(r.status_code, 200)

    def test_rest_api_text_foo(self):
        r = request("http://dummyurl")
        self.assertEqual(r.text, "hello world")
Run Code Online (Sandbox Code Playgroud)

请注意,在此特定示例中,单个测试用例会更好.

无论如何,这将为您提供单独的错误消息,同时保持代码简单易维护.

如果您的问题是因为在每个测试用例之后调用tearDown方法,那么您可以使用tearDownClass进行清理(python3或来自unittest2).

我确信我没有在这里覆盖你实际问题的所有可能性,但也许这对于展示你的未解决问题有多少可能性是有用的.所以,请澄清你的问题.

  • 这意味着你在一次测试中测试了多个东西.不要这样做.在一次测试中,测试第一个故障点以确保其正常工作.在另一个测试中,运行相同的设置,但不检查该故障,(另一个测试正在处理),检查下一个故障.等等.这也可能是您正在测试的功能太大的证据. (7认同)