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
类的常用方法和功能:
-
int Run()
:运行所有注册的测试用例,并返回总的测试结果。返回值为 0 表示所有测试用例都通过,非零值表示有测试用例失败。 -
int failed_test_count()
:获取失败的测试用例数量。 -
int total_test_case_count()
:获取注册的测试用例总数。 -
::testing::TestCase* GetTestCase(int i)
:获取指定索引i
处的测试用例对象。 -
int test_case_count()
:获取已注册的测试用例数量。 -
::testing::TestCase* GetTestCase(const char* name)
:根据测试用例的名称获取测试用例对象。 -
::testing::TestResult* current_test_result()
:获取当前测试用例的测试结果对象。 -
bool ad_hoc_test_result()
:如果当前正在执行的测试用例是特殊的手动执行用例,则返回true
。 -
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()
。