1

我必须为 main 的功能编写单元测试。

我有,C:\sample\src\main.c

#include<stdio.h>
void main()
{
printf("\nthis is main file");
}

void print()
{
printf("\nthis is print function of main file");
}

C:\sample\src\main.h

#ifndef MAIN_H
#define MAIN_H
void print();
#endif

C:\sample\unitTest.c

#include<stdio.h>
#include<main.h>
void main()
{
printf("unit test");
print();
}

在上述程序中,我想从 UnitTest.c 文件中触发单元测试。我不能在可执行文件中有 2 个主文件。我怎样才能做到这一点?

4

4 回答 4

7

正如其他回答者所提到的,通常您的主要功能可能应该与您的其余代码位于一个单独的文件中。

但有时最好将代码全部保存在一个文件中。我正在考虑的情况是,当您为学校做作业时,您应该只提交一个 .c 文件。

对于这种情况,我有一个解决方案。解决方案是用这样的包装主函数#ifndef

主程序

#include <stdio.h>

void print()
{
    printf("\nthis is print function of main file");
}

#ifndef DOING_UNIT_TESTS
void main()
{
    printf("\nthis is main file");
}
#endif

然后DOING_UNIT_TESTS在将 .c 文件包含在测试代码中之前进行定义,这会将 main 函数从包含的 .c 文件中删除:

测试main.c

#define DOING_UNIT_TESTS
#include "main.c" // yes, .c

void main()
{
    // Do unit tests, or invoke a testing framework
}
于 2015-05-29T12:37:17.753 回答
4

“正确”的答案是不要将main()andprint()放在同一个源 ( .c) 文件中。从代码模块化的角度来看,唯一应该与 main 位于同一源文件中的是 main 的辅助函数,它们本身没有太多意义——换句话说,这些东西不是“单元”,因此你真的不想对它们进行单元测试。(例如,这可能是解析命令行参数或输出帮助语句的函数。)如果print()是“单元”(或单元的入口点),那么它不应该在同一个源文件中作为不属于该单元的东西(例如main())。

由于 C 不是面向对象的,因此该语言没有为您提供一种自然的方式来对逻辑连接的事物进行分组。因此,将事物逻辑地分组到源文件中,这样每个源文件都代表一个“逻辑事物”(对于“逻辑事物”的某些定义),这一点尤为重要。

于 2013-07-09T04:48:35.337 回答
1

你的程序不能有两个主要功能。您应该研究模块化编程并强调高内聚性。

评论:

操作系统将调用一个主函数。它是您的程序的开始,您的程序不能有两个起点。如果您有两个,编译器将无法分别链接您的目标文件。

于 2013-07-09T04:06:59.380 回答
0

Main 由系统调用。也许您需要将 unitest 程序添加为“系统”?1. 将 main.c 和 unitTest.c 编译为独立程序(带有它们自己的 main): main unitest 2. 运行 unitest 并通过 exec int execl("main", const char *arg, ...); 调用 main :)

于 2013-07-09T04:31:11.440 回答