简体   繁体   English

测试用例失败后,如何避免执行Python UnitTest方法“ addCleanup”?

[英]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.

相关问题 如何捕获有关Python单元测试的测试用例失败的屏幕截图 - How to capture screenshot on test case failure for Python Unittest Selenium python如何使用来自unittest.TestCase的assertEqual方法“没有这样的测试方法 <class 'unittest.case.TestCase'> ” - Selenium python how to use assertEqual method from unittest.TestCase “No such test method in <class 'unittest.case.TestCase'>” python unittest没有这样的测试方法 - No such test method for python unittest 如何从python unittest发出测试错误(不是失败)的信号 - How do I signal test error (not failure) from python unittest Python unittest:我们可以重复单元测试用例执行可配置的次数吗? - Python unittest: Can we repeat Unit test case execution for a configurable number of times? 如何确保在执行每个 Python Unittest 后运行自定义函数? - How to ensure that a custom function runs after execution of every Python Unittest? 如何在 Python 中运行标记为“@unittest.skip”的测试用例? - How to run test case marked `@unittest.skip` in Python? 可以将python unittest测试用例变形吗? - Can you polymorph a python unittest test case? python unittest的基本测试用例类 - Base test case class for python unittest 使用 python 单元测试的抽象测试用例 - abstract test case using python unittest
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM