Python 3 中忽略的 Python 单元测试预期失败

标签 python python-3.x python-2.7 python-unittest

我想将我的 python 测试工具(基于 Python 的单元测试模块)从 Python2 升级到 Python3。但是,unittest.expectedFailure 装饰器似乎不再具有相同的效果。特别是,尽管规范几乎相同,但以下代码根据 Python 版本具有不同的行为:

#!/usr/bin/env python2
#!/usr/bin/env python3
# Switch between the two lines above to get the different outcome

import unittest

class ComparisonTests(unittest.TestCase):

    def runTest(self):
        """ This method is needed even if empty """

    def add_test(self, the_suite):
        def testMain():
            self.testFunc()
        testMain = unittest.expectedFailure(testMain)
        the_case = unittest.FunctionTestCase(testMain)
        the_suite.addTest(the_case)

    def testFunc(self):
        self.assertTrue(False)

if __name__ == '__main__':
    SUITE = unittest.TestSuite()
    ComparisonTests().add_test(SUITE)

    the_runner = unittest.TextTestRunner(verbosity=2)
    the_runner.run(SUITE)

如果我保留第一行 (#!/usr/bin/env python2) 并在 MacOS 10.14.1 和 Python 2.7.15< 上运行 则输出如下:

unittest.case.FunctionTestCase (testMain) ... expected failure

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK (expected failures=1)

这是我期望的行为。但是,如果我切换到将使用 Python 3.7.3 的第二行 (#!/usr/bin/env python3),我会得到以下信息:

unittest.case.FunctionTestCase (testMain) ... FAIL

======================================================================
FAIL: unittest.case.FunctionTestCase (testMain)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./unittest_test_2.py", line 12, in testMain
    self.testFunc()
  File "./unittest_test_2.py", line 18, in testFunc
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=1)

看起来 unittest.expectedFailure 装饰器被忽略了。查看源代码我可以看到明显的区别:

# Python 3.7 source:
def expectedFailure(test_item):
    test_item.__unittest_expecting_failure__ = True
    return test_item

# Python 2.7 source:
def expectedFailure(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        try:
            func(*args, **kwargs)
        except Exception:
            raise _ExpectedFailure(sys.exc_info())
        raise _UnexpectedSuccess
    return wrapper

如何在 Python3 版本的 unittest 中定义预期的失败?

最佳答案

unittest.expectedFailure 装饰器的 Python 3 版本预计将在单元测试测试用例上运行,而不是像在 Python 2 中那样在方法上运行。因此,为了使上述测试工具能够使用 Python 3 需要在 the_case 上使用 expectedFalure 装饰器,如下所示:

the_case = unittest.FunctionTestCase(testMain)
the_case = unittest.expectedFailure(the_case)

关于Python 3 中忽略的 Python 单元测试预期失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57030346/

相关文章:

python - 我怎样才能在 python 中整齐地处理几个正则表达式案例

python - 检查之后是否有 Tkinter 安排的方法

python-2.7 - 测试 Scipy;得到 "No module named msvccompiler in numpy.distutils; trying from distutils"

python文件复制给出更大的文件

python - 将 PostGIS 几何类型作为几何类型从 Shapely 导入 Python?

python - _event.cpython-310-x86_64-linux-gnu.so : undefined symbol: _PyGen_Send 导入错误

python - 在为 Keras NN 做准备时应用 StandardScaler() 时遇到问题

python - 在 scikit learn 中自定义损失函数

python - 导入 glob,语法无效 python

python - 如何计算每次迭代后跳过一个元素的每三个连续元素的平均值