Повторное тестирование данных в Qt - PullRequest
0 голосов
/ 05 июня 2019

Могу ли я заставить 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 Ответ

0 голосов
/ 05 июня 2019

Этот трюк заключается в повторном вызове предыдущего кода в контексте, который 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;
}
...