Python unittest中的执行顺序

8

我需要为我的测试设置执行顺序,因为我需要先验证某些数据再去验证其他数据。有办法可以设置执行顺序吗?

class OneTestCase(unittest.TestCase):
    def setUp(self):
        # something to do
    def test_login (self):
        # first test
        pass
    def test_other (self):
        # any order after test_login
    def test_othermore (self):
        # any order after test_login
if __name__ == '__main__':
    unittest.main()

4
单元测试意味着测试是单元化的,它们不应该互相依赖。 - njzk2
3
如果您实际上正在与真实服务器通过网络交互,那么您不是在进行单元测试。 - user395760
8
在哲学中,"Unitary"是很好的概念,但有时在实践中却不太方便。想象一下一个长时间设置的过程,从磁盘加载文件、网络连接...你不希望测试用例花费很长时间。它们运行得越慢,你就会运行得越少,所以它们就越没用。 - Michael
2
https://dev59.com/hWoy5IYBdhLWcg3wsP_Q - Moj
4
这仍然是最好的选择。只是你不应该过于教条。我有很多针对冗长数学计算的单元测试,如果没有在 setUpClass 中保存临时结果和设置代码进行整个测试集,那么速度将会非常慢。只要你的测试能够证明你想证明的东西,谁还关心教条呢? - Michael
显示剩余8条评论
2个回答

29

你可以像这样做:

class OneTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        # something to do
        pass

    def test_01_login (self):
        # first test
        pass
    def test_02_other (self):
        # any order after test_login
    def test_03_othermore (self):
        # any order after test_login

if __name__ == '__main__':
    unittest.main(failfast=True, exit=False)

测试按字母顺序排序,因此只需添加数字即可获得所需的顺序。可能您还希望为测试运行器设置 failfast = True,这样它会立即失败,一旦第一个测试失败。


3
它们被分类到哪里了?能依赖这个吗? - User
1
@用户 请参阅Python文档:“请注意,各种测试用例运行的顺序是通过将测试函数名称相对于字符串的内置排序进行排序来确定的。” - mloskot

1
最好不要这样做。
测试应该是独立的。
最好将代码放入由测试调用的函数中。
就像这样:
def assert_can_log_in(self):
    ...

def test_1(self):
    self.assert_can_log_in()
    ...

def test_2(self):
    self.assert_can_log_in()
    ...

甚至可以将测试类拆分,并将断言放入setUp函数中。

class LoggedInTests(unittest.TestCase):
    def setUp(self):
        # test for login or not - your decision

    def test_1(self):
        ...

当我拆分课程时,我经常编写更多、更好的测试,因为测试被拆分了,我可以更清楚地看到所有应该测试的情况。


登录也必须经过测试,这样可以吗? - Carlos
抱歉,我不理解。 - User
9
我阅读了有关如何正确编写测试的长篇讨论。事实是,一些测试依赖于某些特定状态,例如可以通过先前的测试创建该状态(例如登录)。创建此状态可能是一项耗时的过程,因此重复使用它并链接测试可能是值得的,以保持测试持续时间短。否则,您将不得不测试登录过程100次,只是为了覆盖使用已登录状态进行的测试。因此,在测试分离方面过于哲学化是没有意义的。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接