방법 당 몇 개의 테스트가 있습니까?
이론적으로 매우 비실용적 인 최대 값은 N-Path 복잡성입니다 (테스트를 통해 코드를 통해 다른 방법을 모두 적용한다고 가정). 최소값은 ONE!입니다. 퍼블릭 메서드 당 , 그는 구현 세부 사항을 테스트하지 않고 클래스의 외부 동작 만 반환합니다 (값 반환 및 다른 객체 호출).
당신은 인용 :
* 각 방법을 자체 테스트 방법 (1-1 관계로)으로 테스트한다는 생각은 웃을 수 있습니다. *
그리고 물어보십시오 :
따라서 각 방법에 대한 테스트 작성이 '웃을 수있는'경우 테스트 작성 대상을 언제 / 어떻게 선택합니까?
그러나 나는 당신이 저자를 오해했다고 생각합니다.
one test method
per 의 아이디어는 one method in the class to test
저자가 "웃음"이라고 부르는 것입니다.
(적어도 나를 위해) 그것은 '더 적은'에 관한 것이 아니라 '더 많은'에 관한 것입니다.
내가 그를 이해 한 것처럼 다시 말해서
그리고 하나의 방법 (1-1 관계의 자체 테스트 방법) 만으로 각 방법을 테스트한다는 생각은 웃을 수 있습니다.
견적을 다시 인용하려면 :
테스트를 작성하지 않고 동작을 지정하는 것이 중요하다는 것을 인식하면 관점이 바뀝니다.
당신 이 TDD를 연습 할 때 당신 은 생각하지 않습니다 :
방법이 있는데 방법 에 대한 모든 것을 테스트 calculateX($a, $b);
하는 테스트 testCalculcateX
가 필요합니다 .
TDD가 말하는 것은 코드가 무엇을 좋아 하는지 생각하는 것입니다 .
두 값 중 큰 값을 계산해야 하지만 ( 첫 번째 테스트 사례! ) $ a가 0보다 작은 경우 오류가 발생하고 ( 두 번째 테스트 사례! ) $ b가 0보다 작은 경우 .... ( 세 번째 테스트 사례! ) 등등.
컨텍스트가없는 단일 메소드 만이 아니라 동작을 테스트하려고합니다.
그렇게하면 코드에 대한 문서 인 테스트 스위트를 얻을 수 있으며 REALY는 예상되는 작업, 아마도 이유를 설명합니다 :)
단위 테스트를 생성하는 코드를 결정하는 방법은 무엇입니까?
저장소 또는 프로덕션 근처에있는 모든 것은 테스트가 필요합니다. 나는 위의 진술을 시도했을 때 당신의 인용문의 저자가 그것에 동의하지 않을 것이라고 생각합니다.
테스트를하지 않은 경우, 특히 변경하지 않은 경우 코드를 변경하기가 더 어렵습니다 (비용이 많이 듭니다).
TDD는 모든 테스트를 보장하는 방법이지만 테스트를 작성하는 한 괜찮습니다. 보통 같은 날에 글을 쓰면 나중에하지 않을 것이므로 도움이됩니까? :)
의견에 대한 답변 :
적절한 방법은 다른 방법에 의존하거나 의존하기 때문에 특정 상황에서 테스트 할 수 없습니다
이러한 메소드가 호출 할 수있는 것은 세 가지입니다.
다른 클래스의 공개 메소드
우리는 다른 클래스를 조롱하여 거기에 상태를 정의했습니다. 우리는 상황을 통제하여 문제가되지 않도록합니다.
* 동일한 보호 또는 개인 방법 *
클래스의 공개 API에 포함되지 않은 것은 일반적으로 직접 테스트되지 않습니다.
당신은 테스트 동작하지 구현 원하는 클래스가 하나의 큰 공공 방법 또는 호출되는 많은 작은 보호 방법에있는 모든 그것의 작업을 수행하는 경우입니다 구현 . 테스트를 건드리지 않고 보호 된 방법을 변경할 수 있기를 원합니다. 코드 변경 동작이 변경되면 테스트가 중단되기 때문입니다! 당신이 무언가를 깨뜨릴 때 당신에게 알려주기 위해 테스트가 있습니다. :)
같은 클래스의 공개 메소드
그렇게 자주 발생하지 않습니까? 그리고 다음 예제 에서처럼 이것을 처리하는 몇 가지 방법이 있습니다.
$stuff = new Stuff();
$stuff->setBla(12);
$stuff->setFoo(14);
$stuff->execute();
세터가 존재하고 실행 메소드 서명의 일부가 아닌 것은 또 다른 주제입니다.)
여기서 우리가 테스트 할 수있는 것은 잘못된 값을 설정할 때 실행이 폭발하는지입니다. 즉 setBla
당신이 문자열이 개별적으로 테스트 할 수 있습니다 통과 할 때 예외를 throw하지만 우리는 두 허용되는 값 (12 및 14) 그게 전부 하나 개의 테스트 케이스보다 (어떤 이유) 작업 TOGETHER을하지 않는 테스트를합니다.
"좋은"테스트 스위트를 원한다면 PHP에서 어쩌면 (!) @covers Stuff::execute
주석을 추가 하여이 메소드에 대한 코드 적용 범위 만 생성하고 설정 된 다른 것만 별도로 테스트해야합니다 ( 당신은 그것을 원합니다).
요점은 다음과 같습니다. 어쩌면 주변 세계를 먼저 만들어야 할 수도 있지만 일반적으로 하나 또는 두 개의 실제 기능 (세터는 여기에 포함되지 않음)에만 적용되는 의미있는 테스트 사례를 작성할 수 있어야합니다. 나머지는 에테르로 조롱하거나 먼저 테스트 한 다음 신뢰할 수 있습니다 (참조 @depends
)
* 참고 : 질문은 SO에서 마이그레이션되었으며 처음에는 PHP / PHPUnit에 관한 것이 었습니다. 샘플 코드와 참조가 PHP 세계에서 온 이유입니다 .phpunit은 다른 xUnit과 크게 다르지 않으므로 다른 언어에도 적용 할 수 있다고 생각합니다 테스트 프레임 워크.