使用gtest框架在运行时以编程方式确定重复的测试子集

时间:2015-11-13 17:55:52

标签: c++ unit-testing googletest

这是正确的原因,但为了清楚起见:我创建了一个TimeMonitor事件监听器,在测试结束时将经过的时间与策略进行比较,如果测试时间更长,则会失败。

它有一个很好的例外 - 系统有时会进入奇怪的状态,有些测试可能需要更长的时间。注意我的单元测试栏是15ms - 它不是很难发生。

之前我有这个,我解决它的方法是创建一个记录,等到相同的测试超过它们几次,然后才能失败。这有几个流程 - 主要的流程 - 需要持久保存数据。

我认为如果我只做两次(或更多次)传球会更好。在第一次通过时,我收集超过他们时间的测试,并在2-N通过时重复它们以确认或拒绝该问题。

我的问题是 - 如何。我需要做什么(如果可能的话)以编程方式收集测试的子集并重新运行它们。我是否需要从format='%(levelname)s - %(message)s'删除测试,或者我应该创建另一个UnitTest。

对类似内容的引用会很棒,例如重试失败的测试。

2 个答案:

答案 0 :(得分:0)

我知道以下内容并未直接回答您的问题,但我相信对不同方法的建议是合理的。我建议从单独的进程进行测试执行时间分析,以简化操作并避免更改运行测试的程序。这样,您可以通过插入追踪执行时间超过您定义的阈值的测试的附加代码来确定您没有影响测试的执行时间。此外,您不需要修改UnitTest个对象的状态以及googletest实现的其他详细信息,这些信息难以理解并且可能存在危险。

运行测试套件的可执行文件的输出已经为每个测试提供了执行时间。编写一个运行测试套件可执行文件的脚本,然后解析该输出以确定哪些测试执行时间太长(这可以通过Python等更高级别的语言轻松实现)。然后,如果脚本找到了一些可疑的测试,它会通过为其指定--gtest_filter命令行参数来重新运行测试套件可执行文件2-N次。例如:

tests.exe --gtest_filter=*test1*:*test2*:...:*testN*

这样,只会重新运行可疑测试,您将能够确定其中是否确实存在问题。

如果您不想使用googletest提供的值,则可以修改TimeMonitor以输出测试执行时间并解析这些值。但是,也许最好将其删除并100%确定您不会影响测试的执行时间。

希望这有帮助!

答案 1 :(得分:0)

解决方案实际上很简单(当你知道它时)。免责声明未针对所有可能的角落案例进行测试。

伪代码中的

time monitor -> just observe and create a filter for the long tests
attach time monitor

testing::InitGoogleTest(&argc, argv);
int result = RUN_ALL_TESTS();

if (result == 0 && time_monitor->has too long tests()) {
    time monitor -> activate reporting errors
    ::testing::GTEST_FLAG(filter) =  time monitor -> the filter();
    result = RUN_ALL_TESTS();
}