Тесты с передачей данных
Оглавление
- Проведение тестов в Qt
- Создание тестов в Qt
- Тесты с передачей данных
- Создание тестов графического интерфейса
До настоящего момента мы вписывали данные для проведения теста в макрос 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"
Читать далее: Создание тестов графического интерфейса