Создание тестов графического интерфейса


Оглавление

QTestLib предоставляет механизм для тестирования графического интерфейса. Предположим, что мы хотим протестировать поведение виджета однострочного текстового поля QLineEdit. Прежде всего нам потребуется создать класс, содержащий тестовый метод.

В реализации тестового метода edit() мы создаем виджет QLineEdit. Затем мы имитируем ввод "ABCDEFGH", используя метод QTest::keyClicks(), который имитирует нажатия на серию клавиш клавиатуры. В необязательных параметрах этого метода можно передавать модификаторы клавиатуры, а также задержку, в миллисекундах, после каждого нажатия на клавишу. Класс QTest предоставляет методы, позволяющие симулировать события не только клавиатуры, но и мыши.


#include <QtTest>
#include <QtGui>

// 
class Test_QLineEdit : public QObject {
Q_OBJECT
private slots:
    void edit();
};


void Test_QLineEdit::edit()
{
    QLineEdit txt;
    QTest::keyClicks(&txt, "ABCDEFGH");

    QCOMPARE(txt.text(), QString("ABCDEFGH"));
    QVERIFY(txt.isModified());
}

QTEST_MAIN(Test_QLineEdit)
#include "test.moc"

Мы используем макрос QCOMPARE() для того, чтобы проверить на совпадение текст однострочного текстового поля и ожидаемый текст. После того как текст в виджете поля был изменен, вызов метода isModified() должен вернуть значение true. Мы проверяем это при помощи макроса QVERIFY() . Этот макрос оценивает переданное выражение, и если оно истинно, то исполнение теста продолжается. В противном случае производится отображение сообщения об ошибке и выполнение теста прекращается.

Тесты — это мощный детектор ошибок, резко сокращающий время их поиска. Создав надежные тесты, можно значительно увеличить скорость программирования. Запускайте тесты как можно чаще.

Для создания теста нужен класс, который будет содержать тестовые слоты. Этот класс должен быть унаследован от класса QObject. Тестовая программа должна содержать макрос QTESTMAIN(), который заменяет функцию main() для запуска всех тестовых методов.

Макрос QCOMPARE() сравнивает результирующие значения с ожидаемыми. Если значения идентичны, то исполнение теста будет продолжено, если нет — тест будет остановлен с отображением сообщения об ошибке.

Макрос QVERIFY() проверяет правильность условия. Если значение равно true, то выполнение теста продолжается. Если нет, то тест далее не исполняется и производится отображение сообщения об ошибке.

Во избежание проблем, связанных с повторением кода, QtTestLib предоставляет возможность создания тестов с передачей данных. Все что нужно — это просто добавить еще один слот в private секцию нашего класса. Слот для тестовых данных должен называться так же, как и тестовый слот, но с постфиксом _data. Тестовые данные имеют формат обычной таблицы. Назначение макроса QFETCH() состоит в создании локальных переменных и заполнении их данными.

QtTestLib предоставляет возможность для тестирования графического интерфейса.