如何在 Googletest 中运行两个不同的测试

Posted

技术标签:

【中文标题】如何在 Googletest 中运行两个不同的测试【英文标题】:How to run two different tests in Googletest 【发布时间】:2012-08-27 10:54:45 【问题描述】:

假设我有两个/许多不同的测试需要在两次迭代中在 gtest 中进行。 那么,如何进行相同的操作呢?我尝试了我的方法,但失败了。 我写了,

::testing::GTEST_FLAG(repeat) = 2; //may be 2 or 3 or so on...
switch(i) //int i = 1;

case 1:
::testing::GTEST_FLAG(filter) = "*first*:*second*";
i++; break;
case 2:
::testing::GTEST_FLAG(filter) = "*third*:*fourth*";
i++; break;
and so on............

但是 Google 测试只使用了 "*first*:*second*" 并运行了两次。 请帮我。我的要求是 Gtest 应该一个一个地运行所有的测试用例。 例如首先它将执行case 1: 然后case 2: 等等......

【问题讨论】:

【参考方案1】:

我认为你不能使用 ::testing::GTEST_FLAG(repeat) 来做到这一点

但是,您可以通过以下方式实现目标:

#include "gtest/gtest.h"

int RunTests(int iteration) 
  switch(iteration) 
    case 1:  ::testing::GTEST_FLAG(filter) = "*first*:*second*"; break;
    case 2:  ::testing::GTEST_FLAG(filter) = "*third*:*fourth*"; break;
    default: ::testing::GTEST_FLAG(filter) = "*";
  
  return RUN_ALL_TESTS();


int main(int argc, char **argv) 
  ::testing::InitGoogleTest(&argc, argv);
  int final_result(0);
  for (int i(0); i < 3; ++i) 
    int result(RunTests(i));
    if (result != 0)
      final_result = result;
  
  return final_result;

我不确定gtest在使用GTEST_FLAG(repeat)时如何计算RUN_ALL_TESTS()的返回值,但这里main会在所有测试通过时返回0,否则返回最后一个非零值RUN_ALL_TESTS() 调用次数。

【讨论】:

:- 感谢您的大力帮助。但是当control 看到InitGoogletest 没有任何preconditions(如过滤器)时,它开始运行所有测试用例,然后进入过滤的测试用例。我找到了解决方案。请看下面。 @RasmiRanjanNayak 很高兴您得到了解决方案。尽管InitGoogleTest 并没有完全按照您的想法行事。它仅在您第一次调用时才有效 - 所有后续调用都是无操作的。您可以安全地将其移至答案中的 for 循环之前。在我的回答中,您第一次没有过滤器,因为我从 0 而不是 1 开始循环,并且没有case 0,所以它使用default 的情况,即"*" :-是的,你是对的。我在for 循环之前做了同样的事情,把InitGoogleTest 放在了前面,一切都很好。但是有一个问题,将InitGoogleTest 保持在for 循环内部和之前有什么区别(除了init-ing GoogleTest 多次直到条件失败)? @RasmiRanjanNayak 拨打InitGoogleTest 多少次都没有问题。它只会在你第一次调用它时“做”一些事情。之后的每一次,它所做的只是检查它之前是否被调用过,如果是则立即返回而不做任何进一步的事情。【参考方案2】:
int main(int argc, char **argv) 
    int i = 1;
        vector<string> str;
        str.push_back("*first*:*second*");
        str.push_back("*third*:*fourth*");
        str.push_back("*fifth.fifthtestname*");
        for(i = 0; i != str.size(); i++)
        
            ::testing::GTEST_FLAG(filter) = str.at(i);
             InitGoogleTest(&argc, argv);
             RUN_ALL_TESTS();
            // getchar();
        
        getchar();

【讨论】:

以上是关于如何在 Googletest 中运行两个不同的测试的主要内容,如果未能解决你的问题,请参考以下文章

GoogleTest中gMock的使用

vstest 未获取 googletest 可执行文件中的单元测试

GoogleTest(Fatal assertion)-5

如何使用 googletest 捕获标准输出/标准错误?

一文掌握谷歌 C++ 单元测试框架 GoogleTest

一文掌握谷歌 C++ 单元测试框架 GoogleTest