为实现我的一个程序的单元测试,我添加了一个makefile规则,以在运行“ make check”时将程序构建为静态库。我用 #ifndef TEST_LIB 和 #endif ( TEST_LIB 作为库构建时已定义)包装main()。
然后我创建了一些小的C文件来测试该库中的某些功能。
库中的某些函数是静态声明的。
当我尝试编译测试时,您可能会猜出这样的警告:
/../ test / config_test.c:15:3:警告:函数“ realize_home”的隐式声明[-Wimplicit-function-declaration]
因为 realize_home 是在程序的源代码(.c文件)中静态声明的。
我尝试的一种解决方案是#include config_rmw.c(包含静态函数)到.c单元文件(config_test)中。即使config_rmw.c已内置在库中,该命令实际上仍然有效,并且在编译时不会给我任何警告。
我想到的另一种解决方案是
#ifndef TEST_LIB
static
#endif
void function()
{
definition
}
并将原型添加到标头中,即#ifdef语句。
#ifdef TEST_LIB
function prototype
#endif
但是这样做并不完全正确,尤其是当我继续实施更多的单元测试时,如果必须对更多的功能执行此操作。
我最近在书中读到,静态函数应该放在头文件中。我尝试过,但是只能部分解决我的问题。我结束了像这样的编译器警告:
在../../src/rmw.c:38:0包含的文件中: ../../src/config_rmw.h:86:1:警告:“ realize_home”已定义但未使用[-Wunused-function] 实现_首页(char ** str) ^ ~~~~~~~~~~~
我读了一些书,我有点理解为什么会这样。从根本上讲,这意味着我将在每个.c文件中单独包含该函数的副本,该文件包含定义的头文件。我不需要我之所以静态声明一些函数,是因为它们仅在一个文件中需要。
然后,我读到一些评论,其中一些人说不应在头文件中定义静态函数!
所以...我一直在想最好的方法和其他选择。我更喜欢组织程序并练习良好的编码技能。
我仅使用基于脚本的方法编写了一些测试,这不需要将我的程序构建为库,但是我认为使用这两种方法都将具有优势,这取决于所测试的功能。
更新(添加)。该程序有20个源文件(包括头文件)和约4K行代码。
答案 0 :(得分:0)
我将按照建议here
我认为#include .c文件适合测试。如果由于某种原因引起麻烦,则pan64建议的“包装函数”方法应该是可以接受的折衷方案。
static void realize_home(char **)
{
implementation
}
#ifdef UNITTEST
void test_realize_home(char **v)
{
realize_home(v);
}
#endif