【问题标题】:Qt: run unit tests from multiple test classes and summarize the output from all of themQt:从多个测试类运行单元测试并汇总所有测试类的输出
【发布时间】:2015-09-09 04:05:38
【问题描述】:

Qt 自带QTest,还有一些文档:比如an official tutorial

但是,QTest 鼓励您将单元测试组织为单独的可执行文件。为此有一个特殊的宏,它会生成 main(): QTEST_MAIN()

说实话,我真的不喜欢这种方法:通常,一次运行所有测试会更有用,以确保最近的更改没有破坏任何东西。 有时,屏蔽某些测试或执行某些单独的测试很有用,但这是一个例外,而不是规则。

所以,我想一次运行所有测试。好的,我可以编写自己的 main() 来执行我想要的所有测试,比如:

int main(int argc, char **argv)
{
   int status = 0;

   //-- run all tests
   {
      TestHTCodecISO14230 tc;
      status |= QTest::qExec(&tc, argc, argv);
   }

   {
      TestHTDataMsg tc;
      status |= QTest::qExec(&tc, argc, argv);
   }

   return status;
}

它确实运行所有测试,但问题是我没有所有测试的方便摘要。比如说,对于上面的两个测试,我有两个单独的总结:

********* Start testing of TestHTCodecISO14230 *********
Config: Using QtTest library 5.4.1, Qt 5.4.1 (i386-little_endian-ilp32 shared (dynamic) release build; by GCC 4.6.1)
PASS   : TestHTCodecISO14230::initTestCase()
PASS   : TestHTCodecISO14230::decode_summary()
PASS   : TestHTCodecISO14230::encode()
PASS   : TestHTCodecISO14230::decode_encoded()
PASS   : TestHTCodecISO14230::cleanupTestCase()
Totals: 5 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestHTCodecISO14230 *********
********* Start testing of TestHTDataMsg *********
Config: Using QtTest library 5.4.1, Qt 5.4.1 (i386-little_endian-ilp32 shared (dynamic) release build; by GCC 4.6.1)
PASS   : TestHTDataMsg::initTestCase()
PASS   : TestHTDataMsg::test1()
PASS   : TestHTDataMsg::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped, 0 blacklisted
********* Finished testing of TestHTDataMsg *********

如果出现错误,返回的status 将是非零的事实肯定会有所帮助,但如果我也有摘要会更有帮助:

Totals: 8 passed, 0 failed, 0 skipped, 0 blacklisted

据我所知,这是不可能的:我找不到以编程方式获取通过、失败、跳过和列入黑名单的测试数量的方法:qExec() 只是QTest 命名空间中的一个函数,所以,它执行后无法收集一些额外的信息。

嗯,可以解析输出字符串,但是,呃……

对我来说,这看起来像是糟糕的设计。将QTest 作为一个类可能会好得多,然后创建它的实例并向它提供一些测试类。然后,可以从实例中收集一些额外的信息。

或者,也许我错过了什么。

那么,问题是:QTest 是否有可能获得所有单元测试类的摘要输出?

【问题讨论】:

  • 不是TestHTCodecISO14230TestHTDataMsg 你的课吗?为什么不能扩展它们来处理失败的测试计数?

标签: c++ qt unit-testing qttest


【解决方案1】:

正如我在评论中所写,我将按以下方式构建我的测试类:

class MyTests: public QObject
{
    Q_OBJECT
public:
    MyTests() : m_executed(0), m_failed(0)
private slots:
    [..]
    // This function will be called after each test
    void cleanup()
    {
        m_executed++;
        if (currentTestFailed()) {
            m_failed++;
        }        
    }

    // Output the summary of the test execution.
    void report() const
    {
        qDebug() << "Totals:"
                 << m_executed - m_failed  << "passed,"
                 << m_failed << "failed";
    }
private:
    int m_executed;
    int m_failed;
};

如果您有多个MyTests 类的实例,您可以扩展其API 并将执行结果汇总生成全局测试执行报告。只需使用 C++ 类的全部优势。

【讨论】:

  • 谢谢你的回答,但是我将无法使用QCOMPARE()宏和朋友;我将不得不以某种方式重新发明它们。我会努力的。
  • @DmitryFrank,但为什么不能使用 QCOMPARE()?请解释一下。
  • @vahancho 你将如何实现 currenttestfailed() ?
  • @Moia,你是什么意思?你不需要实现它。它是QTest 类的一部分。执行测试后,您可以检查它是否失败。
  • @vahancho 我的错,我以为是用户定义的类,我不知道这是一个 QTest 方法
猜你喜欢
  • 2011-02-10
  • 2013-07-29
  • 2015-09-05
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多