使用QT窗口作为C ++单元测试的一部分

时间:2013-01-10 17:36:44

标签: c++ qt unit-testing winapi user-interface

我有一些代码使用WinAPI从GetWindowTextWGetClassNameW的句柄中获取窗口的标题和类名。我想为这段代码创建一个单元测试,使用Qt创建一个临时窗口,对它运行我的代码,然后关闭窗口。但是我不确定如何以简单的方式做到这一点。例如,我可以按如下方式创建窗口:

#include "QtWidgets\qapplication.h"
#include "QtWidgets\qtextedit.h"
int argc = 1;
char* argv[1];
QApplication app(argc, &argv[0]);
QTextEdit textEdit;
textEdit.show();
app.exec(;)
// Rest of my unit test here

然而,此时QApplication对象进入它的事件循环并接受我的单元测试控制,直到我关闭窗口。允许我的单元测试继续在窗口上运行的最佳方法是什么?我应该为窗口创建一个单独的线程吗?作为单元测试,我希望尽可能简单。

这个问题旨在独立于单元测试框架,但如果重要,我正在使用UnitTest ++。

3 个答案:

答案 0 :(得分:1)

您将无法创建单独的线程,因为所有Qt gui对象都必须位于主线程中,您只能使用信号/槽机制与其他线程的gui对象进行交互。

我认为最简单的是子类化QTextEdit,实现公共插槽UnitTest(),并按如下方式修改测试:

#include "QtWidgets\qapplication.h"
#include "QtWidgets\qtextedit.h"
#include "MyTextEdit.h"
#include <QTimer>

int argc = 1;
char* argv[1];
QApplication app(argc, &argv[0]);
my_QTextEdit textEdit;
textEdit.show();
QTimer::singleShot(&my_QTextEdit,SLOT(UnitTest()),0);
app.exec();

在正确实例化QApplication并运行事件循环之后,这为您提供了my_QTextEdit :: UnitTest()的入口点。或者,您可以实现自己继承自QObject的类,创建公共槽,在运行app.exec()之前创建该对象(如果需要,传递给它指向QTextEdit);并以相同的方式连接到插槽 - 更好地满足您的需求。

答案 1 :(得分:0)

在我的自动Qt测试中,我通常跳过使用QApplication :: exec而不是使用QCoreApplication::hasPendingEventsQCoreApplication::processEvents - 这可以让你做一些准备工作,刷新事件队列(所以Qt有机会真正展示你的窗口),做更多的工作,让Qt处理这个抛出的任何其他事件,等等;当你想要运用小块逻辑时,它是一种非常方便的方法,可以实现所需的细粒度控制。

答案 2 :(得分:0)

这样做的合理工作示例代码就是在这个相关问题的答案中:Qt event loop and unit testing?