2013-12-12 2 views
1

저는 현재 SpecFlow를 사용하여 BDD를 배우고 테스트 중이므로 잘 작동합니다! BDD 인 경우 시나리오가 없을 수 있습니까?

내 질문을 선택하기 전에

, 나는 this one을 읽고, 나는이 같은 문제는 언급하지 않는 Exception 시나리오, 해결된다는 사실에도 불구하고 나의 질문을했다처럼 느꼈다.

사실이 시나리오 테스트하고 있습니다

:

Scenario: I should get an error whenever I try to remove an item from an empty stack 
    Given I have an empty stack 
    When I pop from it 
    Then I should get an error 

public class StackBehaviour { 
    public void GivenIHaveAnEmptyStack() { stack = new CustomStack<string>(); } 

    // This will throw whenever called! 
    // So the Then method will never be run! 
    // I feel like I should just put a comment which says why it's empty, 
    // allowing a fellow programmer to understand the exact intention. 
    public void WhenIPopFromIt() { stack.Pop(); } 

    // It is here that it verifies whether the CustomStack meets the expected behaviour. 
    public void ThenIShouldGetAnError() { 
     Assert.Throws<IndexOutOfRangeException>(delegate { 
      stack.Pop(); 
     }); 
    } 

    private CustomStack<string> stack; 
} 

public class CustomStack<T> { 
    public T Pop() { 
     if (stack.Count == 0) 
      throw new IndexOutOfRangeException("Cannot pop from an empty stack!"); 
     T item = stack[stack.Count-1]; 
     stack.RemoveAt(stack.Count-1); 
     return item; 
    } 

    private ArrayList stack = new ArrayList(); 
} 

내가 비즈니스 요구 사항에 어떤 정보가 부족하지 않도록 When 방법에 코멘트를 남겨 것은 올바른이라고 생각하고, 코드에 뒤에를 , 나는 그것이 나의 의도가 정확하게 논평함으로써 명확하다는 것을 분명히했다.

당신은 어떻게 생각하십니까? 왜 내가 그것을 만들면 안되는 다른 아이디어?

+0

제공되는 답변 모두 훌륭합니다!나는 이제 내 질문의 대답으로 받아 들일 수있는 것을 선택하는 데 어려움을 겪는다. 문제가 다르게 다루어지기 때문에, 그리고 둘 다 서로 좋은 답변이 될 수 있기 때문이다. 첫째, 나는 오류를 원한다는 것을 안다. 따라서 'When'를 단지 코드화한다. 나는 완전히 동의한다! 둘째, 스택에 null을 푸는 것과 같은 기술적 인 문제는 기술적 관심사가 될 가능성이 있으므로 이해 관계자와 관련이 없어야하며 이는 BDD와 TDD 사이의 경계를 만듭니다. 나는 완전히 동의한다! –

+0

@Alski 대답은이 CustomStack을 테스트하는 데 SpecFlow를 사용하는 방법을 보여 주지만 BDD 프레임 워크를 사용하여 단일 구성 요소를 격리 테스트하는 것은 과도하다고 생각합니다. BDD는 일반적으로 사용자가 시스템과 상호 작용하는 방식을 설명하는 데 사용됩니다. 귀하의 예제에서 사용자는 스택에서 항목을 직접 팝하지 않고 대신 CustomStack을 사용하는 응용 프로그램에서 액션을 실행하여 스택을 팝하는 것을 트리거합니다. 그러므로 CustomStack이 TDD 및 단위 테스트를 사용하여 더 잘 테스트 될 것이라고 생각하는 이유입니다. Alski가 생각하는 것을 보는 것은 흥미로울 것입니다. –

+0

전적으로 동의합니다, 신선한. 현실 세계에서 BDD는 전체 시스템의 동작을 테스트하는 것을 의미합니다. 그 때문에 엄격하게 BDD 말하기, 귀하의 대답은 실제 솔루션에 가장 적합합니다. 이외에도 Alski의 답변은 튜토리얼의 필요성, 즉 동작이 발생하는 'When'와 예상 값/동작에 대해 테스트되는 'Then'을 모두 사용할 수 있다는 점을 충족시킵니다. 내 딜레마는 내 문제를 해결하는 Alski의 대답을 둘러싼 전부이며 실제 BDD와 TDD의 경계가 어디인지는 알 수 있습니다. 사실 이러한 예외는 BDD가 아니라 TDD입니다. –

답변

2

바인딩을 사용하면 기능의 의미를 조금 더 명확하게 할 수있는 또 다른 트릭이 있습니다. 이 경우 끝에서 시작해 봅시다.

Then I should get an error 

문제는 기본적으로 여기에 있습니다. 오류가 발생한다는 것을 알고 있지만 얻는 방법을 모릅니다. 실제로 이미보고 싶었지만 오류는 이미 When 단계에서 발생했으며 코드 예제에서는 오류를받을 수 있도록 조치를 then 단계로 옮겼습니다.

하지만 액션 AMD를 수행하는 when를 유지하는 경우 정말

Then I should have had an error 

사소한 변화를 보인다 발생하지만 지금 우리의 기능은 오류가 When에 관련 지을 수 있던 것을 반영하는 것을 반영하여 then를 재 - 표현 우리는 나중에 그것을 단순히 평가하고 있으며, 이것이 우리가 코딩 할 수있는 것입니다. when에서 오류를 기억하고 then으로 전달하기 위해 필요한 것이 있습니다. 필요한 경우

private Exception errorFromWhen = null; 

public void WhenIPopFromIt() 
{ 
    try 
    { 
    stack.Pop(); 
    } 
    catch(Exception ex) 
    { 
    errorFromWhen = ex; 
    } 
} 

public void ThenIShouldGetAnError() 
{ 
    errorFromWhen.ShouldNotBeNull(); 
    errorFromWhen.ShouldBe<IndexOutOfRangeException>(); 
} 

SpecFlow는 사실 인해 mini Dependency injection system이 절대적으로 아무런 문제가, 없다, 당신도 바인딩 클래스 사이에이 상태를 전달할 수 있습니다.

+0

+1 답장을 보내 주셔서 감사합니다. 나는 이것을 고려하여 즉시 시도 할 것이다. –

1

시나리오가 BDD 인 경우가 없습니까?

Specflow에서는 지정된 시간과 시간이 필수 항목이 아닙니다.

그러나이 예에서는 Specflow 및 BDD를 잘 사용한다고 생각하지 않습니다. 여기이 대답에서 마커스 상태 :

당신의 예에서

"BDD is about ensuring that we're building the right thing, TDD is about ensuring that we're building it right."

즉 CustomStack 테스트되는 내용의 범위, TDD를 통해 테스트해야합니다. CustomStack을 BDD를 통해 테스트해야하는 최종 솔루션입니다 (따라서 SpecFlow). 이 CustomStack이 웹 사이트의 특정 작업을 통해 행사되는 경우.

This 답변은 질문과 관련되어 있습니다.

+0

+1 이러한 통계를 제공해 주셔서 감사합니다. 나는 유닛 테스트 프로젝트가 BDD를 사용 함에도 불구하고 여전히 적합하다는 것을 당연한 것으로 간주 할 것이다. 그러면 BDD와 TDD 사이에 교차하지 않는 선이 그려집니다. 그 외에도 스택의 동작을 테스트하는 흥미로운 기사를 읽었습니다. 이해 관계자가 스택 객체를 원한다고 가정 해 봅시다. 따라서 어떤 선이 교차하지 않는지 궁금합니다. http://www.ibm.com/developerworks/java/library/j-cq09187/index.html –

+0

답변 해 주셔서 감사합니다. 나는 그것으로 많은 것을 정말로 배웠다. 제 질문과 관련된 마지막 코멘트를 보아서 Alski의 대답을 어떻게 받아들 였는지 알 수 있습니다. 내 판단에 문제가있는 것으로 느껴지면 자유롭게 의견을 말하면서 동의합니다. –

관련 문제