Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中自动注册单元测试_C_Unit Testing - Fatal编程技术网

在C语言中自动注册单元测试

在C语言中自动注册单元测试,c,unit-testing,C,Unit Testing,考虑以下运行单元测试的最小框架: #include <stdio.h> #define TEST(name) int test_##name() #define RUN_TEST(name) \ do {printf("%s\t%s\n", #name, test_##name() ? "OK" : "FAIL");} while(0) #define ASSERT_EQ(left, right) \ do {return (left) == (right);} w

考虑以下运行单元测试的最小框架:

#include <stdio.h>

#define TEST(name) int test_##name()
#define RUN_TEST(name) \
    do {printf("%s\t%s\n", #name, test_##name() ? "OK" : "FAIL");} while(0)
#define ASSERT_EQ(left, right) \
    do {return (left) == (right);} while(0)

TEST(addition) {
    ASSERT_EQ(1 + 2, 3);
}

TEST(mult_fail) {
    ASSERT_EQ(42, 6 * 9);
}

int main() {
    RUN_TEST(addition);
    RUN_TEST(mult_fail);
}
如何使测试宏自动注册测试?我希望主函数包含一个RUN_ALL_TESTS语句,而不必按名称引用所有测试


我知道这很容易在C++中完成,但是我更希望看到一个纯C解决方案。

< P>有一种奇特的方法来枚举可执行文件中的函数(纯C中的“反射”)或在特殊数据段中的函数指针的巧妙放置等等。
一个常见的建议是不要重新发明轮子。谷歌现有的单元测试框架,选择一个,使用它,享受

因为您是从基于宏的方法开始的,所以您可能对围绕X宏构建的解决方案感兴趣。这可能有点难看,也有点特殊,但它可以做你想要的:

#include <stdio.h>

// Test definitions
#define TESTS \
  X(addition,  ASSERT_EQ(1 + 2, 3) ) \
  X(mult_fail, ASSERT_EQ(42, 6 * 9))

// Helper macros    
#define ASSERT_EQ(left, right) \
    do {return (left) == (right);} while(0)

// declare test functions
#define X(name, body) int test_##name(void) { body; }
TESTS
#undef X

int main(void) {
    // run tests
    #define X(name, ignored) \
      printf("%s\t%s\n", #name, test_##name() ? "OK" : "FAIL");
    TESTS
    #undef X
}
#包括
//测试定义
#定义测试\
X(加法,断言式(1+2,3))\
X(多重失败,断言等式(42,6*9))
//辅助宏
#定义断言均衡(左、右)\
do{return(left)==(right);}while(0)
//声明测试函数
#定义X(名称,正文)int test_##name(void){body;}
测验
#未定义X
内部主(空){
//运行测试
#定义X(名称,忽略)\
printf(“%s\t%s\n”),#名称,test##name()?“确定”:“失败”);
测验
#未定义X
}

要添加、删除或修改测试,只需修改宏
测试的定义
;预处理器从中生成所需的所有其他内容。

使
TEST
宏也将函数指针添加到一些全局函数指针数组中。然后让
运行所有测试来迭代该数组。@EugeneSh。我不相信你的建议在C语言中不使用任何扩展是可能的。无法在主函数之前运行代码,因此无法将函数指针添加到数组。但是,C++中可能是因为构造函数可以在main之前运行。哦,我已经开始根据这个建议写一个答案,并且得到了一个几乎所有的例子。几乎是因为在迭代时无法获得测试的名称。但是,如果将名称作为参数传递给单元测试函数,则可以实现此功能。不幸的是,我在中间分心了,现在我离开了那个电脑……轮子是怎么工作的,这个网站是怎么回事!这不是一般的建议
#include <stdio.h>

// Test definitions
#define TESTS \
  X(addition,  ASSERT_EQ(1 + 2, 3) ) \
  X(mult_fail, ASSERT_EQ(42, 6 * 9))

// Helper macros    
#define ASSERT_EQ(left, right) \
    do {return (left) == (right);} while(0)

// declare test functions
#define X(name, body) int test_##name(void) { body; }
TESTS
#undef X

int main(void) {
    // run tests
    #define X(name, ignored) \
      printf("%s\t%s\n", #name, test_##name() ? "OK" : "FAIL");
    TESTS
    #undef X
}