用例是,我有一个Qt应用程序,我想自动进行用户式测试;也就是说,我想使用keyClicks(),mouseClick()等,但我希望在发生这种情况时实际显示Qt应用程序窗口。
我现在遇到的问题是使用QTestLib涉及使用QTEST_MAIN宏而不是自己定义main,所以我永远不会有机会展示()正在测试的小部件。所以,另一种说出这个问题的方法是,有没有办法在使用其主函数的应用程序上使用QTestLib?
我知道Squish并且可能是Testability Driver能够做到这一点,但是如果可以在不使用额外工具的情况下获得此功能,那么这将是理想的。
答案 0 :(得分:8)
想出如何做到这一点。使Squish完全没必要,但它需要源代码访问。
在测试类中,存储指向QApplication的指针以及要测试的任何小部件。为了便于使用,请存储指向应用程序QMainWindow的指针。然后,使用指向您计划测试的小部件的指针来实例化您的测试类,或者使用window-> findChild()来获取您需要的任何元素。请记住,您需要在所有内容之后调用app-> processEvents()。在显示窗口小部件后调用它,以便显示所有子窗口小部件。在与窗口小部件交互后调用它,以便在GUI上实际处理交互。如果您需要足够慢的东西来观看,请使用QTest :: qSleep()。
答案 1 :(得分:0)
@KelvinS。这是我在@VGambit方法之后的代码片段,它试图测试向itemview添加日志。
#include <QApplication>
#include <QWidget>
#include <QtTest/QtTest>
#include "guimain.h"`
#include "xlogview.h"`
class TestLogView:public QObject
{
Q_OBJECT
public:
void set_mainwindow(QWidget * qw);
public slots:
void startTest();
private:
QWidget * m_qw ;
private slots:
void addItem();
};
void TestLogView::startTest()
{
QTest::qExec(this);
}
void TestLogView::set_mainwindow(QWidget * qw)
{
m_qw = qw;
}
void TestLogView::addItem()
{
XLogView * test_logview= m_qw->findChild<XLogView*>();
bool ret = test_logview->addLog("new log");
QVERIFY (ret == true);
}
#include "main.moc"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
GUIMain window;
window.show();
app.processEvents();
TestLogView test;
test.set_mainwindow(&window);
QTimer::singleShot(1000, &test, SLOT(startTest()));
return app.exec();
}