使用qExec创建Qt测试套件

时间:2017-09-22 14:50:21

标签: c++ qt unit-testing qt5 qttest

QTest鼓励您将单元测试组织为单独的可执行文件。有一个特殊的宏,它生成主函数:QTEST_MAIN

我发现这种方法不是很干净,一次运行所有测试更有用。所以我搜索了是否有可能这样做,我找到了一些人提出相同的解决方案:

Qt: run unit tests from multiple test classes and summarize the output from all of them

http://www.davideling.it/2014/01/qtest-multiple-unit-test-classes/

https://alexhuszagh.github.io/2016/using-qttest-effectively/

解决方案是放弃使用QTEST_MAIN宏并编写自己的main函数,在其中执行要执行的测试:

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

   {
       TestA ta;
       status |= QTest::qExec(&ta, argc, argv);
   }

   {
       TestB tb;
       status |= QTest::qExec(&tb, argc, argv);
   }

   return status;
}

我觉得这是一个好主意,然而,有一个问题。 qExec的{​​{3}}有一个听起来像这样的部分:

  

对于独立测试应用程序,不应调用此函数   不止一次,作为记录测试输出的命令行选项   文件和执行单个测试功能不会表现   正确。

这些人所揭示的解决方案恰恰表明:不止一次执行qExec。任何人都可以向我解释究竟command-line options for logging test output to files and executing individual test functions will not behave correctly到底是什么意思吗?

这种做法究竟出了什么问题?

1 个答案:

答案 0 :(得分:1)

文档可能正在讨论Logging Options。如果您拨打qMain两次并将-o选项传递给两个呼叫,则第二个呼叫可能会覆盖第一个呼叫的日志文件。如果您知道这种情况永远不会发生,您可以选择忽略该警告。你也不能将命令行参数传递给qExec,这样你就会强制输出到stdout,但是当然你也失去了传递其他参数的能力。

如果你想从Qt Creator运行测试用例,你也不应该多次调用qExec。每个测试类都将显示在测试列表中,但运行一个测试类将只运行all,因此您可以获得为一个类显示的每个类的结果。如果你运行所有测试(默认值),你会获得平方数量的结果。

因此,如果您不喜欢多种可执行方法,请使用Google Test。它没有上述问题,创建者提供了支持。设置非常简单:创建自动测试项目时,向导将指导您。您唯一需要做的就是下载Google Test。 Google测试用例将显示在测试视图中的Qt测试用例旁边。