2013-04-16 11 views
9

내 프로젝트에 C 파일이 있습니다. 그리고 일부 파일에는 정적으로 정의 된 함수가 있습니다.CppUnit으로 정적 함수 테스트

단위 테스트에서 CppUnit을 사용하고 있으며이 정적 함수를 테스트하고 싶습니다. 파일 외부에서 함수를 호출하는 것은 허용되지 않는다는 것을 알고 있습니다. 내 C++ 테스트 파일에서 이러한 정적 함수를 호출하기 위해이 문제를 피하는 솔루션이 있습니까?

+0

[개인 메소드, 필드 또는 내부 클래스가있는 클래스를 테스트하려면 어떻게합니까?] (https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that) -has-private-methods-fields-or-inner-classes) – Raedwald

답변

6

우리는 C 정적 함수에 대해 이야기하고 있다고 가정하면 가장 쉬운 해결책은 디버그 빌드를 컴파일 할 때 함수를 정적이 아니게 만드는 것입니다. 즉, 단위 테스트에서 사용할 기호를 사용할 수 있습니다. 이것은 심볼의 앨리어싱이없는 경우에만 작동합니다.

모든 디버그에 기호 DEBUG 다음과 같이 빌드 정의하면이

debug_export void foo(void) 
{ 
... 
} 

같은 정적 함수를 정의 다음

#ifdef DEBUG 
#define debug_export 
#else 
#define debug_export static 
#endif 

과 및 중 하나는 헤더 파일에 조건부로 선언을 포함 단위 테스트 파일에서 수동으로 가져 오거나 :

extern void foo(void); 

다른 방법으로는 소스 파일 자체에 유닛 테스트를 포함 시키거나 (손이 닿지 않으면 엉망이된다), 함수를 테스트하는 단위를 사용하지 말고 (cop-out 비트) 또는 표시해야한다. 정적이 아닌 as dll-local 함수를 사용하고 단위 테스트가 해당 동적 객체의 일부인지 확인하십시오.

+0

감사합니다. 나는 당신의 답을 바탕으로 한 해결책에 영감을 불어 넣었습니다. 자세한 내용은 내 대답보기 – MOHAMED

4

내 프로젝트의 모든 소스 파일에 포함 된 공통 헤더 파일이 있습니다. 이 줄을 추가하고 문제가 해결되었습니다.

#ifdef TEST 
#define static 
#endif 

원본 C 코드에 위의 코드를 추가하는 것을 피할 수도 있습니다. gcc 명령에 플래그 -Dstatic=을 추가 할 수 있으며이 방법도 잘 작동합니다. 우리는이 개 별도의 파일에 정적으로 정의 된 같은 변수/함수 이름을 가질 수 있습니다

  • :

    은 그러나 우리는 때문에이 솔루션을 사용할 때주의해야한다.

  • 정적으로 정의 된 변수가 포함 된 함수를 가질 수 있습니다.
1

정적 메서드의 필요성을 제거하기 위해 코드를 리팩토링하는 방법이 있습니까? 객체 지향 설계 관점에서 보자면, 통계는 양의 옷을 입은 전역입니다.

필자는 실용적이지 않거나 가장 빠를 대답은 아니지만 그것을 제거하여 디자인을 개선 할 것이라고 확신합니다.