0

我可以让 QTest 多次使用单个数据驱动集吗?


我们在项目中使用 Qt 的 QTest 框架进行低级测试,并在有意义的地方使用数据驱动风格。

我已经到了一个地步,我想对一组测试数据进行几组不同的测试。明显的设计是

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

4

1 回答 1

0

这个技巧是在 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;
}
于 2019-06-04T22:21:44.227 回答