簡體   English   中英

QT function 抑制 python 中的測試失敗

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM