2009-07-12 2 views
2

assert.h에서 어설 션 매크로가 포함 된 일부 함수를 테스트하는 것과 관련된 몇 가지 문제점이 있습니다.어설 션 및 단위 테스트가 호환되지 않습니까?

어설 션이 실패하면 테스트도 실패합니다. 이렇게하면 작동하지 않을 테스트 케이스가 생깁니다.

예를 들어 실패 (false 또는 유사한 결과)를 나타내는 대신 함수가 어설 션합니다.

이 문제에 대한 해결책이 있습니까 (단정 시험 기능에 어썰트 포함)?

답변

7

아니요, 단위 테스트는 개발하는 동안 수행하는 작업입니다. 어설 션은 런타임 구조입니다.

제 경험상, 대부분의 시간은 프로덕션 환경에서 해제되어 있습니다. 그러나 항상 테스트를 받아야합니다.

CppUnit은 훌륭한 테스트 프레임 워크입니다. C++ 용 nUnit 패밀리의 일부입니다.

9

어쩌면 그것은 저만의 문제 일지 모르지만, 어설 션 오류가 발생하면 문제가 해결 될 때까지 더 높은 수준의 단위 테스트를 고려하지 않아야한다고 생각합니다. 코드가 제대로 작성된 경우 단위 테스트를 포함하여 어떠한 상황에서도 어설 션이 이 아니어야합니다 (). 아니면 최소한 내 코드를 작성하는 방법입니다.

+13

어설 션을 사용하여 입력 매개 변수의 유효성을 검사 할 수 있습니다. 유효한 단위 테스트는 "이 함수는 특정 클래스의 잘못된 입력으로 예측 가능한 방식으로 폭파됩니다"입니다. – Tom

1

기본적으로 테스트 프레임 워크가 사용자의 주장을 테스트하기 위해 빌드되지 않은 것처럼 들립니다.

프로세스를 중단시키는 어설 션을 사용하면 실행 상태를 모니터링 할 항목이 필요합니다. 나는 유사한 기술로 시작하는 것, http://www.boost.org/doc/libs/1_34_0/libs/test/doc/components/prg_exec_monitor/index.html

내가하지 한 C 또는 일부 시간에 코딩 C++ :하지만, 향상 테스트 방법의

예는이 작업을 수행합니다.

12

어설 션은 (잘못된 입력시) 예상 할 때 어설 션이 중단된다는 사실을 테스트 할 수 있습니다.

테스트 프레임 워크 Google Test은 ASSERT_DEATH 매크로로 프로그램이 예상 한 위치 (어설 션과 같은)에서 중단되는지 테스트합니다.

유닛 테스트를위한 어설 션을 비활성화하려면 NDEBUG 정의 (-DNDEBUG with gcc)를 사용하여 컴파일 할 수도 있습니다.

2

어설 션은 어떠한 상황에서도 절대로 실패하지 않아야합니다. 테스트에 실패하면 논리 오류가 있음을 나타냅니다. 기본적으로 함수가 오류 코드를 반환하는 대신 "assert (0)"을 수행하는 경우 함수를 다시 작성해야합니다. abort가 원하는 동작이면 exit()가 적절하지만 assert()는 적절하지 않습니다.

테스트 중에 어설 션이 실패하면 코드에 오류가있어 변경해야합니다. 코드 "assert (x)"는 "프로그램의 논리가 x가 참이어야한다는 것을 의미하는 것으로 해석되어야하며 어떠한 상황에서도 거짓이 될 수는 없습니다"라고 해석해야합니다. 어설 션이 실패하는 단위 테스트가있는 경우 해당 명령문은 분명히 유효하지 않으므로 수정해야합니다.

+1

만약 aborting이 원하는 행동이라면, 아마도'abort()'를 사용해야하지만'exit()'는 사용하지 말아야합니다. – Tom

+0

좋은 지적입니다.아마도 "종결이 원하는 행동"이라고 말했어야합니다. "중단"은 내가 사용하려고하지 않은 기술적 인 의미가 있습니다. –

+1

그러면 잘못된 입력 인수를 어떻게 테스트합니까? 오류가있는 입력 매개 변수가 유효하지 않은 경우 먼저 함수를 반환합니다 (생산 코드 용). – philk