2

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

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

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

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;
}

我发现这是一个好主意,但是,有一个问题。Qt 的文档qExec一部分听起来像这样:

对于独立测试应用程序,不应多次调用此函数,因为用于将测试输出记录到文件和执行单个测试函数的命令行选项将无法正确运行。

这些人透露的解决方案只是建议:执行qExec多次。谁能向我解释到底是command-line options for logging test output to files and executing individual test functions will not behave correctly什么意思?

这种方法究竟会出现什么问题?

4

1 回答 1

3

该文档可能正在谈论Logging Options。如果您调用qMain两次并将-o选项传递给两个调用,则第二次调用可能会覆盖第一次调用的日志文件。如果您知道这永远不会发生,您可能会选择忽略警告。您也不能将命令行参数传递给 qExec,这样您将强制输出到标准输出,但您当然无法传递其他参数。

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

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

于 2017-09-24T20:49:19.067 回答