簡體   English   中英

測試打印輸出的函數

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM