[英]Testing a function that prints outputs
我正在尝试为在 C 中打印一些文本的函数编写单元测试。我已经尝试了一切可能但无法实现。 我见过类似的问题,但大多是用 C++ 编写的。 假设我要测试的功能之一如下:
void verifyStudent(char string[10][40], int lines)
{
//some actions
printf("Is our Student");
//some other actions
printf("Not a student");
}
测试如下:
void test_student()
{
//all initializations
char *exp_output = "Not a student";
//HOW CAN I VERIFY THAT WHAT'S PRINTED IS SAME AS THE exp-output?
}
您可以通过包装您的函数并将输出重定向到stdout
以外的某个流来做到这一点。 我将稍微更改示例,但主要思想是相同的。 假设我们有以下函数:
void even(const int number)
{
if(number % 2 == 0){
printf("%d is an even number", number);
} else{
printf("%d is an odd number", number);
}
}
现在我们将更改它以打印到任何流并包装它以保持用户的正常性能(甚至将其转换为静态函数,因此您库的用户不知道包装):
void _even(const int number, FILE* stream)
{
if(number % 2 == 0){
fprintf(stream, "%d is an even number", number);
} else{
fprintf(stream, "%d is an odd number", number);
}
}
void even(const int number)
{
_even(number, stdout);
}
为了测试_even
,我们可以创建一个临时文件,将_even
输出重定向到其中,然后检查它是否与我们的预测匹配。
int test_even(const int input, const char* output)
{
FILE* tmp = tmpfile();
const int length = strlen(output) + 1;
char buffer[length];
_even(input, tmp); // Redirecting
const int tmp_length = ftell(tmp) + 1; // how many characters are in tmp
rewind(tmp);
fgets(buffer, length, tmp); // Reading from tmp
fclose(tmp);
if(strcmp(buffer, output) == 0 && tmp_length == length){
// Test succeded
// Do what you want in here
} else{
// Test failed
}
}
当您的测试成功或失败时,您究竟应该做什么取决于您,以及您如何设计单元测试。 然后你可以像这样运行它:
test_even(17, "17 is an odd number"); // succeeds
test_even(0, "0 is an even number"); // succeeds
test_even(-1, "-1 is an even number"); // fails
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.