2017-02-22 12 views
1

전 세계 시험을 치르는 경우에도 BDD를 처음 사용합니다.BDD에서 값 개체 유형의 "isEqual"메서드를 테스트해야합니까?

신속한 선형 대수학 라이브러리를 작성할 때 BDD 연습을하려고합니다. 코드를 작성할 때 그래서 Matrix 같은 많은 값 오브젝트 유형이있을 것이다, Vector 등, 나는 여전히 TDD 원칙에 충실 할 필요가 가정 (내가 맞다?) :

없이 코드의 한 줄을 작성하지 않음

실패한 테스트 나는 Equatable 프로토콜을 준수하고 == 연산자를 구현해야하는 값 객체 유형을 구현합니다. 이것은 코드를 추가하기 때문에 실패한 테스트가 필요합니다. 어떻게 이런 시나리오에 대한 스펙을 작성하나요? 두 가지 이유 못생긴 상용구 것

describe("Matrix") { 
    it("should be value object") { 
     let aMatrix = Matrix<Double>(rows: 3, cols:2) 
     let sameMatrix = Matrix<Double>(rows: 3, cols:2) 
     expect(sameMatrix) == aMatrix 
     let differentMatrix = Matrix<Double>(rows: 4, cols: 2) 
     expect(differentMatrix) != aMatrix 
    } 
} 

이 :

하나는 같은 몇 가지 방법을 제안 할 수 있습니다

  1. 이 값 오브젝트 유형을 많이하고 나는 모두를 반복해야 할 수도 있습니다 그 중
  2. 두 개의 개체가 동일하지 않은 경우가 많이있을 수 있습니다. 위의 사양을 예로 들면, return lhs.rows == rhs.rows과 같은 ==의 구현은 테스트를 통과합니다. 이 "버그"를 드러내려면 expect(matrixWithDifferentColmunCount) != aMatrix과 같은 또 다른 기대를 더해야합니다. 다시 한번 말하지만, 이러한 일종의 반복은 모든 가치 객체 유형에 대해 발생합니다.

따라서이 "isEqual"(또는 operator==) 메소드를 어떻게 우아하게 테스트해야합니까? 또는 나는 그것을 전혀 시험해서는 안되는가?


테스트 프레임 워크에는 swift와 Quick을 사용하고 있습니다. Quick는 보일러 플레이트를 줄이기 위해 SharedExample이라는 메커니즘을 제공합니다. 그러나 신속한 정적 유형 지정 언어 및 Quick의 공유 예제는 제네릭을 지원하지 않으므로 직접 공유 예제를 사용하여 값 개체를 테스트 할 수는 없습니다.

나는 workaround을 생각해 냈지만 우아한 것으로 생각하지 않습니다.

답변

1

우아함은 테스트 스위트의 적입니다. 테스트 스위트는 지루합니다. 테스트 스위트는 반복적입니다. 테스트 스위트는 "드라이"하지 않습니다. 테스트 스위트를 더 똑똑하게 만들수록 더 많은 것을 막을수록 코드 대신 테스트 인프라를 테스트 할 수 있습니다.

BDD의 규칙은 코드를 작성하기 전에 테스트를 작성하는 것입니다. 그것은 소량의 테스트 코드이기 때문에 적은 양의 라이브 코드를 테스트합니다. 당신은 단지 그것을 씁니다.

예, 너무 오래 걸릴 수 있으며 헬퍼 기능을 절대로 사용하지 않는다고 말하는 것은 아닙니다. 하지만 자신의 테스트 스위트를 리팩터링 할 때, 테스트 스위트가 무엇인지 스스로에게 물어볼 필요가있다.

부수적으로 테스트에서 말하는대로 테스트하지 않습니다. 동일한 생성자가 Equal 객체를 만들고 동일하지 않은 생성자가 비 Equal 객체 (원칙적으로 두 개의 테스트)를 만드는 지 테스트하고 있습니다. 이것은 값 객체라는 것을 전혀 테스트하지 않습니다 (테스트하기에 완벽하게 괜찮은 것이지만). 이것은 큰 문제가 아닙니다.유용한 테스트 방법으로 테스트 철학을 사용하지 마십시오. 제목이 테스트 의도와 일치하도록하는 것이 좋습니다.

+0

사실입니다 (슬프게도). –