c++ - 如何在测试系统中自动注册测试用例?

标签 c++ function unit-testing googletest

通常在测试系统中,当我们编写一个新的测试用例时,我们需要在某个地方注册测试用例,以便可以调用它。

例如在测试系统中: TESTCASE(a,b){...} 可以映射到 void testcase_a_b() {...} 并且测试系统可以调用这些 void testcase_a_b(), void testcase_c_d() 等从 main 运行所有测试用例。

在可执行文件中自动注册测试用例的方法是什么?例如,在 Google Test 中(就像其他几个测试框架一样),如果我们调用 RUN_ALL_TESTS() 它会自动执行所有以 TEST(a,b) 等开头的声明. 在可执行文件中。

Google Test 如何知道 exe 中存在 TEST(a,b)?我试图理解(从高级设计的角度)什么是用 C++ 实现类似系统的简单方法。其中像 TEST(a,b) 这样的宏会自动将其自身附加到有效测试用例列表中,以便它可以从 main 运行而不必担心单独注册它。

最佳答案

通常这是通过创建全局对象来完成的,全局对象在构造时调用注册方法。这违背了 C++ 中普遍认为的“良好实践”(请参阅​​ https://isocpp.org/wiki/faq/ctors#static-init-order ),因此在尝试此类实现之前,您应该非常精通这些问题。

无论如何,这是 googletest 使用的方法 - TEST 预处理器宏最终归结为这个 (gtest-internal.h):

// Helper macro for defining tests.
#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
 public:\
  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
 private:\
  virtual void TestBody();\
  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
};\
\
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
  ::test_info_ =\
    ::testing::internal::MakeAndRegisterTestInfo(\
        #test_case_name, #test_name, NULL, NULL, \
        (parent_id), \
        parent_class::SetUpTestCase, \
        parent_class::TearDownTestCase, \
        new ::testing::internal::TestFactoryImpl<\
            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()

因此,当您使用此宏时,将调用 ::testing::internal::MakeAndRegisterTestInfo 的类的全局实例,其参数对应于测试用例。

关于c++ - 如何在测试系统中自动注册测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34775254/

相关文章:

asp.net - 如何在单元测试中使用Redis?

java - 单元测试类样式

sql - 如何测试 SQL "CREATE TABLE"语句是否等效于现有表?

c++ - 哪种屏幕键盘适用于触摸屏应用程序?

c++ - 如何确保正则表达式仅在特定字符后匹配

c++ - 使用 C++ 的 exp 函数

function - 在 Angular 指令内调用函数并在参数中注入(inject)事件

function - 函数中的空参数不为 Null

c++ - 在 Excel VBA 中使用 C++ DLL

c++ - 函数本地静态函数为Windows XP生成错误代码