2014-10-01 3 views
7

출력을 확인하기 위해 표준 출력에 인쇄하는 함수에 대해 CUnit에서 테스트를 작성하는 방법은 무엇입니까? 테스트에stdout에 쓰는 코드를 테스트하는 방법은 무엇입니까?

예 기능 :

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

그것의 단위 테스트는 어떻게 든에 "Hello World"가 콘솔에 인쇄 된 것을 확인해야합니다을 : 나는 그것에 대해 어떻게 가야

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

?

+3

"test stdout"이란 무엇을 의미합니까? –

+0

난 printf를 사용하여 무언가를 인쇄하기 만하면된다. 그리고 나는 그것을 출력한다고 주장하고 싶다. – qianchenglong

+0

또는 어설 션 또는 로그에 쓸 수있는 것을 반환하는 사용자 고유의 인쇄 기능을 작성하십시오. –

답변

17

이것은 당신이 찾고있는 것을 성취해야합니다.
(즉. 뭔가 stdout에 기록 된 것을 확인하는 방법)이 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); 
} 

참고하지만이 링크에서는 known problem있어, 그들이 FILE 포인터를 사용하는 방법을 제안하고 대신 printf()


stdoutfprintf()를 사용하면 here

빌린 예 리디렉션

파일 크기 here

에서 빌린 그리고 여기 reference link from CUNIT

있어 그리고이 SO answerfreopen()를 통해 그것을 부수고없이 stdout에 액세스하는 다른 방법을 제공 할 수 확인. 또는 this SO answer을 사용하면 리디렉션을 되돌릴 수 있습니다.


위의 링크 대부분은 일반적으로 유닉스/리눅스에만 해당되지만 일부 Windows 버전에서도 비슷한 단계가 수행 될 수 있습니다.

This Product Documentation page for Win XPstdout을 명령 줄을 통해 리디렉션하거나 복제하는 몇 가지 방법을 제공합니다.

그것은 XP 문서 페이지가 같은 파일 기술자 번호 (0, 1, 2), stdin에 대한 stdout을 사용하고 있으며,이 유닉스처럼 stderr 그렇게 freopen() Windows에서 동일하게 동작해야한다고 지적하고 있음을 주목할 필요가/리눅스.

+0

그냥 'stdout'을 닫는 것이 좋지 않을 수 있습니다. CUNIT이 결과를 출력하는 방법을 잘 모름 ... – Deduplicator

+3

@Deduplicator - 아마도 내 첫 번째 선택이 아니지만 OP가 작동중인 제약 조건을 알지 못합니다. 내가 링크 한 SO 응답 중 일부는 그것을 복원하거나 복제하는 좋은 방법이 있습니다. 그러나 나는 그것들이 플랫폼 특정에 더 가깝다고 생각하고 그들과 나의 대답을 너무 많이 진흙 투성이가되고 싶지 않았다. – GlenH7

+0

나는 windows에서 썼다.하지만 linux를 사용한다. OS가 독립적이라면 훨씬 더 좋을 것이다! – qianchenglong

관련 문제