2014-10-01 18 views
7

Jak napisać test w CUnit dla funkcji, która drukuje na stdout, w celu zweryfikowania jej wyniku?Jak przetestować kod zapisujący na standardowe wyjście?

Przykład funkcji do testu:

void print() 
{ 
    printf("Hello world"); 
} 

Jego testy jednostkowe powinny jakoś sprawdzić, czy "Hello World" został wydrukowany do konsoli:

void test_print() 
{ 
    // how to assert? 
} 

Jak mam iść na ten temat?

+3

Co masz na myśli przez "test stdout?" –

+0

Używam printf do drukowania czegoś. I chcę potwierdzić jego wydajność. – qianchenglong

+0

Lub napisać własną funkcję drukowania, która zwraca coś, co można potwierdzić lub zapisuje w dzienniku. –

Odpowiedz

17

To powinno osiągnąć to, czego szukasz.
(tj. Jak powiedzieć, że coś zostało napisane do stdout)

#include <sys/stat.h> 

void print() 
{ 
    printf("Hello world"); 
} 

void test_print() 
{ 
    struct stat st; 
    int bytesWritten = 0; 

    // Redirect stdout 
    freopen("redir.txt", "w", stdout) 

    print(); 

    // assert checking 
    stat("redir.txt", &st); 
    bytesWritten = st.st_size; 

    CU_ASSERT(bytesWritten < 0); 
} 

Zauważ, że to niszczy zdolność do przywracania stdout, ale to known problem w linku, sugerują one środków do korzystania z FILE wskaźnik i używać fprintf() zamiast printf()


stdout przykład pożyczonej od here

przekierowanie

Rozmiar pliku sprawdzanie zapożyczone z here

A oto reference link from CUNIT

I to SO answer może przewidywać inny sposób dostępu stdout bez zaśmiecać go poprzez freopen(). Lub this SO answer, aby przywrócić przekierowanie.


Większość powyższych linków dotyczy zazwyczaj systemu Unix/Linux, ale wydaje się, że podobne kroki można podjąć w niektórych wersjach systemu Windows.

This Product Documentation page for Win XP zapewnia kilka sposobów przekierowania lub powielenia stdout za pomocą wiersza poleceń.

Warto zauważyć, że strona dokumentacja XP zwraca uwagę, że liczby deskryptorów samego pliku (0, 1, 2) są wykorzystywane do stdin, stdout i stderr tak freopen() powinien zachowywać się tak samo na Windows, jak ma to miejsce na Unix/Linux.

+0

Po prostu zamknięcie 'stdout' może być złe. Nie wiem, jak CUNIT wyprowadza swoje wyniki ... – Deduplicator

+3

@Deduplicator - prawdopodobnie nie byłby to mój pierwszy wybór, ale nie znam ograniczeń, na których działa OP. Niektóre odpowiedzi SO, z którymi się łączyłem, miały dobre sposoby na przywrócenie lub skopiowanie. Sądzę jednak, że były one bliższe konkretnym platformom i nie chciały za bardzo zamącić mojej odpowiedzi. – GlenH7

+0

Napisałem w oknach. Ale używam również linux.So, jeśli istnieje niezależny system operacyjny, będzie znacznie lepszy! – qianchenglong

Powiązane problemy