使用QProcess测试PySide应用程序

时间:2014-07-01 18:28:54

标签: python multithreading qt pyside pytest

我有一个PySide应用程序,它在QProcess中生成一个worker应用程序。工作人员执行模拟并创建要由主应用程序读取的结果文件。我想生成工作者,给它工作时间,然后检查输出。在我的测试函数中(我使用py.test,如果有帮助),我找不到一种方法来等待工作者而不阻塞主线程,因此不允许工作进程启动和运行。

def test_worker_thread():
    application = Application()  # Waits for and loads result files
    application.worker.start()  # Runs in a new process

    # How to wait right here without blocking thread?

    <wait_code>

    assert_correct_data(application.worker.results)

对于名为&#34; wait_code&#34;的部分,我尝试过:

  • 使用一个名为done的属性创建本地对象。我将worker.finished信号连接到设置done为True。然后我使用time.sleep循环来阻止等待工作人员完成。

    class WaitObject:
    
        def __init__(self):
            self.condition = False
    
        def set_true(self):
            self.condition = True
    
    wait = WaitObject()
    application.worker.finished(wait.set_true)
    
    while not wait.condition:
        time.sleep(1)
    
  • 我搜索了测试异步Qt代码的方法,我遇到QTest.qWait,我可以使用time.sleep()代替qWait而不阻止事件循环。但是,application未包含在PySide中。

  • 我也尝试过创建一个新的事件循环,就像在this thread中一样。但是,这似乎阻止了worker.start的事件循环,因此我们无法在工作程序运行时完成loop = QtCore.QEventLoop() application.worker.finished(loop.quit) loop.exec_() 函数并加载数据。

    {{1}}

任何提示?

1 个答案:

答案 0 :(得分:1)

事实证明,选项3确实有效。由于无关的错误,我的工作人员没有启动。以下是一些完整的框架代码:

def test_worker_thread():
    application = Application()  # Waits for and loads result files
    application.worker.start()  # Runs in a new process

    loop = QtGui.QEventLoop()
    application.worker.finished(loop.quit)  # Resume when worker done
    loop.exec_()  # Blocks at this line until loop quits

    assert_correct_data(application.worker.results)

我将继续研究这种模式的抽象。我将使用连接到QTimer的单一loop.quit添加超时,以防从未调用worker.finished

编辑:这是blog post更详细解释。