2009-10-13 2 views
2

내 개발 프로세스는 다음과 같이 흐름 : 통합 테스트를 통한 BDD 실습 - 단위 테스트도 필요합니까? 현재

  1. 는 내가 그렇게 시험
  2. 를 전달하는 동작을 제공하기 위해 내가 루비 레일에 코드를 작성 WebRat
  3. 를 사용하여 통합 테스트로 예상되는 동작을 설명 내가 리팩토링
  4. 는 테스트를 보장 여전히

그것은 데피로 나에게 보인다

  • 내가 다음 통합 테스트를 작성하는 과정의 끝에 통과 내 통합 테스트는 내가 만들 수있는 모든 모델, 컨트롤러 및 뷰를 테스트하고 있습니다. 실제로, 단위 테스트를 쓰지 않음으로써 나는 무엇인가 놓치고 있습니까?

  • 답변

    2

    레이크 작업이 있습니까? 커스텀 카피스트라 코드? 크론 방법? API? Monkeypatches? Flex 또는 iPhone 앱 통합은 어떻습니까? 직업 주자?

    일반적인 Rails 응용 프로그램에는 HTML UI에서 사용하지 않는 많은 코드가 있습니다. 따라서 앱을 믿을 수 없을 정도로 간단하게 만들지 않는 한 webrat 테스트만으로는 충분하지 않습니다.

    +0

    감사합니다. 지금까지 아니요. 그것은 단순한 웹 응용 프로그램입니다 - 고의적으로 간단합니다. HTML UI에 의해 실행되지 않는 코드를 만들지 않는 한 WebRat으로 충분합니까? 그리고 HTML UI에 의해 실행되지 않는 코드를 작성하게되면, 일종의 통합 테스트 (분명히 WebRat가 아닌 것)로 충분할 것이라고 생각하십니까? 아니면 통합 테스트를 통해 테스트하는 것 외에도 각 장치를 개별적으로 테스트해야하는 진정한 필요성이 있습니까? –

    +0

    그것은 당신의 목표에 달려 있습니다. 리팩토링을위한 안전망으로 테스트를 사용하거나 코드를 추가 할 때 버그를 잡는 방법으로 테스트를 사용한다면 여전히 단위 테스트를 원할 것입니다. 테스트 세트는 모든 것을 테스트하지 않으므로 중복 테스트와 같은 결과를 얻을 수 있습니다. –

    3

    통합 테스트는 서로 다른 코드 부분이 잘 통합되어 있는지 확인하는 데 유용합니다. 그들은 모든 레이어를 포함하고 모든 코드를 포함 할 수 있지만 통합 테스트가 실패하면 버그가있는 곳을 알려줍니다. 나는 틀릴 수도 있지만 그렇게 생각하지는 않습니다. 이것은 어딘가에 문제가 있음을 알려줄 것입니다. 반면에 실제 단위 테스트 (모조 또는 스텁을 사용하여 격리하여 작성)가 실패하면 문제가있는 단위를 정확하게 알 수 있습니다 (실제로 단위 테스트의 목적이며 단위가 예상되는 동작을 구현하는지 확인 함) . 즉 단위 테스트와 통합 테스트가 모두 유용하지만 용도가 다릅니다.

    +0

    또는 더 나은 아직 스텁과 격리하여 작성. 테스트 예상 시간의 약 80-90 %가 인터페이스에 대해 실행될 때 더 안정적입니다. 두 개의 메소드 구현이 동일한 매개 변수를 사용하고 가능한 모든 매개 변수에 대해 동일한 반환 값을 제공하면 일반적으로 동일한 구현 세트가 두 구현에 모두 전달되기를 원합니다. 기대치가없는 테스트 더블에서는 테스트가 일반적으로 작동하지만 모의 테스트에서는 그렇지 않습니다. –

    +0

    다른 10-20 %의 시간은 대개 API 호출이거나 부작용이있는 코드 일 수 있으므로 어쨌든 리펙토링해야합니다. –

    +0

    밥 (Bob) 맞아. 나는 "고립되어 쓰여져있다"라고 써야했다. 내 대답을 업데이트 할게. 모의 또는 스텁, 나는 테스트가 고립되어 쓰여지는 한 (그리고 mock은 IMHO를 과용한다)만큼 실제로는 상관 없다. –

    8

    저는 실제로 여기에서 당신의 관점에 꽤 동정적입니다. 나는 오이를 좋아한다 나는 RSpec을 좋아한다. 그리고 나는 그것들을 양쪽 다 사용하지만 항상 같은 코드에있는 것은 아니다. 예를 들어, 요즘 레일스 컨트롤러 용 RSpec 예제를 쓰는 일은 거의 없으며 거의 ​​뷰 스펙을 작성하지 않습니다. 대부분의 컨트롤러는 매우 유사하며 레일즈 자체의 유닛 테스트에 의해 이미 잘 테스트 된 "재고"컨트롤러 패턴과 많이 다르지 않습니다. 동일한 행동을 다시 확인하는 데 시간이 걸리지 않으며 모든 모델을 조롱하는 번거 로움이 없습니다. 통합 수준에서 오이와 나는 그 조롱을 건너 뛸 수 있으며 내가 찾고있는 필수 검증을 얻을 수 있습니다. 뷰 테스트는 오이에서 가장 투명하게 처리됩니다. (그렇다면 나는 "foo" 등등을보아야합니다.)

    그러나 레일즈에서 RSpec을 광범위하게 사용하지는 않습니다. 내 논리가 살아있는 장소, 즉 모델, 컨트롤러 필터 및보기 도우미에 사용합니다. 나는 또한 모두 비즈니스 로직의 프로젝트 몇 개를 가지고있다. 라이브러리 또는 복잡한 타사 인터페이스에 대한 API 어댑터를 제공합니다. 이들을 위해 나는 RSpec을 독점적으로 사용하고 오이를 건너 뛰는 것을 자주 찾는다. 경험적으로

    , 당신이 강하게 단위 테스트에게 다음 질문 중 하나가 "예"대답 할 수있는 시간을 쓰는 것을 고려 것이 좋을 것 :

    • 것은 내가 쓰고 있어요 코드입니다 사소한 것보다 더 복잡한가?
    • 이 코드는 주로 다른 코드에 대한 응답을 제공하기 위해 존재합니까?
    • 리팩토링하는 기존 코드 (아직 단위 테스트가없는 코드)가 있습니까?
    • 이 코드에서 버그를 발견 했습니까? (그렇다면 다시 고정하기 전에 단위 테스트를 작성하십시오.)
    • 이 코드를 구현하는 가장 우아한 방법에 대해 10 초 이상 생각해야합니까?
    • 내 Spidey Sense가 어지럽습니까?

    경우에만 통합 테스트를 수행하면 해결할 수 있습니다. 다시 말하지만 합리적인 경우가 많이 있습니다. 그러나 나중에 문제가 생기면 가격을 지불 할 준비를하십시오. 그리고 그 가격은 언제든지 부름을받는 것처럼 보일 때마다 단위 테스트를 작성해야합니다.

    +0

    +1은 컨트롤러와 뷰의 스펙을 회피합니다. 유닛 테스트 웹 서비스 컨트롤러 호출, 모델 및 물건'lib',하지만 그렇지 않으면 오이에 둡니다. –

    관련 문제