기본 클래스 테스트를 피하는 것이 좋습니까?


15

나는 다소 일반적인 "메타 프로그래밍"을 가진 기본 클래스를 가지고있어 그것이 다소 일반화되어야하는 유연성 / 추상성을 제공한다.

기본 클래스에서 공통 메소드를 사용하는 많은 서브 클래스가 있고 각 서브 클래스의 모든 경우를 다루는 동작 지향 단위 테스트가 있습니다.

기본 클래스 테스트를 건너 뛰어도 되나요?


1
나 자신 에게이 질문을 시작할 때 내가하는 한 가지 일은 코드를 깨는 것입니다. 잘못된 입력을 던지거나 잘못된 설정 값 등을 지정하십시오.
Zymus

답변:


31

테스트가 충분한 지 여부를 확인하기 위해 테스트에 의해 유도 된 코드 범위와 분기 범위를 확인할 수 있습니다 (커버리지 도구를 사용하거나 코드 경로를 수동으로 검토하거나 디버거를 사용하여).

결론에 따르면 서브 클래스에 대한 테스트는 기본 클래스 코드에 대해 충분히 높은 적용 범위를 제공하므로 추가 테스트를 추가해도 큰 이점은 없습니다. 반면에 기본 경로를 사용하여 특정 테스트를 추가하여 테스트 할 수있는 코드 경로가있는 경우이 경로를 따라 가야합니다.

"기본 클래스를 직접 테스트"하는 또 다른 이유는 "독립적으로"해당 클래스의 특정 기능을 테스트하려는 것입니다. 때로는 해당 메소드를 사용하는 서브 클래스의 메소드를 호출하여 해당 메소드를 간접적으로 테스트하는 대신 특정 메소드에 대해 직접 테스트 케이스를 설계하는 것이 더 쉬울 수 있습니다.

일반적인 사용 시나리오 서브 클래스를 파생 시키는 일반 기본 클래스가있는 경우 기본 클래스는 추상적 일 수 있습니다. 따라서 이러한 클래스를 테스트하려면 어쨌든 파생을 만들어야합니다. 이 상황에서 "기본 클래스를 직접"테스트한다는 것은 물론 테스트 목적으로 만 특별한 파생을 추가하는 것을 의미 할 수 있습니다.


더 확실하게 정의 된 메소드에 대한 기본 클래스의 직접 단위 테스트에 동의합니다. 내가하고 싶지 않은 것은 서브 클래스의 단위 테스트가 암묵적으로 그 내용을 테스트하기 때문에 모든 메타 프로그래밍을 테스트하는 것입니다.
Nathan

4
테스트 디렉토리에만 존재하는 기본 / 추상 클래스를 확장하고 기본 클래스를 노출 / 인스턴스화하는 역할을하는 클래스를 설계하는 것은 기본 클래스의 적절한 적용 범위를 확보하고 기본 메소드가 사용되는 더 복잡한 클래스를 분리하여 올바르게 작동합니다.

@MichaelT : 예. 이에 대한 의견이 다른 것 같습니다.
Doc Brown

@DocBrown은 전혀 아닙니다. 분명히 그 점을 분명히했습니다. 나는 내 대답으로 작성했을 것이라는 추가 설명을 추가하고있었습니다 (아직 언급하지 않은 경우). 나는 "Doc이 말한 모든 것에 동의하지만 구체적으로 설명하고 더 많은 것을 쓰고 싶다"는 대답을 쓰고 싶지 않다.

2

프로그래머를 위해 자동화 된 테스트가 작성되었으며 테스트를 수행하기 위해 프로그래머가 작성되지 않았습니다.

우리는 생산성을 높이고 고객이 불만을 제기하는 "문제"수를 줄이기 위해 테스트를 거쳤습니다.

따라서 각 서브 클래스의 모든 사례를 다루는 행동 지향적 단위 테스트가 있으므로 기본 클래스를 직접 테스트하는 고객에게는 이점이 없습니다. 이것은 기본 클래스의 일부 코드를 변경하고 테스트가 실패하는지 확인 하는 등의 방법 으로 확인할 수 있습니다 ( 예 : 코드 줄을 일반화하거나 "if 문"에 "not"추가). (모든 코드 줄이 테스트에 포함되는지 확인하는 것만으로는 충분하지 않습니다.)

그런 다음 테스트를 통해 생산성을 높일 수 있는지 묻습니다 . 이것은 몇 가지 방법으로 발생할 수 있습니다.

  • 코드에 대해 더 명확하게 생각하게하기-코드가 작성 될 때이 경우는 거의 없습니다.
  • 기본 클래스에서 일부 코드를 격리하여 테스트 할 수 있으므로 코드가 이미 작동하는 경우와 같이 다시 한 번 더 빨리 디버깅하십시오.
  • 서브 클래스의 논리에 대한 세부 사항을 이해하지 않고도 기본 클래스의 코드를 변경할 수 있습니다. 아마도 코드를 리팩터링하는 경우일까요 ???

따라서 하위 클래스가 작동한다고 가정하면 기본 클래스에 대한 직접 테스트를 작성하는 데 아무런 요점이 없습니다. 이러한 테스트를 초기 상태로 작성하면 이점이 없었던 것은 오늘날의 일이 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.