Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เริ่มต้นการทดสอบระบบใน Rails ด้วย Minitest

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

เพิ่มการทดสอบระบบลงใน Rails stack ใน Rails 5.1 เมื่อฉันนั่งลงเพื่อเริ่มใช้งาน ฉันพบว่าเป็นการยากที่จะรวบรวมข้อมูลที่เกี่ยวข้องและเป็นปัจจุบันที่ไม่เกี่ยวกับ RSpec นี่คือข้อมูลล่าสุดและดีที่สุดที่ฉันได้รวบรวมไว้ในการทำงานกับการทดสอบระบบด้วย Minitest

ข้อมูลเบื้องต้นเกี่ยวกับการทดสอบระบบ

ในศัพท์แสง Rails การทดสอบระบบหมายถึง "การทดสอบแอปพลิเคชันทั้งระบบ" ทำได้โดยใช้เบราว์เซอร์ในการทดสอบ แทนที่จะทดสอบส่วนต่างๆ แยกกัน ด้วยการทดสอบระบบ เราสามารถทดสอบ "เวิร์กโฟลว์" ทั้งหมดได้ เช่นเดียวกับที่ผู้ใช้ต้องเผชิญขณะโต้ตอบกับแอปของเรา ซึ่งรวมถึงส่วน JavaScript ในทางปฏิบัติ หมายความว่าเราไม่ต้องการให้การทดสอบระบบตรวจสอบ if บันทึกถูกสร้างขึ้นในฐานข้อมูลเมื่อผู้ใช้คลิกปุ่ม เราแค่ทดสอบว่าบันทึกใหม่นั้นปรากฏบนหน้าจอของพวกเขาหรือไม่ การทดสอบการโต้ตอบกับผู้ใช้ประเภทนี้เรียกอีกอย่างว่าการทดสอบคุณสมบัติหรือการทดสอบการยอมรับ ต่างจากการทดสอบการรวม:การทดสอบการผสานรวมมีไว้สำหรับทดสอบพฤติกรรม โดยเฉพาะอย่างยิ่งในทุกส่วนของแอปร่วมกัน แต่ไม่ใช่ผ่านอินเทอร์เฟซผู้ใช้

การกำหนดค่า

การกำหนดค่านั้นง่ายมากจนเกือบสับสน

Capybara gem ใช้สำหรับโต้ตอบกับเบราว์เซอร์ ผ่าน Capybara ที่เราสามารถทำให้การทดสอบไปที่หน้า กรอกแบบฟอร์ม คลิกลิงก์และปุ่มต่างๆ หากคุณเคยทำงานกับ Capybara มาก่อน คุณจะทราบทุกสิ่งที่คุณต้องประสานงานเพื่อให้มันใช้งานได้กับกลยุทธ์การล้างฐานข้อมูลและการกำหนดค่าเบราว์เซอร์ Hooray for the Rails ตั้งค่าการทดสอบระบบ:ดูแลการกำหนดค่าทั้งหมดที่จำเป็นสำหรับการทำงานกับ Capybara ทันทีที่แกะกล่อง เพื่อให้เราสามารถมุ่งเน้นไปที่การเขียนทดสอบจริง โดยค่าเริ่มต้นจะใช้ไดรเวอร์ซีลีเนียม

จากเอกสาร:“โดยค่าเริ่มต้น ActionDispatch::SystemTestCase ขับเคลื่อนโดยไดรเวอร์ Selenium พร้อมเบราว์เซอร์ Chrome และขนาดเบราว์เซอร์ 1400x1400” ไดรเวอร์ Selenium แตกต่างจากค่าเริ่มต้นของ Capybara และได้รับเลือกเนื่องจากใช้งานได้กับ Javascript

การตั้งค่าทั้งหมดมีอยู่ใน application_system_test_case.rb . สิ่งเดียวที่คุณต้องทำคือต้องมีสิ่งนี้ในแต่ละไฟล์ทดสอบ

#application_system_test_case.rb (default)
 
 
require "test_helper"
 
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
end

หากคุณสร้างแอปใหม่ด้วย Rails 6 นี่คือสิ่งที่คุณต้องการจริงๆ ความหมาย:คุณสามารถข้ามคำแนะนำทั้งหมดเกี่ยวกับวิธีตั้งค่าไดรเวอร์ Selenium ที่อินเทอร์เน็ตแสดงสำหรับการทดสอบอินเทอร์เฟซผู้ใช้หรือการทดสอบคุณสมบัติของ RSpec

ในแอปที่มีอยู่ การสร้างโครงจะสร้าง application_system_test_case.rb โดยอัตโนมัติ และทุกสิ่งที่จำเป็นสำหรับการทดสอบระบบ

เมื่อ Eileen Uchitelle แนะนำการทดสอบระบบ Chrome ได้รับเลือกจาก Firefox เพราะในตอนนั้น FF เล่นไม่ค่อยดีกับ Selenium ที่ได้รับการแก้ไขใน Firefox รุ่นที่ใหม่กว่า ดังนั้นฉันจึงแทนที่ Chrome ด้วย FF เช่น:

#application_system_test_case.rb (change driver to Firefox)
 
require "test_helper"
 
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :firefox, screen_size: [1400, 1400]
end

(ตอนแรกฉันรัน $ rails db:test:prepare after เปลี่ยนไดรเวอร์เพื่อให้แน่ใจว่าเริ่มต้นใหม่ทั้งหมด แต่ตัวดำเนินการทดสอบใหม่ก็ดูแลเช่นกัน:การเรียกใช้การทดสอบจะทำงานอัตโนมัติ :prepare. )

ใหม่ใน Rails 6

ตั้งแต่เปิดตัวการทดสอบระบบใน 5.1 ได้เลิกใช้งาน chromedriver-helper gem แล้ว ในแอพ Rails 6 ใหม่ จะถูกแทนที่ด้วย webdrivers gem ในแอป Rails 5 คุณควรแทนที่ chromedriver-helper ด้วย webdrivers gem หากคุณยังไม่ได้ทำ ด้วย webdrivers gem คุณไม่จำเป็นต้องมี selenium-webdriver gem webdrivers ดูแลสิ่งนั้นด้วย เกร็ดน่ารู้:Rails 6 ให้ทั้งซีลีเนียม-webdriver gem และอัญมณีของไดรเวอร์เว็บ

ตรวจสุขภาพ:สิ่งที่คุณไม่ต้องการอีกต่อไป

การตั้งค่า Capybara เคยเป็นความเจ็บปวด ยังไม่ชัดเจนว่าคุณต้องตั้งค่าอะไรตั้งแต่เริ่มต้น ซึ่งรวมถึงการค้นหากลยุทธ์การล้างฐานข้อมูลที่ถูกต้อง การขึ้นต่อกันของ capybara-webkit gem และข้อกำหนดที่ไม่คาดคิดทุกประเภทที่คุณต้องคิดก่อนจึงจะเริ่มเขียนการทดสอบได้ ตอนนี้ Rails มีทุกอย่างที่เราต้องการแล้ว ฉันพบว่าส่วนที่สับสนเพียงอย่างเดียวคือข้อมูลทั้งหมดที่มีอยู่ในคู่มือและเอกสารประกอบที่ล้าสมัยไปแล้ว ต่อไปนี้คือสิ่งที่เรามองข้ามไม่ได้ในตอนนี้

อย่างแรก การตั้งค่า Rails ที่เตรียมไว้ล่วงหน้าหมายความว่าเราสามารถละเว้น gem เพิ่มเติมที่มักถูกกล่าวถึงเกี่ยวกับการทดสอบ เช่น minitest-rails-capybara หรือส่วนเพิ่มเติมสำหรับ Minitest:เอาต์พุตที่มีสีเดียวกัน การทดสอบที่ล้มเหลวอย่างรวดเร็ว และรันหนึ่งบรรทัด/การทดสอบ ฟีเจอร์ Minitest เหล่านี้อยู่ในตัวดำเนินการทดสอบที่เปิดตัวใน Rails 5.0

ไม่จำเป็นต้องมีฐานข้อมูล_cleaner gem อีกต่อไป Rails ทำความสะอาดให้เรา ('การทดสอบการทำธุรกรรม')

เนื่องจาก Rails ใช้ Selenium แทนค่าเริ่มต้นของ Capybara เราจึงไม่ต้องการ capybara-webkit และเราไม่จำเป็นต้องดำเนินการพิเศษใดๆ เพื่อรวมการทดสอบองค์ประกอบ Javascript

คุณไม่จำเป็นต้องใช้ save_and_open_screenshot ของ Capybara ด้วยซ้ำ เนื่องจาก Rails มี take_screenshot กระบวนการ. มันบันทึกภาพหน้าจอใน /tmp และให้ลิงก์ในผลการทดสอบเพื่อให้เข้าถึงได้ง่าย

การเลือกระหว่างเบราว์เซอร์จริงกับเบราว์เซอร์หัวขาด

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

ถ้าไม่อยากหัวขาดก็มี headless_chrome และ headless_firefox . หากต้องการใช้ จำเป็นต้องเปลี่ยนแปลงเล็กน้อย:

# To change driver to headless_*
#application_system_test_case.rb (change driver to headless_*:)
 
require "test_helper"
 
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :headless_firefox
end

หมายเหตุ:ในเอกสารของ Rails และในหลายบทความที่ฉันพบ Poltergeist ได้รับการเสนอชื่อให้เป็นตัวเลือกสำหรับไดรเวอร์ เคยเป็นที่นิยมในฐานะไดรเวอร์ - หัวขาด - PhantomJS สำหรับ Capybara PhantomJS ถูกละทิ้ง ดังนั้น ไม่จำเป็นต้องลงรายละเอียด—เหตุผลที่ฉันพูดถึงที่นี่ก็เพราะว่า Poltergeist และ PhantomJS ยังคงถูกกล่าวถึงในเอกสาร Rails

มีการปรับแต่งเพิ่มเติมที่คุณสามารถทำได้ แต่ในการเริ่มต้น นี่คือทั้งหมดที่คุณต้องการจริงๆ

ดำเนินการทดสอบ

$ rails test จะทำการทดสอบทั้งหมดยกเว้นการทดสอบระบบ คุณต้องเรียกใช้ $ rails test:system . อย่างชัดเจน . (เรื่องน่ารู้:$ rails คำสั่งจะทำงานผ่าน bin/rails เสมอ ไม่ต้องพิมพ์ $ bin/rails อีกต่อไป)

  • เรียกใช้การทดสอบระบบทั้งหมด:$ rails test:system
  • เรียกใช้การทดสอบในไฟล์เฉพาะ (ที่นี่:users_test.rb)$ rails test/system/users_test
  • ... หรือการทดสอบเฉพาะอย่างใดอย่างหนึ่ง:$ rails test test/system/users_test.rb:21
  • ในการรันการทดสอบทั้งหมด:รันการทดสอบระบบก่อน:$ rails test:system test

หมายเหตุ:แฟล็กตัวเลือกใช้ไม่ได้กับ test:system; หากคุณต้องการใช้แฟล็กเช่น -f (สำหรับล้มเหลวเร็ว) หรือ -v (สำหรับรายละเอียด) ให้ใช้ $ rails test test/system -v -f

ทดสอบอะไร (ไม่)

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

เมื่อเลือกหัวข้อการทดสอบ ฉันพยายามค้นหาเอนทิตีเพื่อทดสอบที่สะท้อนว่าผู้ใช้ใช้แอปอย่างไร สำหรับการตั้งชื่อการทดสอบของฉัน ฉันยืมหลักการตั้งชื่อของ GitLab ที่ ROLE_ACTION_test.rb ซึ่งเหมาะกับแนวทางนี้เป็นอย่างดี ตัวอย่างเช่น:user_shares_card_test.rb .

เกร็ดความรู้ทั่วไป

  • หากคุณใช้ Devise สำหรับการตรวจสอบสิทธิ์ คุณสามารถใช้ตัวช่วยการรวม Devise เพื่อเข้าสู่ระบบและออกจากระบบผู้ใช้ทดสอบ เพิ่ม include Devise::Test::IntegrationHelpers ไปยังคลาสทดสอบหรือเพิ่มลงใน test_helper.rb ไฟล์เพื่อให้พร้อมใช้งานในการทดสอบทั้งหมด ตอนนี้คุณสามารถสร้างผู้ใช้และ sign_in(@user) . หากคุณใส่สิ่งนั้นใน setup เมธอด คุณไม่จำเป็นต้องออกจากระบบผู้ใช้ในการรื้อถอน Rails จะดูแลทำความสะอาดสิ่งที่อยู่ในวิธีการตั้งค่า
  • การทำงานกับแบบฟอร์ม เป็นเรื่องน่าดึงดูดใจที่จะอ้างอิงรหัสที่ Rails สร้างโดยอัตโนมัติจากชื่อรุ่น + ชื่อฟิลด์และประเภทปุ่มสำหรับ click_on ส. ( fill_in "user_email" , click_on :commit ). แต่เนื่องจากการทดสอบระบบเกี่ยวกับสิ่งที่ผู้ใช้จะเห็นจริงๆ บนหน้าจอ ควรใช้องค์ประกอบที่มองเห็นได้ เช่น ข้อความ ตัวเลือกที่สมเหตุสมผลคือต้องมีคีย์อ้างอิงในไฟล์โลแคล i18n และใช้คีย์เหล่านั้นแทนข้อความตามตัวอักษรที่เปลี่ยนแปลงตลอดเวลา (fill_in :user_email ). Capybara ค้นหาข้อความที่มีไวยากรณ์ I18n แบบเต็มเท่านั้น:assert_selector "h1", text: I18n.t("activerecord.models.things") .
  • ผู้ช่วยพาธจะรวมอยู่โดยค่าเริ่มต้น สำหรับบางไลบรารี คุณต้องรวมตัวช่วยในคลาสทดสอบ เช่น include ActionMailer::TestHelper เพื่อใช้ assert_emails วิธีการ
  • สร้างคลาสที่กำหนดเองเพื่อเรียกใช้การทดสอบกับหน้าจอขนาดต่างๆ ดูคำแนะนำ
  • คุณสมบัติภาพหน้าจอยังสามารถใช้เพื่อจับภาพหน้าจอสำหรับเอกสารและสื่อส่งเสริมการขายของคุณ หากคุณทำให้เป็น screencast และทำให้ความเร็วในการเล่นช้าลง คุณจะมีวิดีโอผลิตภัณฑ์ในไม่กี่นาที!
  • Rails เป็นเครื่องกำเนิดสำหรับการทดสอบระบบ
  • Minitest ใน Rails นั้นแตกต่างจาก Minitest เล็กน้อย และยังเพิ่มวิธีการและการยืนยันเฉพาะของ Rails ตรวจสอบเอกสาร Rails ก่อนเอกสาร Minitest

ฉันสนุกมากกับการทดสอบระบบ และส่วนใหญ่แล้ว ต้องขอบคุณความง่ายในการใช้งานทันทีที่แกะจากกล่อง

บทสรุป

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