python unittest上的执行顺序

Car*_*los 6 python unit-testing

我需要为我的测试设置执行顺序,因为我需要在其他测试之前验证一些数据.可以订单吗?

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()
Run Code Online (Sandbox Code Playgroud)

谢谢

Mic*_*ael 21

你可以这样做:

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)
Run Code Online (Sandbox Code Playgroud)

测试按字母顺序排序,因此只需添加数字即可获得所需的订单.可能你也想failfast = True为testrunner 设置,所以一旦第一次测试失败,它就会立即失败.

  • 他们在哪里排序?可以依靠吗? (3认同)
  • unittest通过字母表可靠地对它们进行排序. (2认同)

Use*_*ser 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()
    ...
Run Code Online (Sandbox Code Playgroud)

或者甚至拆分测试类并将断言放入 setUp 函数中。

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

    def test_1(self):
        ...
Run Code Online (Sandbox Code Playgroud)

当我拆分班级时,我经常编写更多更好的测试,因为测试被拆分,我可以更好地了解所有应该测试的案例。

  • 我阅读了有关如何正确编写测试的冗长讨论。事实上,一些测试依赖于某些特定状态,例如可以通过先前的测试创建该状态,该测试测试该状态的创建(例如正在登录)。创建此状态可能是一个耗时的过程,因此重用它和链接测试可能是值得的,以缩短测试的持续时间。否则,您最终会测试登录过程 100 次,只是为了覆盖您在登录状态下所做的测试。因此,对测试分离过于哲学化是没有意义的。 (9认同)