[英]QT function suppressing test failures in python
处理测试 python UI 和 QT function 的复杂单元测试似乎正在抑制测试失败。 我相信我已经能够创建一个重复该行为的最小文件:
import pytest
from unittest import TestCase
from PySide2.QtCore import QTimer
def meaningless():
return 'fire'
class TestClass(TestCase):
def test_1(self):
def inner_test_1():
self.assertEqual(meaningless(),'x')
inner_test_1()
def test_2(self):
def inner_test_2():
self.assertEqual(meaningless(),'x')
QTimer.singleShot(1, inner_test_2)
if __name__ == '__main__':
import sys
sys.exit(pytest.main([__file__]))
第一次测试失败了,但第二次错误地通过了。 在我更复杂的真实世界单元测试中,“inner_test_2”的等效项确实会触发,并且可以在测试日志中看到由此产生的断言错误,但测试不会注册为失败。 从我在 QT 文档中可以看出,这可能与多线程有关? 我如何让失败失败?
这可能与多线程有关?
对,就是这样。 失败的测试是通过异常检测的,并且不同线程中的异常不会被 unittest 框架捕获,因为它无法将线程与测试相关联。
一个最小的、可重现的例子是:
import pytest
from unittest import TestCase
import threading
class TestClass(TestCase):
def test_2(self):
def inner_test_2():
self.assertTrue(False)
myTestThread = threading.Thread(target=inner_test_2)
myTestThread.start()
myTestThread.join()
if __name__ == '__main__':
import sys
sys.exit(pytest.main([__file__]))
请注意,虽然assertTrue(False)
引发了异常,但我们没有看到失败的测试。 但是我们确实看到(除了异常的堆栈跟踪)是来自pytest
的警告:
warnings.warn(pytest.PytestUnhandledThreadExceptionWarning(msg))
-- Docs: https://docs.pytest.org/en/stable/warnings.html
我如何让失败失败?
您需要从线程中捕获异常并在主线程中引发它们,以便 unittest 框架可以拾取它们并了解哪些测试失败了。 如何做到这一点是另一个主题,请参阅Make Python unittest fail on exception from any thread 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.