Повторное тестирование данных в Qt
Могу ли я заставить QTest использовать один набор данных более одного раза?
Мы используем инфраструктуру Qtest Qt для низкоуровневых тестов в проекте и используем стиль, управляемый данными, где это имеет смысл.
Я пришел к тому, что хочу провести несколько отдельных наборов тестов на одном наборе тестовых данных. Очевидный дизайн
void testcalss::teststuff_data()
{
QTest::addColumn<int>("number");
QTest::addColumn<double>("size");
QTest::newRow("first") << 1 << 3.14;
QTest::newRow("second") << 42 << 2.718;
}
void testclass::teststuff()
{
QFETCH(int, number);
QFETCH(double, value);
// Test one thing about this stuff
QCOMPARE( f(number), value ); // <=== If it fails here ...
// test some other thing
QCOMPARE( g(number), h(value)); // <=== ... it doesn't even try this
}
Более или менее прямо из документации, верно?
Но небольшое раздражение - это способ сократить последующие тесты, если ранний провал (примечания в комментариях). Иногда это желаемое поведение, а иногда нет, но сейчас я хочу попробовать второй тест, даже если первый не пройден.
Возможная альтернативная схема реализации
void testcalss::teststuff_data()
{
QTest::addColumn<int>("number");
QTest::addColumn<double>("size");
QTest::newRow("first") << 1 << 3.14;
QTest::newRow("second") << 42 << 2.718;
}
void testclass::teststuff()
{
QFETCH(int, number);
QFETCH(double, value);
QCOMPARE( f(number), value );
}
void testclass::teststuff2()
{
QFETCH(int, number); // <=== No data!
QFETCH(double, value);
QCOMPARE( g(number), h(value));
}
но, конечно же, вклад от teststuff_data()
к тому времени уже было израсходовано teststuff2
начинается.
1 ответ
Этот трюк заключается в повторном вызове предыдущего кода в контексте, который Qt распознает как настройку некоторых данных. Новый _data
метод, который просто вызывает старый, не требует дублирования кода.
void testcalss::teststuff_data()
{
QTest::addColumn<int>("number");
QTest::addColumn<double>("size");
QTest::newRow("first") << 1 << 3.14;
QTest::newRow("second") << 42 << 2.718;
}
void testclass::teststuff()
{
QFETCH(int, number);
QFETCH(double, value);
QCOMPARE( f(number), value );
}
void testclass::teststuff2_data() // <=== define a _data method that ...
{
teststuff_data(); // <=== ... re-runs the previous set-up
}
void testclass::teststuff2()
{
QFETCH(int, number);
QFETCH(double, value);
QCOMPARE( g(number), h(value));
}
Как обычно, тестовая среда чувствительна к порядку объявления метода, поэтому заголовок должен выглядеть следующим образом
class testclass: public QObject
{
Q_OBJECT
// c'tor and what not ...
private slots:
void teststuff_data();
void teststuff;
void teststuff2_data();
void teststuff2;
}