내 '아하!' 루비와 레일즈에서의 테스트에 관한 순간은 제가 실제로 앉아서 Rspec 과 Cucumber 서적 에 관한 결정적인 자료를 읽었을 때였습니다 . 나는 오이에 대한 당신의 초기 경멸을 공유했지만, 나는 그 그림을 아주 잘못된 각도에서보고 있다는 것을 깨달았습니다.
기본적으로 Cucumber는 BDD (행동 중심 개발)에 관한 것입니다. Cucumber를 사용하여 기능을 계획하고 다음에 수행 할 작업을 계획하십시오. 흠, 다음으로 사용자가 포럼이나 게시물에 대한 게시물을 홍보 할 수 있기를 원합니다 (예를 훔치기 위해). 그래서 간단한 것을 작성합니다.
Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.
거기에 관련된 코드에 대한 언급은 거의 없습니다. 그것은 당신의 단계에 온다. 코드를 리팩터링 할 때 단계 정의를 변경해야 할 수도 있지만 동작 (기능)을 변경할 필요는 없습니다.
이제 Cucumber 기능을 실행할 때마다 TDD (테스트 중심 개발)를 사용하여 기능을 테스트하는 방법을 안내합니다. 이는 RSpec을 사용하여 하위 레벨에서 수행됩니다.
첫 번째 실행-첫 번째 단계 정의가 정의되지 않았습니다. user_steps.rb 또는 심지어 session_steps.rb로 정의하기 위해 블록을 복사하십시오. 이는 사용자 및 해당 세션과 관련이 있기 때문입니다. 이제 사용자가 로그인 한 것을 어떻게 정의합니까? 당신은 로그인 과정을 통해 그들을 취할 수 있습니다.
Given /^I am logged in$/ do
visit login_path
fill_in :name, :with => 'Joe'
fill_in :password, :with => 'Password'
click_button 'submit'
end
모두 행복해야합니다. 두번째 단계.
Given /^I can see the post "(.+)"$/ do |name|
visit post_path(Post.find_by_name(name))
end
다시 아주 쉽게. 로그인 프로세스를 완전히 다시 수행하거나 게시물을 정의하고 표시하는 방법을 변경하면 동작을 변경할 필요가 없습니다. 세 번째 단계.
When /^I vote the post up$/ do
pending
end
새로운 기능에 대해 이야기하기 시작했지만 아직 어떻게 작동하는지 잘 모릅니다. 게시물을 어떻게 투표합니까? +1 또는 무언가의 이미지를 클릭하면 컨트롤러에 대한 아약스 게시, JSON 또는 이와 같은 일부를 반환합니다. 이제 순수한 Rspec 테스트로 이동할 수 있습니다.
- +1 이미지가 표시되는지보기를 테스트하고,
- 올바른 형식의 주어진 아약스 요청을 수신 할 때 컨트롤러가 올바르게 작동하는지 테스트하십시오 (행복하고 불행한 경로 모두-잘못된 게시물 ID가 수신되면 어떻게 될까요? 투표 수를 올바로 증가 시키나요?)
- 올바른 형식으로 JSON Blob이 주어 졌을 때 올바르게 응답하는지 자바 스크립트를 테스트하십시오 (사용 된 것을 표시하기 위해 +1 이미지를 업데이트합니까? )
이 모든 것이 동작에 영향을 미치지는 않지만 하위 수준의 테스트를 마쳤 으면 게시물 투표 방법에 대한 단계 정의를 작성하는 것이 쉽지 않습니다. 처럼 간단 할 수 있습니다 click_link '+1'
. 그리고 나머지 단계는 테스트 결과이며,이 과정은 간단합니다. 완료되면 기능이 완료되고 완료된 것입니다. 필요한 동작이 변경되면 기능을 조정할 수 있고, 그렇지 않으면 구현 코드를 완벽하게 안전하게 조정할 수 있습니다.
이것이 의미가 있기를 바랍니다. 그것은 모두 내 머리 꼭대기에 있었지만 BDD와 TDD의 차이점과 Cucumber와 RSpec이 다른 요구를 충족시키는 이유를 보여줍니다.