RSpec และแตงกวาคุ้มค่าหรือไม่


12

ฉันรู้ว่าโปรแกรมเมอร์ของ RoR ส่วนใหญ่กำลังทดสอบผู้ติดยาและฉันเข้าใจถึงข้อดีของชุดทดสอบขนาดใหญ่ แต่เมื่อฉันเริ่มการทดสอบฉันไม่เคยได้รับชุดใหญ่ดังกล่าวและฉันมักจะสงสัยว่า "ฉันกำลังทดสอบวิธีที่ถูกต้องหรือไม่ ฉันมักจะเกี่ยวข้องกับการทดสอบการรวมการทดสอบเฉพาะวิธีที่แอปพลิเคชันทำงาน

ก่อนอื่นการทดสอบคุ้มค่าหรือไม่ ฉันหมายถึงเวลาที่ใช้ในการทดสอบการเขียนคุ้มค่าหรือไม่

จากนั้นฉันใช้ RSpec ฉันเพิ่งค้นพบแตงกวาใช้มันซักพัก แต่ฉันไม่รู้ว่าการเขียนทุกขั้นตอนเหล่านี้คุ้มค่าหรือไม่ ฉันรู้ว่าฉันสามารถนำขั้นตอนมาใช้ใหม่ได้ แต่ฉันไม่เคยรู้เลยว่าขั้นตอนเหล่านี้สมบูรณ์เกินไปหรือไม่: ตัวอย่างเช่นฉันใช้Given I am logged in as (.+)แต่ฉันไม่รู้ว่าต้องพูดในคำจำกัดความของมันหรือไม่Given there's a user called $1เพราะสามารถสร้างผู้ใช้ซ้ำได้ แต่นั่นก็ไม่คุ้มค่าที่จะก้าวไปก่อนGiven I am logged in as (.+)เสมอ มันเป็นโค้ดจำนวนมากที่ไม่ค่อยจะมีประโยชน์ ฉันเดาว่าไม่มีข้อผิดพลาดใหม่ ๆ ในส่วนที่ทดสอบทุกวัน ... แตงกวาคุ้มค่าจริง ๆ เมื่อเทียบกับ RSpec หรือไม่

คำตอบ:


13

'ah-ha!' ของฉัน ช่วงเวลาที่เกี่ยวกับการทดสอบในรูบีและทางรถไฟมาเมื่อผมนั่งลงและจริงๆอ่านทรัพยากรที่ชัดเจนเกี่ยวกับเรื่องที่rspecและแตงกวาหนังสือ ฉันแบ่งปันความรังเกียจครั้งแรกของคุณกับแตงกวา แต่แล้วฉันก็ตระหนักว่าฉันกำลังดูภาพจากมุมที่ค่อนข้างผิด

โดยพื้นฐานแล้วแตงกวานั้นเกี่ยวกับ BDD (การพัฒนาที่ขับเคลื่อนด้วยพฤติกรรม) - คุณใช้แตงกวาในการวางแผนคุณสมบัติของคุณสิ่งที่คุณกำลังจะทำต่อไป อืมถัดไปคุณต้องการให้ผู้ใช้สามารถโปรโมตโพสต์ในฟอรัมหรือบางสิ่ง (เพื่อขโมยตัวอย่าง)) ดังนั้นคุณจึงเขียนสิ่งที่ง่าย

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

First run - การกำหนดขั้นตอนแรกของฉันไม่ได้ถูกกำหนด คัดลอกบล็อกเพื่อกำหนดในพูด 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 หรืออะไรบางอย่างที่โพสต์ ajax ไปยังตัวควบคุมซึ่งส่งคืน JSON หรือบางส่วน ดังนั้นตอนนี้คุณสามารถไปสู่การทดสอบ Rspec ได้อย่างแท้จริง

  • ทดสอบมุมมองของคุณเพื่อให้แน่ใจว่าภาพ +1 นั้นปรากฏขึ้น
  • ทดสอบคอนโทรลเลอร์ของคุณว่าทำงานอย่างถูกต้องเมื่อได้รับคำขอ ajax ของรูปแบบที่ถูกต้อง (ทั้งเส้นทางที่มีความสุขและไม่มีความสุข - จะเกิดอะไรขึ้นถ้าได้รับรหัสโพสต์ที่ไม่ถูกต้องจะเกิดอะไรขึ้นถ้าผู้ใช้ มันเพิ่มจำนวนคะแนนถูกต้องหรือไม่?)
  • ทดสอบจาวาสคริปต์ของคุณว่าตอบสนองถูกต้องเมื่อให้ JSB ในรูปแบบที่ถูกต้อง (อัปเดต +1 ภาพเพื่อแสดงว่ามีการใช้งานหรือไม่ (นึกถึง Google+ ที่นี่ ... ) แสดงข้อความขอบคุณหรือไม่เป็นต้น )

ทั้งหมดนี้ไม่ได้ส่งผลกระทบต่อพฤติกรรม แต่เมื่อคุณจัดการกับการทดสอบระดับล่างเสร็จแล้วมันจะไม่สำคัญที่จะต้องกรอกคำจำกัดความขั้นตอนสำหรับวิธีการลงคะแนนโพสต์ click_link '+1'มันอาจจะเป็นง่ายๆเป็น และขั้นตอนที่เหลือคือผลการทดสอบซึ่งควรทำอีกครั้งอย่างตรงไปตรงมา และเมื่อคุณทำเสร็จแล้วคุณจะรู้ว่าคุณสมบัติของคุณเสร็จสมบูรณ์แล้ว หากมีการเปลี่ยนแปลงพฤติกรรมที่จำเป็นคุณสามารถปรับแต่งคุณสมบัติของคุณได้มิฉะนั้นคุณสามารถปรับแต่งรหัสการใช้งานของคุณอย่างปลอดภัย

ฉันหวังว่านี่จะสมเหตุสมผล มันทั้งหมดอยู่ด้านบนของหัวของฉัน แต่ฉันคิดว่ามันแสดงให้เห็นถึงความแตกต่างระหว่าง BDD และ TDD และทำไม Cucumber และ RSpec ตอบสนองความต้องการที่แตกต่างกัน


นี่เป็นประโยชน์กับฉันจริงๆ แต่ฉันมีคำถามอีกหนึ่งข้อ: ฉันได้เริ่มโครงการโดยใช้ RSpec เพื่อทดสอบทั้งคอนโทรลเลอร์และมุมมองโค้ดมีการทดสอบประมาณ 90% คุณคิดว่าฉันต้องการแตงกวาจริงๆและใช้เวลาในการเขียนขั้นตอนและสถานการณ์ตอนนี้หรือไม่? ฉันหมายความว่าฉันสามารถทำทุกอย่างกับ RSpec ต่อไป
Cydonia7

@Skyydreamer: อาจไม่จำเป็น แต่อาจเป็นวิธีปฏิบัติที่ดี ตราบใดที่คุณกำลังทำทดสอบคุณอยู่ในการติดตามขวา :)
sevenseacat

10

การทดสอบในความคิดของฉันเป็นศิลปะ การทำ TDD (โดยใช้ RSpec หรือกรอบงานอื่น ๆ ) เริ่มรู้สึกว่าคุณ "เสียเวลา" สิ่งนี้สามารถเข้าใจได้เพราะคุณไม่ได้เขียนรหัสการผลิตใด ๆ

อย่างไรก็ตามคุณเริ่มเห็นประโยชน์ของ TDD เมื่อคุณต้องการปรับปรุง codebase ของคุณในขณะที่มั่นใจว่าทุกอย่างยังคงทำงานได้ TDD ช่วยให้คุณตรวจจับข้อผิดพลาดการถดถอยได้เร็วที่สุด การทำเช่นนี้ช่วยให้ฉันทำงานได้หลายวันเพราะฉันได้ทำการทดสอบที่เน้นข้อผิดพลาด

นอกจากนี้การทดสอบจะมีประโยชน์สำหรับการตรวจสอบโค้ดเนื่องจากผู้ตรวจทานของคุณสามารถดูสถานการณ์ที่คุณกำลังทดสอบและวิธีการใช้รหัสของคุณ

เมื่อคุณเข้าสู่วงสวิงของ TDD การทำสิ่งอื่นจะรู้สึกผิด


2
+1 แม้ว่าการพูดจากประสบการณ์ "การก้าวเข้าสู่ TDD" เป็นความพยายามของ Herculean ในตัวของมันเองและยากมากที่จะทำเพื่อนักพัฒนาส่วนใหญ่
Wayne Molina

@Wayne M: เห็นด้วย การเข้าสู่ร่อง TDD นั้นยาก แต่ผลประโยชน์มีมากมาย :)
David Weiser

มันยากที่จะวางมันเบา .. ได้พยายามมานานหลายปีที่จะได้รับหัวของฉันรอบมัน :)
เวย์น Molina

โอ้ใช่มันคุ้มค่ากับความพยายาม
sevenseacat

2

สิ่งที่ฉันใช้คือคุณอยู่ตรงหน้าแตงกวา การเขียนทุกขั้นตอนเหล่านั้นเป็นปัญหามากและผลประโยชน์ไม่ได้แสดงให้เห็นถึงความเจ็บปวด ฉันได้เขียนอย่างกว้างขวางเกี่ยวกับข้อเสียหกข้อของการใช้แตงกวาที่นี่: ทำไมต้องกังวลกับการทดสอบแตงกวา?

การทดสอบหน่วยและการทดสอบการรวมปกติที่ทำได้ทั้งกับ Rspec หรือ Test :: Unit มีเหตุผลมากมาย แต่โชคดีที่สิ่งเหล่านี้เขียนได้เร็วกว่าการทดสอบด้วยแตงกวา สำหรับคนที่คุณสามารถใช้ทับทิมบริสุทธิ์แทนที่จะต้องต่อสู้กับคำศัพท์และไวยากรณ์ที่น่าอึดอัดใจของ Gherkin


2
ฉันค่อนข้างมั่นใจได้ว่าฉันไม่เห็นด้วยกับทุกประเด็นของคุณเกี่ยวกับการทดสอบแตงกวา * มันไม่แตกตัวแก้ไขข้อความที่ดี (gedit ของฉันจะเน้นและเติมข้อความอัตโนมัติให้ดี), * คุณไม่ควรคัดลอกการตั้งค่าการทดสอบใด ๆ จากการตั้งค่า Rspec ที่มีอยู่ไปยังการตั้งค่าแตงกวาของคุณ (การทดสอบสองชุดทำงานในระดับที่แตกต่างกันอย่างมากมาย ของ granularity) * หากคุณไม่สามารถสอดคล้องกับการตั้งชื่อหน้าเว็บของคุณซึ่งไม่ใช่ความผิดของแตงกวา (Rails จะไม่ให้คุณโทรหาเส้นทางที่แตกต่างกันในแต่ละวันดังนั้นทำไมแตงกวาควรทำอย่างไร)
sevenseacat

1
* คุณพูดว่าการประชุมเกี่ยวกับไฟล์ขั้นตอนคืออะไร แต่ถ้าบอกว่าคุณไม่รู้ว่าจะทำตามอนุสัญญาอย่างไร? เหตุใดการโปรโมตโพสต์จึงเป็นสิ่งอื่นนอกเหนือจาก post_steps.rb * ฟีเจอร์ของคุณไม่ควรเป็นรหัสดังนั้นความไม่สะดวกในการใช้คำ - คุณสมบัติของคุณเป็นเอกสารเกี่ยวกับการทำงานของแอพของคุณ * และสุดท้ายฉันเท่านั้นที่สามารถวิจารณ์ 'ท้อใจรหัสนำมาใช้กับที่คุณกำลังทำมันผิด
sevenseacat

2

RSpec testing is a definite mustสิ่งที่ผมเองเชื่อว่าเป็นที่ สมมติว่าตัวอย่างที่คุณต้องการเขียนคุณสมบัติใหม่และที่มีการอ้างอิงถึงคุณสมบัติอื่น ๆ และคุณลักษณะนั้นอาจถูกอ้างอิงกับโมดูลหรือวิธีการอื่น ดังนั้นคุณจะแน่ใจได้อย่างไรว่าสิ่งที่คุณเขียนไม่ได้ทำลายส่วนอื่น ๆ ของแอปพลิเคชัน

สมมติว่าคุณมีแอปพลิเคชั่นขนาดใหญ่และมีการเขียนโค้ดเล็กน้อยเมื่อเทียบกับแอปพลิเคชันโดยรวมคุณจะทดสอบแอปพลิเคชันทั้งหมดอีกครั้งโดยคลิกที่ลิงก์ในแอปพลิเคชันทุกครั้งเพื่อให้แน่ใจว่าใช้ได้ทุกครั้งหรือไม่

อย่างไรก็ตามฉันเชื่อว่าการทดสอบด้วยแตงกวานั้นไม่จำเป็น ฉันคิดว่าการทดสอบการรวมเข้าด้วยกันโดยใช้ RSpec นั้นเหมาะสมกว่าและจนกว่าคุณจะได้รับการตรวจสอบจากลูกค้าของคุณ ซึ่งในประสบการณ์ของฉันคือหายาก หากทีมของคุณประกอบด้วยนักพัฒนาซอฟต์แวร์ทั้งหมดฉันคิดว่าคุณควรแทนที่ขั้นตอนแตงกวาสำหรับการทดสอบคุณลักษณะ RSpec และฉันคิดว่าหลังจาก 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 เป็นเครื่องมือที่ดีคุณสามารถทำ TDD หรือ BDD กับ RSpec ได้จริง ๆ แล้ว TDD และ BDD นั้นเป็นสิ่งเดียวกัน บางคนบอกว่า "BDD มันถูกต้อง TDD" และฉันก็เห็นด้วยอย่างยิ่งกับ BDD เป็นหลักเกี่ยวกับการทดสอบคุณสมบัติ / พฤติกรรมแทนการทดสอบวิธีการ / ชั้นเรียน ในความเป็นจริง TDD ที่ Kent Beck อธิบายเกี่ยวกับคุณสมบัติ แต่ BDD ช่วยผู้คนจำนวนมากในการทำความเข้าใจความแตกต่างที่สำคัญนี้และมีส่วนร่วมอย่างมากจากแดนเหนือสู่ชุมชนการพัฒนา

ใช้แตงกวาถ้าคุณรู้สึกว่าคุณต้องการเครื่องมือที่ดีกว่าในการสื่อสารกับนักธุรกิจตัวอย่างเช่นถ้าแตงกวาอนุญาตให้นักธุรกิจหรือเจ้าของผลิตภัณฑ์ของคุณช่วยทีมในการเขียนหรือแก้ไขสถานการณ์ คนอื่น ๆ เช่นแตงกวาเนื่องจากสถานการณ์นี้เป็นเอกสารสดที่ดีมากของระบบหากคุณรู้สึกว่าคุณต้องการเอกสารประเภทนี้ลองใช้แตงกวา

สรุป:

  • หากคุณต้องการทำ TDD / BDD ด้วยตัวคุณเองหรือคุณทีม -> ลอง RSpec
  • หากคุณต้องการวิธีที่ดีกว่าในการสื่อสารกับธุรกิจด้วยประวัติผู้ใช้และสถานการณ์จำลอง -> ลองใช้แตงกวา
  • หากคุณต้องการเอกสารสดของคุณสมบัติระบบของคุณ -> ลองแตงกวา

แน่นอนว่าสองคนสุดท้ายมีค่าใช้จ่ายสูงคุณจำเป็นต้องประเมินว่าคุณต้องการสิ่งนั้นและคุ้มค่ากับความพยายามหรือไม่หลักสูตรนี้ขึ้นอยู่กับโครงการและสภาพแวดล้อมของคุณและการตัดสินใจขึ้นอยู่กับคุณ

แต่โปรดจำไว้เสมอว่า RSpec และ Cucumber เป็นเพียงเครื่องมือและเครื่องมือในการแก้ปัญหาที่เป็นรูปธรรมปัญหาใดที่คุณต้องการแก้ไขถามคำถามนี้ด้วยตัวคุณเองและคุณอาจอยู่ในตำแหน่งที่ดีกว่าในการเลือกเครื่องมือที่เหมาะสม เป็นโปรแกรมเมอร์ที่ดีกว่าเกี่ยวกับการตัดสินใจนี้ไม่เกี่ยวกับการใช้ X หรือ Y framework / เครื่องมือ / ไลบรารี่ / เทคโนโลยี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.