Python单元测试:如果特定测试失败,则取消所有测试

10

我正在使用unittest测试我的Flask应用程序,并使用nose来实际运行测试。

我的第一组测试是确保测试环境干净,并防止在Flask应用程序配置的数据库上运行测试。我相信我已经清洁地设置了测试环境,但我想要一些保证,而不必运行所有测试。

import unittest

class MyTestCase(unittest.TestCase):
    def setUp(self):
        # set some stuff up
        pass

    def tearDown(self):
        # do the teardown
        pass

class TestEnvironmentTest(MyTestCase):
    def test_environment_is_clean(self):
        # A failing test
        assert 0 == 1

class SomeOtherTest(MyTestCase):
    def test_foo(self):
        # A passing test
        assert 1 == 1

我想让TestEnvironmentTest在失败时导致unittestnose停止运行,并防止SomeOtherTest和任何后续的测试运行。是否有内置的方法可以在unittest(首选)或nose中实现这一点?


1
你知道nose是否解决了测试排序问题吗?因为在Python中,你不能保证测试的顺序(尽管我认为它通常会按字母顺序解决)。 - Colleen
那么这将是另一个问题,但我想通过在设置中放置测试来解决。 - Colleen
请问如何在测试用例出现错误时停止测试套件? - Colleen
哦,抱歉,误解了你的问题。我以为你想要在TestEnvironmentTest失败后立即失败。 - Colleen
使用nose的--with-id来保证测试顺序。 - dbn
显示剩余3条评论
4个回答

10
为了使得一个测试先执行且在该测试出错时停止其他测试的执行,你需要将这个测试放到setUp()中调用(因为Python不保证测试顺序),并在测试失败时进行跳过或者失败。
我喜欢使用skipTest() ,因为它实际上不会运行其他测试。而抛出异常似乎仍会尝试运行测试。
def setUp(self):
    # set some stuff up
    self.environment_is_clean()

def environment_is_clean(self):
    try:
        # A failing test
        assert 0 == 1
    except AssertionError:
        self.skipTest("Test environment is not clean!")

4
针对您的使用情况,可以使用 setUpModule() 函数:
如果在 setUpModule 中引发异常,则模块中的所有测试都不会运行,也不会运行 tearDownModule。 如果异常是 SkipTest 异常,则该模块将被报告为已跳过,而不是错误。
在此函数内测试您的环境。

在某些情况下,setUpClass()也可以工作。如果在setUpClass()期间引发异常,则不会运行类中的测试,并且不会运行tearDownClass() - Dennis Golomazov
如果setUpModule()被定义为TestCase类外的一个函数,你该如何进行断言? - Stevoisiak

2

setUp()中调用skipTest()可以跳过整个测试用例。这是Python 2.7的新功能。它不会使测试失败,而是直接跳过所有测试。


这是一个不错的功能,但最终结果仅仅是“OK”,它应该要在出现错误时进行警告。 - Colin Dunklau
这就是你的TestEnvironmentTest失败的原因。如果你只是想让它们失败,那么你已经有的代码有什么问题呢? - kichik

1

我不太确定它是否符合您的需求,但是您可以根据第一套单元测试的结果将第二套单元测试的执行设置为有条件的:

envsuite = unittest.TestSuite()
moretests = unittest.TestSuite()
# fill suites with test cases ...
envresult = unittest.TextTestRunner().run(envsuite)
if envresult.wasSuccessful():
    unittest.TextTestRunner().run(moretests)

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