[英]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.