首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt:从多个测试类运行单元测试,并总结所有测试类的输出

Qt:从多个测试类运行单元测试,并总结所有测试类的输出
EN

Stack Overflow用户
提问于 2015-06-23 11:20:59
回答 1查看 3.1K关注 0票数 15

Qt附带了QTest,并且有一些文档:例如,正式的教程

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

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

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

代码语言:javascript
运行
复制
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;
}

它确实运行了所有的测试,但问题是我没有所有测试的方便摘要。例如,对于上述两项测试,我有两个单独的摘要:

代码语言:javascript
运行
复制
********* 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将是非零的,这当然是有帮助的,但是如果我有总结的话,这将是更有帮助的:

代码语言:javascript
运行
复制
Totals: 8 passed, 0 failed, 0 skipped, 0 blacklisted

据我所见,这是不可能的:我无法以编程的方式获得通过、失败、跳过和黑名单的测试的数量:qExec()只是QTest命名空间中的一个函数,所以在执行之后不可能收集其他信息。

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

在我看来,它的设计很差。最好将QTest作为一个类,然后制作它的实例并将一些测试类提供给它。然后,可以从实例中收集一些额外的信息。

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

因此,问题是:使用QTest可以对所有单元测试类进行摘要输出吗?

EN

回答 1

Stack Overflow用户

发布于 2015-06-23 12:45:48

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

代码语言:javascript
运行
复制
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++类的全部强度即可。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31001398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档