확실히 좋은 목록입니다. 여기에 대한 몇 가지 생각이 있습니다.
먼저 테스트를 작성한 다음 코드를 작성하십시오.
나는 높은 수준에서 동의합니다. 하지만 좀 더 구체적으로 설명하겠습니다. "먼저 테스트를 작성한 다음 테스트를 통과하기에 충분한 코드를 작성 하고 반복하십시오." 그렇지 않으면 내 단위 테스트가 통합 또는 수용 테스트와 비슷해 보일까 두렵습니다.
종속성 주입을 사용하여 클래스를 디자인합니다.
동의합니다. 개체가 자체 종속성을 만들면 사용자는이를 제어 할 수 없습니다. Inversion of Control / Dependency Injection은 해당 제어를 제공하여 모의 / 스텁 / 등을 사용하여 테스트중인 개체를 격리 할 수 있습니다. 이것은 개체를 격리하여 테스트하는 방법입니다.
Model-View-Controller 또는 Model-View-Presenter를 사용하여 UI 코드를 동작과 분리합니다.
동의합니다. 발표자 / 컨트롤러조차도 스텁 / 모의보기 및 모델을 전달하여 DI / IoC를 사용하여 테스트 할 수 있습니다. 자세한 내용은 Presenter First TDD를 확인하십시오 .
정적 메서드 나 클래스를 작성하지 마십시오.
이것에 동의하는지 잘 모르겠습니다. 모의를 사용하지 않고 정적 메서드 / 클래스를 단위 테스트 할 수 있습니다. 아마도 이것은 당신이 언급 한 Rhino Mock 특정 규칙 중 하나 일 것입니다.
클래스가 아닌 인터페이스를 프로그래밍하십시오.
동의하지만 약간 다른 이유가 있습니다. 인터페이스는 소프트웨어 개발자에게 다양한 모의 객체 프레임 워크를 지원하는 것 외에도 상당한 유연성을 제공합니다. 예를 들어, 인터페이스 없이는 DI를 제대로 지원할 수 없습니다.
외부 종속성을 분리하십시오.
동의합니다. 인터페이스를 사용하여 자신의 파사드 또는 어댑터 (적절한 경우) 뒤에 외부 종속성을 숨 깁니다. 이를 통해 웹 서비스, 대기열, 데이터베이스 등 외부 종속성으로부터 소프트웨어를 격리 할 수 있습니다. 이는 팀이 종속성 (외부라고도 함)을 제어하지 않을 때 특히 중요합니다.
모의하려는 방법을 가상으로 표시하십시오.
이것이 Rhino Mocks의 한계입니다. 모의 객체 프레임 워크보다 손으로 코딩 된 스텁을 선호하는 환경에서는 필요하지 않습니다.
그리고 고려해야 할 몇 가지 새로운 사항 :
창의적인 디자인 패턴을 사용하십시오. 이는 DI에 도움이되지만 해당 코드를 격리하고 다른 로직과 독립적으로 테스트 할 수도 있습니다.
Bill Wake의 Arrange / Act / Assert 기술을 사용하여 테스트를 작성합니다 . 이 기술은 필요한 구성, 실제로 테스트중인 항목 및 예상되는 항목을 매우 명확하게합니다.
자신의 모크 / 스텁을 굴리는 것을 두려워하지 마십시오. 종종 모의 개체 프레임 워크를 사용하면 테스트를 읽기가 매우 어려워집니다. 직접 롤링하면 모의 / 스텁을 완벽하게 제어 할 수 있으며 테스트를 읽기 쉽게 유지할 수 있습니다. (이전 포인트를 다시 참조하십시오.)
단위 테스트의 중복을 추상 기본 클래스 또는 설정 / 해체 방법으로 리팩터링하려는 유혹을 피하십시오. 그렇게하면 단위 테스트를 시도하는 개발자로부터 구성 / 정리 코드가 숨겨집니다. 이 경우 중복을 리팩토링하는 것보다 각 개별 테스트의 명확성이 더 중요합니다.
지속적인 통합을 구현합니다. 모든 "녹색 막대"에서 코드를 체크인하십시오. 체크인 할 때마다 소프트웨어를 빌드하고 전체 단위 테스트를 실행하세요. (물론, 이것은 그 자체로 코딩 관행은 아니지만 소프트웨어를 깨끗하고 완전히 통합 된 상태로 유지하기위한 놀라운 도구입니다.)