我正在嘗試為 pyqt5 應用程式進行一些單元測驗。問題是我不能在一個測驗套件中運行多個測驗,因為我沒有正確清理應用程式和每個測驗的結束。
class MainWindowTest(QMainWindow):
def __init__(self, widgetTypeUnderTest=None, model=None):
super().__init__()
self.widgetTypeUnderTest = widgetTypeUnderTest
self.model = model
# setting title
self.setWindowTitle("AccosTest")
self.setGeometry(100, 100, 500, 600)
self.mainWindowLayout = QHBoxLayout()
# container widget for everything else
widget = QWidget()
widget.setLayout(self.mainWindowLayout)
self.setCentralWidget(widget)
self.show()
class Tests(unittest.TestCase):
def setUp(self) -> None:
self.app = QApplication(sys.argv)
def tearDown(self) -> None:
self.app.exit()
def test(self):
mainWindow = MainWindowTest()
def test2(self):
mainWindow = MainWindowTest()
運行Tests.test1或Tests.test2單獨執行所需的操作,盡管這可能是因為第二個QApplication尚未開始。當同時運行兩個測驗時,我得到一個段錯誤。
任何人都知道正確的命令來正確地QApplication在每次測驗后拆除,因為self.app.exit()似乎沒有起到作用。謝謝!
編輯
你認為更好的策略是有兩個執行緒。一個會啟動主回圈sys.exit(self.app.exec()),另一個會等待一段時間然后呼叫exit?
uj5u.com熱心網友回復:
通常不需要重新創建 QApplication,即使是為了測驗(除非您確實需要在應用程式啟動或退出時對程式的行為進行多次測驗)。
您可以使用以下方式獲取當前現有的 QApplication instance():
def setUp(self) -> None:
self.app = QApplication.instance() or QApplication.(sys.argv)
在您確實需要重新啟動應用程式的極少數情況下,您需要確保之前的應用程式確實已退出。由于這假定了exec()已呼叫的事實,因此您可以銷毀app參考并重新創建它。
請注意,您不能在主執行緒之外創建另一個應用程式(或者,準確地說,在創建第一個應用程式的執行緒之外)。
uj5u.com熱心網友回復:
感謝@musicamante 的回答。
這是代碼:
選項1
使用解構式,del在 python 中使用。
class MainWindowTest(QMainWindow):
def __init__(self, widgetTypeUnderTest=None, model=None):
super().__init__()
self.widgetTypeUnderTest = widgetTypeUnderTest
self.model = model
# setting title
self.setWindowTitle("AccosTest")
self.setGeometry(100, 100, 500, 600)
self.mainWindowLayout = QHBoxLayout()
# container widget for everything else
widget = QWidget()
widget.setLayout(self.mainWindowLayout)
self.setCentralWidget(widget)
self.show()
class Tests(unittest.TestCase):
def setUp(self) -> None:
self.app = QApplication(sys.argv)
def tearDown(self) -> None:
del self.app
def test(self):
mainWindow = MainWindowTest()
def test2(self):
mainWindow = MainWindowTest()
選項 2
使QApplication全球和
app = QApplication(sys.argv)
class Tests(unittest.TestCase):
def setUp(self) -> None:
self.app = app.instance()
def tearDown(self) -> None:
self.app.closeAllWindows()
def test(self):
mainWindow = MainWindowTest()
def test2(self):
mainWindow = MainWindowTest()
似乎這Option 2應該是首選,因為您不需要QApplication在每次測驗后都制作和銷毀。但是,我個人的偏好是Option 1保持單元測驗完全獨立。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/527358.html
上一篇:嘗試制作暗光模式切換器
下一篇:/form處的ValueError視圖authentication.views.my_form未回傳HttpResponse物件。它回傳None而不是
