我是一名计算机科学专业的学生,刚接触C,正在尝试为这个程序编写一个单元测试:
Board *get_board_sizes() {
int row_count, column_count, mine_count = 0;
Board *struct_to_return = (Board *)calloc(1, sizeof(Board));
int rerun = 0;
do {
if (rerun == 1) {
printf("Incorrect size");
}
rerun = 1;
printf("Choose how many rows, columns, and mines you would like\n");
printf("Note that maximum number of rows anc columns are 30 and maximum number of mines are rows*columns\n");
scanf("%d %d %d", &row_count, &column_count, &mine_count);
while (getchar() != '\n');
} while ((row_count > 30 || row_count < 1) || (column_count > 30 || column_count < 1) || (mine_count < 1 || mine_count >= (row_count * column_count)));
//while(getchar() != '\n');
struct_to_return->row_count = row_count;
struct_to_return->column_count = column_count;
struct_to_return->mine_count = mine_count;
return struct_to_return;
}
我的问题是有没有办法测试scanf
函数?我的想法是,我也许可以将它应该扫描的数字保存到一个文件中,并尝试从那里获取它,但我正在努力将它放入单元测试中。
我想这样做:
TEST get_fitting_number_from_players() {
char file[] = "tests/board_size/fitting_number";
FILE *fp = fopen(file, "r");
Board *size = get_board_sizes(fp);
ASSERT(/*havent added yet*/);
}
但是我没有看到get_board_sizes函数能够从文件中获取数字。有什么办法可以做到这一点吗?
3条答案
按热度按时间lmvvr0a81#
有没有办法测试
scanf
函数?是的,你可以从测试返回值开始:如果已经从用户读取了所有3个数字,则它必须是3。
函数中存在更多问题:
calloc()
故障。scanf()
的返回值:你在无效输入上有未定义的行为。while (getchar() != '\n');
将永远不会停止一旦你到达文件的末尾。do
/while
循环的while
子句中填充所有值测试,而是使用for(;;)
(aka *for ever循环 *)和带有有意义错误消息的显式测试。以下是修改后的版本:
关于单元测试:您可以使用
freopen()
从文件重定向标准输入:41ik7eoe2#
有没有办法为使用scanf的函数编写单元测试?
是的。
使用
freopen(..., "r", stdin)
将stdin
的阅读重定向到您选择的文件。在该文件中填充您想要的数据scanf(), getchar()
等。接收并调用测试代码。sg3maiej3#
对
get_board_sizes
函数进行单元测试的一种方法是修改函数,使其接受一个额外的参数来提供输入,而不是硬编码为从 stdin 读取。类似于:然后在单元测试中,您可以为函数合成一个输入。使用cgreen进行单元测试,我编写了以下测试。在这段代码中:
1.我们创建临时文件作为
get_board_sizes
函数的输入。1.我们用示例输入填充临时文件
1.我们倒回去。
1.我们将该文件作为输入参数传递给
get_board_sizes
1.最后,我们验证我们得到了预期的响应
即使您使用的是不同的单元测试框架,其基本思想也是相同的。
在实际(非测试)代码中,您将调用
get_board_sizes(stdin)
,而不是简单地调用get_board_sizes()
。您可能需要考虑其他方法来重构
get_board_sizes
,以便为无效输入编写测试。