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