저는 현재 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
방법에 코멘트를 남겨 것은 올바른이라고 생각하고, 코드에 뒤에를 , 나는 그것이 나의 의도가 정확하게 논평함으로써 명확하다는 것을 분명히했다.
당신은 어떻게 생각하십니까? 왜 내가 그것을 만들면 안되는 다른 아이디어?
제공되는 답변 모두 훌륭합니다!나는 이제 내 질문의 대답으로 받아 들일 수있는 것을 선택하는 데 어려움을 겪는다. 문제가 다르게 다루어지기 때문에, 그리고 둘 다 서로 좋은 답변이 될 수 있기 때문이다. 첫째, 나는 오류를 원한다는 것을 안다. 따라서 'When'를 단지 코드화한다. 나는 완전히 동의한다! 둘째, 스택에 null을 푸는 것과 같은 기술적 인 문제는 기술적 관심사가 될 가능성이 있으므로 이해 관계자와 관련이 없어야하며 이는 BDD와 TDD 사이의 경계를 만듭니다. 나는 완전히 동의한다! –
@Alski 대답은이 CustomStack을 테스트하는 데 SpecFlow를 사용하는 방법을 보여 주지만 BDD 프레임 워크를 사용하여 단일 구성 요소를 격리 테스트하는 것은 과도하다고 생각합니다. BDD는 일반적으로 사용자가 시스템과 상호 작용하는 방식을 설명하는 데 사용됩니다. 귀하의 예제에서 사용자는 스택에서 항목을 직접 팝하지 않고 대신 CustomStack을 사용하는 응용 프로그램에서 액션을 실행하여 스택을 팝하는 것을 트리거합니다. 그러므로 CustomStack이 TDD 및 단위 테스트를 사용하여 더 잘 테스트 될 것이라고 생각하는 이유입니다. Alski가 생각하는 것을 보는 것은 흥미로울 것입니다. –
전적으로 동의합니다, 신선한. 현실 세계에서 BDD는 전체 시스템의 동작을 테스트하는 것을 의미합니다. 그 때문에 엄격하게 BDD 말하기, 귀하의 대답은 실제 솔루션에 가장 적합합니다. 이외에도 Alski의 답변은 튜토리얼의 필요성, 즉 동작이 발생하는 'When'와 예상 값/동작에 대해 테스트되는 'Then'을 모두 사용할 수 있다는 점을 충족시킵니다. 내 딜레마는 내 문제를 해결하는 Alski의 대답을 둘러싼 전부이며 실제 BDD와 TDD의 경계가 어디인지는 알 수 있습니다. 사실 이러한 예외는 BDD가 아니라 TDD입니다. –