C++ gtest 相关

c++ gtest 代码中实现调用指定case

#include <gtest/gtest.h>

// 定义测试用例 TestSuiteA
TEST(TestSuiteA, TestA1) {
  // 测试逻辑
  ASSERT_EQ(2 + 2, 4);
}

TEST(TestSuiteA, TestA2) {
  // 测试逻辑
  ASSERT_TRUE(true);
}

// 定义测试用例 TestSuiteB
TEST(TestSuiteB, TestB1) {
  // 测试逻辑
  ASSERT_NE(10, 20);
}

TEST(TestSuiteB, TestB2) {
  // 测试逻辑
  std::string str = "Hello";
  ASSERT_EQ(str.length(), 5);
}

int main(int argc, char** argv) {
  // 初始化 Google Test
  ::testing::InitGoogleTest(&argc, argv);

  // 运行所有测试用例
  // RUN_ALL_TESTS();

  // 运行指定的测试用例
  ::testing::GTEST_FLAG(filter) = "TestSuiteB.TestB1"; // 运行 TestSuiteB 中的 TestB1
  // ::testing::GTEST_FLAG(filter) = "TestSuiteA.*";    // 运行 TestSuiteA 中的所有测试用例
  // ::testing::GTEST_FLAG(filter) = "*";               // 运行所有测试用例

  return RUN_ALL_TESTS();
}
 

在上面的示例代码中,我们定义了两个测试套件(TestSuiteA 和 TestSuiteB),每个测试套件包含两个测试用例。在 main 函数中,我们可以通过设置 ::testing::GTEST_FLAG(filter) 的值来选择性地运行特定的测试用例。您可以使用不同的字符串来指定要运行的测试用例,例如 "TestSuiteB.TestB1" 将只运行 TestSuiteB 中的 TestB1, "TestSuiteA.*" 将运行 TestSuiteA 中的所有测试用例, "*" 将运行所有测试用例。

将上述代码编译并运行,它将只运行所选的测试用例。根据需要调整 ::testing::GTEST_FLAG(filter) 的值来选择不同的测试用例运行方式。

在代码中是否可以判断哪些case没有通过

在 Google Test 中,可以通过添加额外的断言来判断哪些测试用例没有通过。如果一个测试用例中的断言失败,测试框架会将其标记为失败,并继续执行后续的测试用例。您可以利用这一特性来记录失败的测试用例。

以下是一个示例,展示如何在代码中判断哪些测试用例没有通过:

#include <gtest/gtest.h>

// 定义测试用例 TestSuiteA
TEST(TestSuiteA, TestA1) {
  // 测试逻辑
  ASSERT_EQ(2 + 2, 4);
}

TEST(TestSuiteA, TestA2) {
  // 测试逻辑
  ASSERT_TRUE(false); // 故意失败的断言
}

// 定义测试用例 TestSuiteB
TEST(TestSuiteB, TestB1) {
  // 测试逻辑
  ASSERT_NE(10, 20);
}

TEST(TestSuiteB, TestB2) {
  // 测试逻辑
  std::string str = "Hello";
  ASSERT_EQ(str.length(), 5);
}

int main(int argc, char** argv) {
  // 初始化 Google Test
  ::testing::InitGoogleTest(&argc, argv);

  // 运行所有测试用例
  int testResult = RUN_ALL_TESTS();

  // 打印失败的测试用例
  ::testing::UnitTest& unitTest = *::testing::UnitTest::GetInstance();
  int failedTestCount = unitTest.failed_test_count();
  if (failedTestCount > 0) {
    std::cout << "以下测试用例没有通过:" << std::endl;
    for (int i = 0; i < unitTest.total_test_case_count(); ++i) {
      ::testing::TestCase* testCase = unitTest.GetTestCase(i);
      for (int j = 0; j < testCase->total_test_count(); ++j) {
        ::testing::TestInfo* testInfo = testCase->GetTestInfo(j);
        if (testInfo->result()->Failed()) {
          std::cout << testCase->name() << "." << testInfo->name() << std::endl;
        }
      }
    }
  } else {
    std::cout << "所有测试用例都通过了!" << std::endl;
  }

  return testResult;
}
 

在上面的示例代码中,我们故意将 TestSuiteA 中的 TestA2 的断言设置为失败。在执行完所有测试用例后,我们通过访问 ::testing::UnitTest 的相关方法来获取失败的测试用例信息,并将其打印出来。

将上述代码编译并运行,它将会输出失败的测试用例名称。在这个示例中,输出将是 TestSuiteA.TestA2,表示 TestA2 没有通过。

请注意,这种方法仅适用于在运行所有测试用例后检查失败的情况。如果您在运行特定的测试用例时就想知道其结果,可以根据返回值来判断测试用例是否通过。返回值为 0 表示所有测试用例都通过,非零值表示有测试用例失败。

详细说说 ::testing::UnitTest 这个类

::testing::UnitTest 是 Google Test 框架中的一个类,用于管理和操作测试单元(test unit)。它提供了一些方法来访问测试用例、测试结果和其他与测试相关的信息。

下面是一些 ::testing::UnitTest 类的常用方法和功能:

  1. int Run():运行所有注册的测试用例,并返回总的测试结果。返回值为 0 表示所有测试用例都通过,非零值表示有测试用例失败。

  2. int failed_test_count():获取失败的测试用例数量。

  3. int total_test_case_count():获取注册的测试用例总数。

  4. ::testing::TestCase* GetTestCase(int i):获取指定索引 i 处的测试用例对象。

  5. int test_case_count():获取已注册的测试用例数量。

  6. ::testing::TestCase* GetTestCase(const char* name):根据测试用例的名称获取测试用例对象。

  7. ::testing::TestResult* current_test_result():获取当前测试用例的测试结果对象。

  8. bool ad_hoc_test_result():如果当前正在执行的测试用例是特殊的手动执行用例,则返回 true

  9. bool Passed():如果所有注册的测试用例都通过了,返回 true

通过这些方法,您可以在代码中访问测试用例、测试结果和其他相关信息,以进行自定义的操作和判断。

请注意,::testing::UnitTest 是一个单例(singleton)类,可以通过 ::testing::UnitTest::GetInstance() 方法获取其唯一的实例。

示例代码中的一部分代码就是利用了 ::testing::UnitTest 的方法来获取失败的测试用例信息并打印出来,以及检查所有测试用例是否通过。

代码实现只运行其中两个case

如果您只想运行其中两个测试用例,您可以使用 Google Test 的过滤器功能来选择性地运行这些测试用例。您可以通过在命令行参数或代码中设置 ::testing::GTEST_FLAG(filter) 的值来指定要运行的测试用例。

以下是一个示例,展示如何在代码中实现只运行其中两个测试用例:

#include <gtest/gtest.h>

// 定义测试用例 TestSuiteA
TEST(TestSuiteA, TestA1) {
  // 测试逻辑
  ASSERT_EQ(2 + 2, 4);
}

TEST(TestSuiteA, TestA2) {
  // 测试逻辑
  ASSERT_TRUE(true);
}

// 定义测试用例 TestSuiteB
TEST(TestSuiteB, TestB1) {
  // 测试逻辑
  ASSERT_NE(10, 20);
}

TEST(TestSuiteB, TestB2) {
  // 测试逻辑
  std::string str = "Hello";
  ASSERT_EQ(str.length(), 5);
}

int main(int argc, char** argv) {
  // 初始化 Google Test
  ::testing::InitGoogleTest(&argc, argv);

  // 运行指定的测试用例
  ::testing::GTEST_FLAG(filter) = "TestSuiteA.TestA1:TestSuiteB.TestB1";
  // 可以通过冒号分隔多个测试用例,例如:TestSuiteA.TestA1:TestSuiteB.TestB1:TestSuiteB.TestB2

  return RUN_ALL_TESTS();
}

在上面的示例代码中,我们将 ::testing::GTEST_FLAG(filter) 的值设置为 "TestSuiteA.TestA1:TestSuiteB.TestB1",这意味着我们只运行 TestSuiteA 中的 TestA1 和 TestSuiteB 中的 TestB1 两个测试用例。您可以根据需要修改这个值,指定要运行的测试用例。

将上述代码编译并运行,它将只运行您指定的这两个测试用例。其他的测试用例将被忽略。

如何一个一个的测试单独的case

如果您想逐个运行独立的测试用例,可以使用 ::testing::TestSuite 类和 ::testing::TestInfo 类提供的方法来获取和运行单个测试用例。

以下是一个示例,展示如何逐个运行独立的测试用例:

#include <gtest/gtest.h>

// 定义测试用例 TestSuiteA
TEST(TestSuiteA, TestA1) {
  // 测试逻辑
  ASSERT_EQ(2 + 2, 4);
}

TEST(TestSuiteA, TestA2) {
  // 测试逻辑
  ASSERT_TRUE(true);
}

// 定义测试用例 TestSuiteB
TEST(TestSuiteB, TestB1) {
  // 测试逻辑
  ASSERT_NE(10, 20);
}

TEST(TestSuiteB, TestB2) {
  // 测试逻辑
  std::string str = "Hello";
  ASSERT_EQ(str.length(), 5);
}

int main(int argc, char** argv) {
  // 初始化 Google Test
  ::testing::InitGoogleTest(&argc, argv);

  // 获取 TestSuiteA 中的 TestA1 测试用例
  ::testing::TestSuite* suiteA = ::testing::UnitTest::GetInstance()->GetTestSuite("TestSuiteA");
  ::testing::TestInfo* testA1 = suiteA->GetTestInfo(0);

  // 运行 TestA1 测试用例
  ::testing::UnitTest::GetInstance()->RunTestOnTestCase(testA1->test_suite(), testA1);

  // 获取 TestSuiteB 中的 TestB2 测试用例
  ::testing::TestSuite* suiteB = ::testing::UnitTest::GetInstance()->GetTestSuite("TestSuiteB");
  ::testing::TestInfo* testB2 = suiteB->GetTestInfo(1);

  // 运行 TestB2 测试用例
  ::testing::UnitTest::GetInstance()->RunTestOnTestCase(testB2->test_suite(), testB2);

  return 0;
}
 

在上面的示例代码中,我们首先通过 ::testing::UnitTest::GetInstance()->GetTestSuite("TestSuiteA") 获取 TestSuiteA 对象,然后使用 GetTestInfo(0) 获取 TestA1 的测试用例对象。类似地,我们通过 GetTestSuite("TestSuiteB") 获取 TestSuiteB 对象,并使用 GetTestInfo(1) 获取 TestB2 的测试用例对象。

然后,我们可以使用 ::testing::UnitTest::GetInstance()->RunTestOnTestCase(test_suite, test_case) 方法来运行单个测试用例。在这里,我们分别运行了 TestA1 和 TestB2 两个测试用例。

请注意,通过这种方式运行的测试用例将不会获得 Google Test 框架提供的丰富的报告和结果输出。这种方法适用于需要以编程方式控制测试用例运行的特殊情况。如果您希望获得完整的报告和结果输出,建议使用常规的运行方式,如 RUN_ALL_TESTS()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值