在QTests中分离数据和测试设置

时间:2017-03-24 19:10:08

标签: qt unit-testing

在使用QTest创建测试时,我目前正在使用以下模式。

  1. 每个生产类别一个测试类。
  2. 如果一个班级有一些全球性的'设置每次运行测试类多次。
  3. 每个生产类方法都有一种测试方法。
  4. 每种测试方法都有_data方法。
  5. 每个_data方法都会指定要使用的设置数据,并为案例命名。
  6. 这最后一点让我感到困扰,因为我不仅仅传递数据,还传递用于初始化特定测试的数据。有时它看起来很奇怪,即使我的测试很短,但由于初始化逻辑,它们并不是那么直观。

    我所知道的替代模式是根据初始化需求拆分每个测试方法(违反我的规则#3)。一方面它会消除很多_data测试方法,但它也会使测试类更大,不再容易与生产类相关(命名虽然有帮助)。大多数谷歌测试都是这样写的。

    另一种选择是使用对象的全局状态,就像我对待全局设置一样。如果对象有效或无效,则它不会是每个_data方法的一部分,而是设置将在任一配置中运行的测试类。

    我主要担心的是可维护性。根据我目前的方法,我有时很难理解我传递给测试的设置的细微差别,我需要一些合理的方法将它们分开,而不是让它自己负担得更多。

1 个答案:

答案 0 :(得分:1)

对于全局设置,您多次运行测试类,因此IMHO对本地设置执行相同操作并不会“违反”您的规则#3,它更像是规则#2的扩展。

或者,您可以将初始化例程作为测试数据的一部分。

这样的东西
private slots:
    void someMethodTest_data()
    {
        QTest::addColumn<QByteArray>("settings");
        //....
        QTest::addRow("case1") << "settings1" << ....
    }

    void someMethodTest()
    {
        Q_FETCH(QByteArray, settings);

        const QByteArray initMethod = QTest::currentTestFuntion() + "_init_" + settings;
        QMetaObject::invokeMethod(this, initMethod.constData(), Qt::DirectConnect);

        // commence test 
    }

protected slots:
    void someMethodTest_init_settings1();