Возможно ли, чтобы QTestLib отображал графический интерфейс, который он тестирует, во время работы?

Вариант использования: у меня есть приложение Qt, и я хотел бы автоматизировать его тестирование в пользовательском стиле; то есть я хотел бы использовать keyClicks (), mouseClick () и так далее, но я бы хотел, чтобы окно приложения Qt действительно отображалось, пока это происходит.

У меня сейчас проблема в том, что использование QTestLib предполагает использование макроса QTEST_MAIN вместо определения самого себя, поэтому я никогда не получаю возможность показывать () проверяемые виджеты. Итак, еще один способ сформулировать этот вопрос: есть ли способ использовать QTestLib в приложении, которое использует свою основную функцию?

Я знаю, что Squish и, вероятно, Testable Driver способны на это, но если можно получить эту функциональность без использования дополнительных инструментов, то это было бы идеально.

8

Решение

Разобрался, как это сделать. Делает Squish совершенно ненужным, но требует доступа к исходному коду.

В своем тестовом классе сохраните указатель на QApplication и любые виджеты, которые вы хотите протестировать. Для простоты использования сохраните указатель на QMainWindow вашего приложения. Затем создайте экземпляр вашего тестового класса с указателями на виджеты, которые вы планируете тестировать, или воспользуйтесь window-> findChild (), чтобы получить любой элемент, который вам нужен. Имейте в виду, что вам нужно будет вызвать app-> processEvents () после всего. Вызовите его после показа виджета, чтобы появились все дочерние виджеты. Вызывайте его после взаимодействия с виджетом, чтобы взаимодействие фактически обрабатывалось в графическом интерфейсе. Если вам нужно, чтобы вещи были достаточно медленными для просмотра, используйте QTest :: qSleep ().

8

Другие решения

@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();
}
0

По вопросам рекламы [email protected]