Вариант использования: у меня есть приложение Qt, и я хотел бы автоматизировать его тестирование в пользовательском стиле; то есть я хотел бы использовать keyClicks (), mouseClick () и так далее, но я бы хотел, чтобы окно приложения Qt действительно отображалось, пока это происходит.
У меня сейчас проблема в том, что использование QTestLib предполагает использование макроса QTEST_MAIN вместо определения самого себя, поэтому я никогда не получаю возможность показывать () проверяемые виджеты. Итак, еще один способ сформулировать этот вопрос: есть ли способ использовать QTestLib в приложении, которое использует свою основную функцию?
Я знаю, что Squish и, вероятно, Testable Driver способны на это, но если можно получить эту функциональность без использования дополнительных инструментов, то это было бы идеально.
Разобрался, как это сделать. Делает Squish совершенно ненужным, но требует доступа к исходному коду.
В своем тестовом классе сохраните указатель на QApplication и любые виджеты, которые вы хотите протестировать. Для простоты использования сохраните указатель на QMainWindow вашего приложения. Затем создайте экземпляр вашего тестового класса с указателями на виджеты, которые вы планируете тестировать, или воспользуйтесь window-> findChild (), чтобы получить любой элемент, который вам нужен. Имейте в виду, что вам нужно будет вызвать app-> processEvents () после всего. Вызовите его после показа виджета, чтобы появились все дочерние виджеты. Вызывайте его после взаимодействия с виджетом, чтобы взаимодействие фактически обрабатывалось в графическом интерфейсе. Если вам нужно, чтобы вещи были достаточно медленными для просмотра, используйте QTest :: qSleep ().
@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();
}