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
    评论
Google Mock是Google的一个开源C++单元测试框架,它是Google Test的一部分。它提供了一种方便的方式来创建和使用模拟对象,以便在单元测试中模拟和验证对象的行为。\[1\] 使用Google Mock的好处是它简化了模拟对象的创建和使用过程。只需包含"gtest/gtest.h"和"gmock/gmock.h"头文件,就可以开始使用Google Mock。此外,Google Mock还提供了强大的功能,例如模拟函数的返回值和参数,设置模拟对象的行为等等。\[1\] 下面是一个简单的C++示例,展示了如何使用Google Mock进行单元测试和模拟对象的创建: ```cpp #include <iostream> #include "gtest/gtest.h" #include <mockcpp/mockcpp.hpp> #include "frame/frame.h" inline unsigned int mok_sleep(unsigned int seconds) { std::cout << "running mok_sleep" << std::endl; } class FooEnvironment : public testing::Environment { public: void SetUp() override { MOCKER(sleep).stubs().will(invoke(mok_sleep)); } void TearDown() { } }; TEST(TestAdd, TestCase1) { EXPECT_EQ(5, Frameuitl::add(2, 3)); } TEST(TestAdd, TestCase2) { EXPECT_EQ(5, Frameuitl::add(2, 3)); } int main(int argc, char **argv) { std::cout << "gtest begin.." << std::endl; testing::AddGlobalTestEnvironment(new FooEnvironment()); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ``` 通过使用gcov和lcov工具,可以查看代码的覆盖率情况。\[2\] 需要注意的是,Google Test中也有Google Mock,但是Google Mock只能用于模拟对象的函数,不能用于模拟C代码中的一般函数。如果需要模拟C代码中的函数,可以使用mockcpp框架。mockcpp是一个用于C++的轻量级模拟框架,可以模拟C代码中的函数。\[3\] 希望以上信息对您有帮助。 #### 引用[.reference_title] - *1* [C++类对象单元测试中的Mock使用](https://blog.csdn.net/qq_34799070/article/details/123434906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [基于gtest、mockcpp写C++LLT测试入门级教程](https://blog.csdn.net/qq_43003442/article/details/115706665)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值