RSpec과 Cucumber는 그만한 가치가 있습니까?


12

나는 대부분의 RoR 프로그래머들이 중독자들을 테스트하고 있다는 것을 알고 큰 테스트 스위트의 장점을 이해하지만 테스트를 시작할 때 그런 큰 스위트를 얻지 못하며 항상 "올바른 테스트를하고 있습니까? 정말 효율적입니까?" 나는 종종 응용 프로그램의 동작 방식 만 테스트하는 통합 테스트를 다루고 있습니다.

먼저 테스트 할 가치가 있습니까? 내 말은, 테스트를 작성하는 데 소요되는 시간이 정말 가치가 있습니까?

그런 다음 최근에 Cucumber를 발견하고 잠시 동안 사용한 RSpec을 사용하지만이 모든 단계를 작성하는 것이 실제로 문제가 될지 모르겠습니까? 나는 단계를 다시 사용할 수 있습니다 알고 있지만이 단계도 완료되거나하지 않으면 알 수 없다 : 예를 들어, 나는를 사용하고 Given I am logged in as (.+)있지만, 나는 그것의 정의에 말을해야 나도 몰라 Given there's a user called $1지금까지 만든 경우 사용자를 복제 할 수 있기 때문에 하지만 항상 한 발짝 내딛는 것은 가치가 없습니다 Given I am logged in as (.+). 거의 유용하지 않을 많은 코드입니다. 매일 테스트되는 부품에 새로운 버그가없는 것 같아요. 오이가 RSpec에 비해 정말 가치가 있습니까?

답변:


13

내 '아하!' 루비와 레일즈에서의 테스트에 관한 순간은 제가 실제로 앉아서 RspecCucumber 서적 에 관한 결정적인 자료를 읽었을 때였습니다 . 나는 오이에 대한 당신의 초기 경멸을 공유했지만, 나는 그 그림을 아주 잘못된 각도에서보고 있다는 것을 깨달았습니다.

기본적으로 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이 다른 요구를 충족시키는 이유를 보여줍니다.


이것은 나에게 정말 도움이되었다. 그러나 한 가지 더 질문이 있습니다 : 컨트롤러와 뷰를 모두 테스트하기 위해 RSpec을 사용하여 프로젝트를 시작했으며 코드는 약 90 %가 테스트 대상입니다. 내가 정말 오이가 필요하다고 생각하고 지금 단계와 시나리오를 작성하는 데 시간을 보내십니까? 어쨌든 RSpec으로 모든 것을 할 수 있습니다.
Cydonia7

@ Skydreamer : 아마도 필요하지는 않지만 좋은 습관 일 수 있습니다. 테스트를하는 한, 당신은 올바른 길을
가고 있습니다

10

제 생각에는 테스트는 예술입니다. RDD 또는 다른 프레임 워크를 사용하여 TDD를 수행하는 것은 처음에는 "시간 낭비"인 것 같습니다. 프로덕션 코드를 작성하지 않기 때문에 이해할 수 있습니다.

그러나 코드베이스를 향상 시키면서 다른 모든 것이 여전히 작동하는지 확인 해야 할 때 TDD의 이점을보기 시작 합니다. TDD는 가능한 한 빨리 회귀 오류를 포착하는 데 도움이됩니다. 이렇게하면 내 오류를 지적한 테스트에 집중했기 때문에 작업 시간 을 절약 할 수 있었습니다.

또한 검토자가 테스트중인 시나리오와 코드 사용 방법을 확인할 수 있으므로 테스트를 수행하면 코드 검토에 도움이 될 수 있습니다.

일단 당신이 TDD의 스윙에 들어가면, 다른 일을하는 것은 잘못된 느낌입니다.


2
+1 경험에서 말하지만, "TDD의 스윙에 들어가는 것"은 그 자체로 Herculean 노력이며 대부분의 개발자에게는 어려운 일입니다.
Wayne Molina

@ 웨인 M : 합의. TDD- 홈에 들어가는 것은 어렵지만 그 혜택은 엄청납니다. :)
David Weiser

어렵게 가벼워지고 있습니다 .. 몇 년 동안 내 머리를 trying려고 노력했습니다 :)
Wayne Molina

네, 노력할만한 가치가 있습니다.
sevenseacat

2

내 취향은 당신이 오이 정면에 있다는 것입니다. 모든 단계를 작성하는 것은 문제를 많이하고 혜택은 고통을 정당화하지 않는다. 나는 오이 사용의 6 가지 단점에 대해 광범위하게 썼다 : 왜 오이 테스트를 방해 하는가?

Rspec 또는 Test :: Unit으로 수행 된 단위 테스트 및 정기 통합 테스트는 많은 의미가 있지만 운 좋게도 Cucumber 테스트보다 작성 속도가 훨씬 빠릅니다. 하나의 경우 Gherkin의 장황하고 어색한 구문과 싸우지 않고 순수한 Ruby를 사용할 수 있습니다.


2
오이 테스트에 대한 당신의 모든 의견에 동의하지 않는다고 안전하게 말할 수 있습니다. * 좋은 텍스트 편집기를 깨뜨리지 않습니다 (gedit이 강조 표시하고 자동 완성하면됩니다). * 기존 Rspec 설정에서 Cucumber 설정으로 테스트 설정을 복사해서는 안됩니다 (두 가지 테스트 세트는 크게 다른 수준에서 실행됩니다) 세분화)) * 오이의 잘못이 아닌 페이지 이름을 일관성있게 유지할 수없는 경우 (레일을 사용하면 다른 요일에 다른 경로를 호출 할 수 없으므로 오이는 왜 발생해야합니까?)
sevenseacat

1
* 당신은 단계 파일에 관한 협약이 무엇인지 말하지만 그 협약을 따라야 할 곳을 모른다고 말합니까? 게시물 홍보가 post_steps.rb 이외의 다른 이유는 무엇입니까? * 기능은 코드가 아니어야하므로 말이 중요하지 않습니다. 기능은 앱의 작동 방식에 대한 문서입니다. * 그리고 마지막으로, 당신이 잘못하고있는 것만으로 '재사용 코드 찾기'를 비판 할 수 있습니다 .
sevenseacat

2

내가 개인적으로 믿는 것은입니다 RSpec testing is a definite must. 예를 들어 새로운 기능을 작성하고 다른 기능에 대한 참조가 있고 해당 기능이 다른 모듈 또는 메소드에서 참조 될 수 있다고 가정합니다. 따라서 작성중인 내용이 응용 프로그램의 다른 부분을 위반하지 않는지 어떻게 확인할 수 있습니까?

큰 응용 프로그램이 있고 전체 응용 프로그램과 비교하여 사소한 것을 코딩했다고 가정하면 응용 프로그램의 모든 링크를 클릭하여 한 줄의 코드를 변경할 때마다 작동하는지 확인하여 전체 응용 프로그램을 다시 테스트합니까?

그러나 오이 테스트는 필수는 아닙니다. RSpec 자체를 사용한 통합 테스트는 클라이언트가 테스트를 확인해야 할 때까지 그리고 그렇지 않으면 더 의미가 있다고 생각합니다. 내 경험상 어느 것이 RARE입니까. 팀이 전적으로 개발자로 구성된 경우 RSpec 기능 테스트를 위해 Cucumber 단계를 대신 교체해야한다고 생각합니다. 그리고 RSpec 3 DSL 이후에는 테스트를 거의 읽을 수 있다고 생각합니다.

예 :

오이 단계 정의 :

Given /^I am logged in$/ do
  visit login_path
  fill_in :name, :with => 'Joe'
  fill_in :password, :with => 'Password'
  click_button 'submit'
end

RSpec 기능 테스트 :

feature 'Given the user is logged in' do
      visit login_path
      fill_in :name, :with => 'Joe'
      fill_in :password, :with => 'Password'
      click_link_or_button 'submit'
end

RSpec 기능은 오이 기능이 아니라 다른 단계 정의를 작성하는 데 어려움을 겪지 않고 동일한 기능을 수행한다고 생각합니다.

그 외에는 순전히 자신의 취향입니다.

이것이 조금 이해하는 데 도움이되기를 바랍니다.


0

제 생각에는 실천과 구체적인 틀을 구별하는 것이 가장 중요합니다. 오이는 BDD가 아니며 RSpec은 TDD가 아닙니다.

시스템 RSpec의 우수한 도구를 테스트하려면 RSpec을 사용하여 TDD 또는 BDD를 수행 할 수 있습니다. 실제로 TDD와 BDD는 동일합니다. 누군가가 "BDD가 TDD를 올바르게 수행했다"고 말하고 나는 BDD가 주로 메소드 / 클래스를 테스트하는 대신 기능 / 동작을 테스트한다는 것에 동의합니다. 실제로 Kent Beck의 TDD는 기능에 대해 설명하지만 BDD는 많은 사람들이이 중요한 차이점을 이해하고 Dan North가 개발 커뮤니티에 크게 기여한 것을 이해하도록 돕습니다.

오이로 인해 비즈니스 사람이나 제품 소유자가 팀이 시나리오를 작성하거나 수정하는 데 도움을 줄 수있는 경우와 같이 비즈니스 사람들과 의사 소통하기 위해 더 나은 도구가 필요하다고 생각되면 Cucumber를 사용하십시오. 다른 사람들은 오이를 좋아합니다.이 시나리오가 실제로 시스템에 대한 실제 문서화이기 때문에 오이를 좋아합니다.이 유형의 문서가 필요하다고 생각되면 오이를 사용해보십시오.

요약해서 말하자면:

  • TDD / BDD를 직접하거나 팀을 구성하려는 경우 RSpec을 사용해보십시오.
  • 사용자 히스토리 및 시나리오를 사용하여 비즈니스와 통신하는 더 좋은 방법을 원하면 오이를 사용해보십시오.
  • 시스템 기능을 실시간으로 문서화하려면 오이를 사용해보십시오.

물론 마지막 두 가지는 높은 비용과 관련이 있으며, 실제로 필요한지 노력할 가치가 있는지 평가해야합니다.이 오프 코스는 프로젝트와 환경 및 결정에 달려 있습니다.

그러나 RSpec과 Cucumber는 도구 일 뿐이며 도구는 구체적인 문제를 해결하고, 어떤 문제를 해결하고 싶습니까?이 질문을하고 올바른 도구를 선택하기에 더 나은 위치에있을 것임을 항상 기억하십시오. X 또는 Y 프레임 워크 / 툴 / 라이브러리 / 기술을 사용하는 것이 아니라이 결정을 내릴 수있는 프로그래머가 되십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.