문제

몇 년이 지난 몇 년간의 나쁜 관행을 따라 내 작업 장소에서 '건축가'로부터 나눠주고 더 나은 방법이 있어야한다고 생각하면서 최근에 TDD와 DDD를 읽고 있었으며 원칙과 관행이 우리가 쓰는 소프트웨어의 복잡성에 적합합니다.

그러나 내가 본 많은 TDD 샘플은 도메인 객체에서 메소드를 호출 한 다음 객체의 속성을 테스트하여 동작이 올바르게 실행되도록합니다.

반면에, 업계에서 여러 명의 존경받는 사람들 (CQRS에 대한 대화로 Greg Young이 가장 눈에 띄게)은 모든 'getters'를 제거하여 각 도메인 객체를 완전히 캡슐화하는 것을 옹호합니다.

그러므로 내 질문은 다음과 같습니다. 상태를 검색하는 것이 금지 된 경우 도메인 객체의 기능을 어떻게 테스트합니까?

나는 근본적인 것을 놓치고 있다고 믿으므로 나를 바보라고 부르고 깨달으십시오. 모든지도는 크게 감사 할 것입니다.

도움이 되었습니까?

해결책

당신이 묘사하는 것은입니다 상태 검증 여기서 도메인 객체의 상태를 주장합니다. TDD의 지점이 있습니다 행동 검증 그것은 모의 개체를 사용합니다.

행동 검증을 사용하면 호출 해야하는 메소드와 원하는 경우 호출되지 않은 메소드를 지정할 수 있습니다.

자세한 내용은 Martin Fowler 의이 기사를 살펴보십시오. 모의는 스터브가 아닙니다.

다른 팁

좋아,이 대답은 1 년이 너무 늦었다 ;-)

그러나 CQRS 모델을 테스트하려면 엔티티 상태에 대한 주장 대신 해고 된 도메인 이벤트에 대한 주장을 할 수 있습니다.

예 : 전화 : customer.rename ( "foo")이 올바른 동작을 초래하는지 테스트하려는 경우.

Customer.Name이 "foo"와 같은 경우 테스트하는 대신 보류중인 이벤트 스토어에 "FOO"값이있는 보류중인 CustomerRename 이벤트가 있는지 테스트하십시오. (구현에 따라 UOW 또는 엔티티 이벤트 목록에서)

상태의 검색을 금지하는 한 실제로 가려면 행동 테스트, 아마도 대상의 동작을 추적 할 수있는 힘이있는 TypeMock과 같은 조롱 프레임 워크를 통해 행동 테스트로 제한됩니다. 순수한 BDD를 할 수 있다면 이론적으로 전체 시스템의 올바른 성을 행동하는 방식으로 주장 할 수 있습니다.

실제로, 나는 BDD가 단순한 상태 테스트보다 많은 경우에 더 부서지기 쉬운 것으로 나타났습니다. 어떤 사람들은 특정 이론을 요구할 수 있지만, 그것이 당신을 위해 효과가있는 경우에만 효과가 있습니다. 주 기반 테스트는 여전히 우리가 쓰는 모든 단위 테스트의 90%를 차지하며 우리 팀의 BDD를 잘 알고 있습니다.

당신에게 가장 적합한 일을하십시오.

몇 가지.

먼저, 코드를 테스트 할 수 있도록 TDD와 같은 작업을 수행하면 더 작은 클래스로 끝납니다. 개인 속성이 많은 수업이 있다면 검사 할 수없는 경우 여러 클래스로 나뉘어 더 많은 테스트를 가능하게 할 가능성이 높습니다.

둘째, Oldschool OO Architecture는 언어 보호 장치를 사용하여 물건이 액세스 할 수없는 것을 방지함으로써 소프트웨어를 안전하게 만들려고합니다. TDD 아키텍처는 코드가 실제로 무엇을하는지 확인하는 테스트를 작성하여 소프트웨어를보다 강력하게 만들어서 언어 구성을 사용하여 프로그램이 수행하지 않는 일을 보장하는 데 중점을 둡니다.

마지막으로, 속성을 확인하는 것이 코드가해야 할 일을 검증하는 유일한 방법은 아닙니다. 책 xunit 디자인 패턴은 여기에 다른 접근법을 문서화합니다. http://xunitpatterns.com/result%20verification%20patterns.html

시스템의 공개 입력 방법 (즉, 입력 데이터를 시스템으로 푸시)을 호출 한 다음 시스템의 출력을 얻었습니다. 나는 시스템의 내부 상태를 테스트하는 것이 아니라 오히려 대중/가시적 행동을 테스트하고 있습니다. 하나는 내부 구현을 테스트해야합니까, 아니면 대중 행동 만 테스트해야합니까?

당신이 언급 한 것을 주 테스트라고합니다. 행동 테스트도 있습니다. 이를 위해 사용 된 기술은 의존성 주입, 제어의 역전 및 조롱입니다.

클래스의 모든 부작용은 "종속성"에 대한 메소드 호출로 구현됩니다. 즉, 외부에서 제공되는 개체, 일반적으로 생성자에서 제공됩니다. 그런 다음 단위 테스트에서는 실제 객체 대신 가짜 객체를 제공합니다. 가짜 물체는 '특정 방법이 호출되었는지, 그리고 그것이 당신이 시험에서 주장하는 것인지 기억할 수 있습니다.

주어진 인터페이스를 구현하는 클래스를 동적으로 생성하여 모의 개체 생성을 자동화하는 조롱 프레임 워크가 있습니다. 가장 인기있는 것은 Rhino.mocks와 Moq입니다.

저스틴, 당신처럼, 나는 최근에 단위 테스트를 위해 내 쓰기 전용 도메인 객체에 getters를 추가 할 생각을하고 있었지만 지금은 내가 틀렸다고 확신합니다. 처음에 쓰기 전용 도메인에 대한 아이디어를 구입했다고 가정하면 Getters가 전혀 없다면 문제를 요구합니다. Writ Getters를 노출하면 객체의 "모양"을 노출시키기 시작하고 Greg Young이 말했듯이 "도메인 객체는 모양이 아닌 동작이 있습니다".

즉, 나는 당신의 같은 질문으로 어려움을 겪고 있습니다 ... 쓰기 전용 도메인 개체를 어떻게 단위 테스트합니까? 현재 계획은 다음과 같습니다. 도메인 객체를 "이러한 속성이 변경된"이라는 도메인 이벤트로 만들고자합니다. 단위 테스트에서 "editcommand"를 보내기 전에 등록하겠습니다. 도메인 이벤트에 대한 Udi Dahan의 게시물을 확인하십시오 여기, 그리고 또한 참조하십시오 Eric Evans가 도메인 이벤트에 대해 말하는 것.

마침내 다음 논문을 우연히 발견 할 때까지 같은 것을 궁금해했습니다. 나는 그들이 행동 검증을 수행하는 데있어 훌륭한 프라이머라는 것을 알았습니다. 특히 첫 번째는 몇 가지 "AHA 순간"을 제공합니다.

  1. 역할 기반 객체를 설계하기 위해 모의 및 테스트를 사용합니다
  2. 객체가 아닌 조롱 역할
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top