[英]How to avoid execution of Python UnitTest method “addCleanup” after test case failure?
I have the following Python UnitTest: 我有以下Python UnitTest:
import unittest
class SimpleTestCases(unittest.TestCase):
def setUp(self):
print "\nmessage from function: setUp"
self.createResource()
self.addCleanup(self.cleanResource)
def createResource(self):
print "\nmessage from function: createResource"
def cleanResource(self):
print "\nmessage from function: cleanResource"
def test_func1(self):
print "message from function: test_func1::start"
print "message from function: test_func1::end"
def test_func2(self):
print "message from function: test_func2::start"
self.assertTrue(False)
print "message from function: test_func2::end"
def test_func3(self):
print "message from function: test_func3::start"
print "message from function: test_func3:end"
if __name__ == "__main__":
unittest.main()
After the above code exution with option "-f" functions are executed in below order 在使用选项“ -f”执行上述代码抽取后,将按以下顺序执行功能
python -m unittest -fb test_cases
message from function: setUp
message from function: createResource
message from function: test_func1::start
message from function: test_func1::end
message from function: cleanResource
.
message from function: setUp
message from function: createResource
message from function: test_func2::start
F
message from function: cleanResource
======================================================================
FAIL: test_func2 (test_cases.SimpleTestCases)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_cases.py", line 23, in test_func2
self.assertTrue(False)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 2 tests in 0.000s
FAILED (failures=1)
It will stop the execution after first failure but will call the "addCleanup" method. 第一次失败后它将停止执行,但将调用“ addCleanup”方法。
I want to avoid to call "addCleanup" method when test function "test_func2" so the created resources can be used for debugging purpuse. 我想避免在测试函数“ test_func2”时调用“ addCleanup”方法,以便将创建的资源用于调试目的。
Is there any command-line option or workaround available? 是否有任何命令行选项或解决方法?
As one of the simplest ways - is just to put input (raw_input for Python 2) at the start of a cleanResource method. 作为最简单的方法之一-只是将输入(Python 2的raw_input)放在cleanResource方法的开始。 So execution will be stopped until the Enter key pressed. 因此执行将被停止,直到按下Enter键。
def cleanResource(self):
temp = raw_input('wait before cleanResource')
print("\nmessage from function: cleanResource")
Another way is to use breakpoint in the debugger 另一种方法是在调试器中使用断点
import pdb
and then 接着
pdb.set_trace()
where needed 需要的地方
As per unittest documentation doCleanups() is the method responsible to call all the cleanup methods. 根据单元测试文档, doCleanups()是负责调用所有清除方法的方法。
One way is to check the result of the test case in doCleanups method, if test case is failed then pop up all the cleanup methods and skip rest of the test cases 一种方法是在doCleanups方法中检查测试用例的结果,如果测试用例失败,则弹出所有清理方法并跳过其余测试用例
Below is the code: 下面是代码:
import unittest
class SimpleTestCases(unittest.TestCase):
FAILURE = False
def setUp(self):
print "\nmessage from function: setUp"
if SimpleTestCases.FAILURE:
self.skipTest("Test is skipped due to first failure")
return super(SimpleTestCases, self).setUp()
self.createResource()
self.addCleanup(self.cleanResource)
def createResource(self):
msg = "\nmessage from function: createResource"
def cleanResource(self):
print "\nmessage from function: cleanResource"
def test_func1(self):
print "message from function: test_func1::start"
print "message from function: test_func1::end"
def test_func2(self):
print "message from function: test_func2::start"
self.assertTrue(False)
print "message from function: test_func2::end"
def test_func3(self):
print "message from function: test_func3::start"
print "message from function: test_func3:end"
def doCleanups(self):
print "message from function: doCleanups"
if SimpleTestCases.FAILURE:
return super(SimpleTestCases, self).doCleanups()
result = getattr(self, '_outcomeForDoCleanups', self._resultForDoCleanups)
ok_result = True
exc_list = getattr(result, 'failures')
if exc_list and exc_list[-1][0] is self:
ok_result = ok_result and not exc_list[-1][1]
if not ok_result:
SimpleTestCases.FAILURE = True
while self._cleanups:
(func, args, kwargs) = self._cleanups.pop()
return super(SimpleTestCases, self).doCleanups()
if __name__ == "__main__":
result = unittest.main()
Execute as 执行为
python -m unittest test_cases
And output: 并输出:
message from function: setUp
message from function: test_func1::start
message from function: test_func1::end
message from function: doCleanups
message from function: cleanResource
.
message from function: setUp
message from function: test_func2::start
Fmessage from function: doCleanups
message from function: setUp
smessage from function: doCleanups
======================================================================
FAIL: test_func2 (test_cases.SimpleTestCases)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_cases.py", line 30, in test_func2
self.assertTrue(False)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 3 tests in 0.000s
FAILED (failures=1, skipped=1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.