질문에 대한 답변
단위 테스트가 너무 많습니까?
물론 ... 예를 들어 언뜻보기에는 여러 가지 테스트가있을 수 있지만 실제로는 같은 것을 테스트 할 수 있습니다 (논리적으로 테스트중인 동일한 "관심있는"응용 프로그램 코드 행에 따라 다름).
또는 코드 외부에서 절대로 드러나지 않는 (즉, 모든 종류의 인터페이스 계약에 속하지 않는) 코드 내부를 테스트 할 수 있습니다. 예를 들어 내부 로그 메시지의 정확한 표현 등
기존 응용 프로그램에 대한 단위 테스트 작성을 맡았습니다. 첫 번째 파일을 완성한 후 419 줄의 원본 코드에 대한 717 줄의 테스트 코드가 있습니다.
그것은 매우 평범한 일입니다. 테스트는 실제 테스트에서 설정 및 해제에 많은 코드를 사용합니다. 비율은 향상되거나 향상되지 않을 수 있습니다. 나 자신은 꽤 무거운 테스트이며 종종 실제 코드보다 테스트에 더 많은 장소와 시간을 투자합니다.
코드 범위를 늘리면이 비율을 관리하기 어려워 집니까?
비율은 그다지 중요하지 않습니다. 관리 할 수없는 다른 테스트 품질이 있습니다. 코드에서 간단한 변경을 수행 할 때 정기적으로 전체 테스트를 리팩토링해야하는 경우 이유를 잘 살펴 봐야합니다. 그리고 그것들은 몇 줄이 아니라 테스트 코딩에 접근 하는가입니다.
단위 테스트에 대한 나의 이해는 모든 방법이 예상대로 작동하는지 클래스의 각 방법을 테스트하는 것이 었습니다.
엄격한 의미에서 "단위"테스트에 맞습니다. 여기서 "단위"는 메소드 나 클래스와 같은 것입니다. "단위"테스트의 요점은 전체 시스템이 아니라 하나의 특정 코드 단위 만 테스트하는 것입니다. 이상적으로는 시스템의 나머지 부분을 모두 제거합니다 (복식 또는 기타).
그러나 풀 요청에서 기술 책임자는 더 높은 수준의 테스트에 집중해야한다고 언급했습니다.
그럼 당신은 사람들에게 실제로 가정의 함정에 빠진 의미 가 때 단위 테스트를 말했다 단위 테스트. 나는 "단위 테스트"라고 말하는 많은 프로그래머들을 만났지만 상당히 다른 것을 의미합니다.
그는 각 기능을 철저히 테스트하기보다는 문제의 클래스에 가장 일반적으로 사용되는 4-5 개의 사용 사례를 테스트하도록 제안했습니다.
물론, 중요한 코드의 상위 80 %에 집중하면 부하도 줄어 듭니다 ... 당신은 당신의 상사를 높이 평가한다고 생각하지만, 이것이 최선의 선택이라고 생각하지는 않습니다.
나에게 100 % 단위 테스트 범위는 높은 목표이지만, 50 %에 도달하더라도 그 50 %의 100 %가 보장된다는 것을 알게 될 것입니다.
"단위 테스트 범위"가 무엇인지 모르겠습니다. 테스트 코드를 실행 한 후 모든 코드 줄 (= 100 %)이 적어도 한 번 실행 된 "코드 적용 범위"를 의미한다고 가정합니다.
이것은 훌륭한 야구장 측정법이지만, 최고의 표준은 아닙니다. 코드 라인을 실행하는 것이 전체 그림이 아닙니다. 예를 들어 복잡하고 중첩 된 분기를 통한 다른 경로를 설명하지는 않습니다. 너무 적은 테스트를 거친 코드 조각을 손가락으로 향하게하는 것이 더 많은 메트릭스입니다 (분명히 10 % 또는 5 %의 코드 적용 범위 인 클래스는 잘못된 것임). 반면 100 % 적용 범위는 충분히 테스트했는지 또는 올바르게 테스트했는지를 알려주지 않습니다.
통합 테스트
오늘날 사람들이 기본적으로 단위 테스트 에 대해 끊임없이 이야기 할 때 상당히 짜증납니다 . 내 의견으로는 (그리고 경험), 단위 테스팅은 라이브러리 / API에 좋습니다; 보다 비즈니스 지향적 인 영역 (우리가 문제의 사례와 같은 사용 사례에 대해 이야기하는 영역)에서 반드시 최선의 선택은 아닙니다.
일반적인 응용 프로그램 코드 및 일반 비즈니스 (돈을 벌고 마감 시한을 맞추고 고객 만족을 충족시키는 것이 중요하며 주로 사용자의 얼굴에 있거나 실제 재해로 이어질 수있는 버그를 피하려고합니다) NASA 로켓 발사에 대해 이야기하면 통합 또는 기능 테스트가 훨씬 유용합니다.
이들은 행동 주도 개발 또는 기능 주도 개발과 밀접한 관련이 있습니다. 그것들은 정의에 따라 (엄격한) 단위 테스트와 함께 작동하지 않습니다.
이를 짧게 유지하기 위해 통합 / 기능 테스트는 전체 애플리케이션 스택을 연습합니다. 웹 기반 응용 프로그램에서는 응용 프로그램을 클릭하는 브라우저처럼 작동합니다 (물론 간단 하지 않아도 됩니다. 그렇게 할 수있는 매우 강력한 프레임 워크가 있습니다 -http : // cucumber를 확인하십시오) . 예를 들어 io ).
마지막 질문에 대답하기 위해 : 기능 테스트가 구현되고 실패한 후에 만 새 기능이 프로그래밍되도록하여 전체 팀이 높은 테스트 범위를 갖도록합니다. 그리고 네, 그것은 모든 기능 을 의미 합니다. 이 보장 당신에게 100 % (긍정적) 기능의 범위를. 정의에 따르면 응용 프로그램의 기능이 절대로 "이탈"하지 않습니다. 100 % 코드 적용 범위를 보장하지는 않습니다 (예를 들어, 부정적인 기능을 적극적으로 프로그래밍하지 않으면 오류 처리 / 예외 처리를하지 않습니다).
버그가없는 응용 프로그램을 보장하지는 않습니다. 물론 명백하거나 매우 위험한 버그 상황, 잘못된 사용자 입력, 해킹 (예 : 주변 세션 관리, 보안 등)에 대한 기능 테스트를 작성하려고합니다. 그러나 포지티브 테스트를 프로그래밍하는 것만으로도 엄청난 이점이 있으며 현대적이고 강력한 프레임 워크를 통해 실현 가능합니다.
기능 / 통합 테스트에는 분명히 자체 웜 캔이 있습니다 (예 : 성능, 타사 프레임 워크의 중복 테스트; 일반적으로 더블을 사용하지 않기 때문에 내 경험상 쓰기가 더 어려워지는 경향이 있습니다 ...) d 매일 100 % 코드 커버리지 단위 테스트 응용 프로그램 (라이브러리가 아님)에 대해 100 % 긍정적 기능 테스트 응용 프로그램을 가져옵니다.