如何使用unittest从测试或设置内部停止所有测试?

2024-05-19 01:35:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在扩展python 2.7unittest框架来进行一些功能测试。我想做的一件事是停止所有测试在测试内部和setUpClass()方法内部运行。有时,如果一个测试失败了,程序就崩溃了,不再需要继续测试,所以我想停止运行测试。

我注意到一个TestResult有一个shouldStop属性和一个stop()方法,但是我不确定如何在测试内部访问它。

有人有什么想法吗?有更好的办法吗?


Tags: 方法程序框架属性unittest功能测试stop办法
3条回答

我又想了一个答案:

首先,我添加了一个新的异常:

class StopTests(Exception):
"""
Raise this exception in a test to stop the test run.

"""
    pass

然后我向子测试类添加了一个新的assert

def assertStopTestsIfFalse(self, statement, reason=''):
    try:
        assert statement            
    except AssertionError:
        result.addFailure(self, sys.exc_info())

最后,我重写了run函数,以便在testMethod()调用下面包含此函数:

except StopTests:
    result.addFailure(self, sys.exc_info())
    result.stop()

我更喜欢这个,因为现在任何测试都可以停止所有测试,而且没有特定于cpython的代码。

目前,您只能在套件级别停止测试。进入TestCase后,在迭代测试时不使用TestResultstop()方法。

与您的问题有些关联,如果您使用的是python 2.7,那么在使用-f/--failfast调用测试时可以使用python -m unittest标志。这将在第一次失败时停止测试。

25.3.2.1. failfast, catch and buffer command line options

您还可以考虑使用Nose运行测试,并使用-x, --stopflag提前停止测试。

如果您感兴趣,这里有一个简单的示例,您可以自己决定如何使用py.test干净地退出测试套件:

# content of test_module.py
import pytest
counter = 0
def setup_function(func):
    global counter
    counter += 1
    if counter >=3:
        pytest.exit("decided to stop the test run")

def test_one():
    pass
def test_two():
    pass
def test_three():
    pass

如果你运行这个,你会得到:

$ pytest test_module.py 
============== test session starts =================
platform linux2 -- Python 2.6.5 -- pytest-1.4.0a1
test path 1: test_module.py

test_module.py ..

!!!! Exit: decided to stop the test run !!!!!!!!!!!!
============= 2 passed in 0.08 seconds =============

您还可以将py.test.exit()调用放入测试或项目特定的插件中。

侧注:py.test本机支持py.test --maxfail=NUM在NUM失败后实现停止。

Sidenote2:py.test对以传统的unittest.TestCase样式运行测试的支持有限。

相关问题 更多 >

    热门问题