Тесты с передачей данных


До настоящего момента мы вписывали данные для проведения теста в макрос QCOMPARE(). Подобный подход вызывает нежелательный эффект дублирования кода. Для минимизации дублирования кода QtTestLib предоставляет возможность проведения тестов с передачей данных. Такой подход позволяет отделить тестовый код от данных, поместив их в отдельное место. Этим местом является слот, который предоставляется для каждого тестирующего слота. Этот слот должен называться так же, как и тестирующий, но с постфиксом _data.


class Test_MyClass : public QObject {
Q_OBJECT
private slots:
    void min_data();
    void max_data();

    void min();
    void max();
};

В тестирующий класс мы ввели два дополнительных слота: min_data() и max_data(), которые будут обеспечивать данными наши тестирующие слоты.

|

void Test_MyClass::min_data()
{
    QTest::addColumn<int>("arg1");
    QTest::addColumn<int>("arg2");
    QTest::addColumn<int>("result");

    QTest::newRow("min_test1") << 25 << 0 << 0;
    QTest::newRow("min_test2") << -12 << -5 << -12;
    QTest::newRow("min_test3") << 2007 << 2007 << 2007;
    QTest::newRow("min_test4") << -12 << 5 << -12;
}

В слоте min_data() необходимо создать таблицу тестовых данных. для задания ее столбцов используется метод QTest: addColumn(). После этого мы добавляем некоторые данные в эту таблицу с помощью метода QTest::newRow(). Строка, переданная в этот метод, является идентификатором строки таблицы. Каждый вызов создаст свою собственную строку, а при помощи оператора « в нее добавятся данные: два параметра и ожидаемый результат применения метода min().


void Test_MyClass::max_data()
{
    QTest::addColumn<int>("arg1");
    QTest::addColumn<int>("arg2");
    QTest::addColumn<int>("result");

    QTest::newRow("max_test1") << 25 << 0 << 25;
    QTest::newRow("max_test2") << -12 << -5 << -5;
    QTest::newRow("max_test3") << 2007 << 2007 << 2007;
    QTest::newRow("max_test4") << -12 << 5 << 5;
}

Реализация слота данных max_data() аналогична слоту min_data(). За исключением иных идентификаторов строк таблицы и некоторых отличий в ожидаемых результатах.


void Test_MyClass::min()
{
    MyClass myClass;
    QFETCH(int, arg1);
    QFETCH(int, arg2);
    QFETCH(int, result);

    QCOMPARE(myClass.min(arg1, arg2), result);
}

Метод данных задает таблицу из четырех строк, поэтому слот min() теперь будет запускаться четыре раза — для каждой строки таблицы данных. Мы используем три макроса QFETCH() для создания локальных переменных arg1, arg2, result и внесения в них данных. Заметьте, имя должно совпадать с именем элемента тестовых данных, а если элемент данных с этим именем будет не найден, то тест завершится с сообщением об ошибке. Теперь для проведения тестов нам нужен только лишь один макрос QCOMPARE(). Такой подход позволяет легко добавлять новые данные для теста без модификации самого теста.


void Test_MyClass::max()
{
    MyClass myClass;
    QFETCH(int, arg1);
    QFETCH(int, arg2);
    QFETCH(int, result);

    QCOMPARE(myClass.max(arg1, arg2), result);
}

Реализация тестового слота max() аналогична реализации слота min() с той разницей, что для проведения теста вызывается метод MyClass::max() вместо метода MyClass::min().

В завершение, мы должны предоставить функцию main () с помощью макроса QTESTMAIN() и включить метаданные, сгенерированные МОС:


QTEST_MAIN(Test_MyClass) 
#include "test.moc"

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