구현에 대한 테스트보다 인터페이스에 대한 테스트를 선호하십시오.
개인적인 방법은 테스트 할 수 없다는 것을 이해합니다.
이는 개발 환경에 따라 다릅니다 (아래 참조).
공개 API는 객체의 무결성을 검증하기위한 충분한 정보를 제공하므로 [비공개 메소드]에 대해 걱정할 필요가 없습니다.
맞습니다. TDD는 인터페이스 테스트에 중점을 둡니다.
전용 메소드는 리팩터링주기 동안 변경 될 수있는 구현 세부 사항입니다. 인터페이스 나 블랙 박스 동작 을 변경하지 않고 리팩터링 할 수 있어야합니다 . 실제로 이는 TDD의 이점 중 하나입니다. 클래스 내부의 변경 사항이 해당 클래스의 사용자에게 영향을 미치지 않는다는 확신을 쉽게 생성 할 수 있습니다.
글쎄, 개인 메서드 만 가지고 있고 이벤트를 수신하여 다른 객체와 상호 작용하는 객체를 만들 수 있습니다. 이것은 매우 캡슐화되어 있지만 완전히 테스트 할 수는 없습니다.
클래스에 퍼블릭 메소드가없는 경우에도 이벤트 핸들러는 퍼블릭 인터페이스 이며 테스트 할 수 있는 퍼블릭 인터페이스 에 대한 이벤트 핸들러 입니다.
이벤트는 인터페이스이므로 해당 개체를 테스트하기 위해 생성해야하는 이벤트입니다.
모의 객체 를 테스트 시스템 의 접착제 로 사용하는 방법을 살펴보십시오 . 이벤트를 생성하고 결과 상태 변경 (다른 수신자 모의 오브젝트에 의해 가능함)을 선택하는 단순 모의 오브젝트를 작성할 수 있어야합니다.
또한 테스트를 위해 메소드를 추가하는 것은 나쁜 습관으로 간주됩니다.
절대적으로 내부 상태를 노출시키는 것에 매우주의 해야합니다 .
이것은 TDD가 캡슐화와 충돌한다는 것을 의미합니까? 적절한 균형은 무엇입니까?
절대적으로하지.
TDD는 클래스를 단순화하는 것 이외의 클래스 구현을 변경해서는 안됩니다 ( 이전 시점에서 YAGNI 를 적용하여 ).
TDD를 사용하는 모범 사례는 TDD를 사용하지 않는 모범 사례와 동일합니다. 개발하는 동안 인터페이스를 사용하고 있기 때문에 더 빠른 이유를 찾을 수 있습니다.
나는 지금 내 방법의 대부분 또는 전부를 공개하려는 경향이 있습니다 ...
이것은 오히려 목욕물로 아기를 버리는 것입니다.
당신은 안 필요 당신이 TDD 방식으로 개발할 수 있도록 모든 방법을 공개 할 수 있습니다. 개인 방법이 실제로 테스트 할 수 없는지 확인하려면 아래 내 노트를 참조하십시오.
개인 메소드 테스트에 대한 자세한 설명
언어 / 환경에 따라 수업의 일부 개인 행동 을 절대적으로 단위 테스트 해야하는 경우 세 가지 옵션이 있습니다.
- 시험을 치르려는 수업에 시험을 치십시오.
- 테스트를 다른 클래스 / 소스 파일에 넣고 테스트하려는 개인 메소드를 공개 메소드로 노출하십시오.
- 테스트 코드와 프로덕션 코드를 별도로 유지하면서 테스트 코드가 프로덕션 코드의 개인 메소드에 액세스 할 수있는 테스트 환경을 사용하십시오.
분명히 세 번째 옵션이 가장 좋습니다.
1) 시험을 치르려는 수업에 시험을 넣으십시오 (이상적이지 않음)
테스트중인 프로덕션 코드와 동일한 클래스 / 소스 파일에 테스트 케이스를 저장하는 것이 가장 간단한 옵션입니다. 그러나 전 처리기 지시문이나 주석이 많지 않으면 테스트 코드로 인해 생산 코드가 불필요하게 부풀려지고 코드를 구성한 방법에 따라 실수로 해당 코드의 사용자에게 내부 구현이 노출 될 수 있습니다.
2) 테스트하려는 개인 메소드를 공개 메소드로 노출하십시오 (실제로 좋은 생각은 아닙니다)
제안 된 바와 같이, 이것은 매우 나쁜 관행이며, 캡슐화를 파괴하며 내부 구현을 코드 사용자에게 노출시킵니다 .
3) 더 나은 테스트 환경을 사용하십시오 (사용 가능한 경우 최상의 옵션)
Eclipse 세계에서는 fragments 를 사용하여 3.를 달성 할 수 있습니다 . C # 세계에서는 부분 클래스를 사용할 수 있습니다 . 다른 언어 / 환경은 종종 비슷한 기능을 가지고 있으므로 찾기 만하면됩니다.
맹목적으로 1. 또는 2.가 유일한 옵션이라고 가정하면 테스트 코드로 불완전한 프로덕션 소프트웨어 또는 더러운 리넨을 공공 장소에서 씻을 수있는 불쾌한 클래스 인터페이스가 발생할 수 있습니다. * 8 ')
- 대체로 개인 구현에 대해 테스트하지 않는 것이 훨씬 좋습니다.