Minitest คืออะไร
Minitest คือ ไลบรารีทดสอบ Ruby ช่วยให้คุณเขียนการทดสอบสำหรับรูปแบบ TDD ของโค้ดได้
เป็นเฟรมเวิร์กการทดสอบเริ่มต้นสำหรับรายการโปรดของ Rails &DHH
บางคนชอบเพราะความเรียบง่ายและมีโค้ดน้อยเมื่อเทียบกับทางเลือกหลัก (RSpec)
อย่างที่คุณเห็นในภาพนี้ :
ตอนนี้โพสต์นี้ไม่ได้เกี่ยวกับว่าคุณควรเลือกอันไหนหรืออันไหน "ดีกว่า"
โพสต์นี้เกี่ยวกับ วิธีการทำงานของ Minitest .
หากคุณสงสัยว่า:เพียงแค่ใช้อันที่คุณชอบที่สุด แต่คุณควรคุ้นเคยกับทั้งสองอย่าง🙂
ถ้าคุณชอบที่จะเรียนรู้ว่าสิ่งต่าง ๆ ทำงานอย่างไร คุณจะสนุกกับโพสต์นี้…
ไม่ว่าคุณจะชอบไลบรารี่การทดสอบใด
มาดูกันดีกว่า
สิ่งหนึ่งที่ผู้คนแนะนำ (รวมถึงฉันด้วย) คือการอ่านซอร์สโค้ดเพราะเป็นวิธีที่ดีในการเรียนรู้วิธีการทำงานของสิ่งต่างๆ และยังเป็นวิธีที่ยอดเยี่ยมในการรับลูกเล่น Ruby ใหม่ๆ ที่คุณอาจไม่เคยเห็นมาก่อน
นั่นคือสิ่งที่ฉันทำกับ Minitest และฉันจะแบ่งปันสิ่งที่ได้เรียนรู้กับคุณ
มาเริ่มด้วยโค้ดทดสอบจริงกันก่อน เราจะได้คุยกันว่าสิ่งนี้เกี่ยวข้องกับการทำงานของ Minitest อย่างไร
class Thingy < Minitest::Test def test_it_works assert_equal 1, 1 end end
Minitest มีวิธีการทดสอบเหล่านี้อย่างไร (เช่น test_it_works
) และเรียกใช้หรือไม่
คำตอบคือ 'เวทมนต์' ของ metaprogramming เล็กน้อย:
def self.methods_matching(re) public_instance_methods(true).grep(re).map(&:to_s) end
มาจาก Runnable
คลาสที่กำหนดไว้ใน lib/minitest.rb
. รหัสนี้ค้นหาวิธีการอินสแตนซ์ทั้งหมดสำหรับคลาสปัจจุบัน &เลือกวิธีที่ตรงกับนิพจน์ทั่วไป
ดังนั้นหากคุณเรียก methods_matching(/^test_/)
คุณจะได้อาร์เรย์ที่มีชื่อเมธอดทั้งหมดที่ขึ้นต้นด้วย test_
.
Minitest ทำงานอย่างไร
Minitest พบ test_
. เหล่านี้ เมธอดแล้วเรียกมันว่า
ที่เกิดขึ้นใน lib/minitest/test.rb
ไฟล์ (และเพื่อให้เฉพาะเจาะจงมากขึ้นใน runnable_methods
method ซึ่งส่งคืนรายการเมธอดตามลำดับแบบสุ่ม)
ประเด็นสำคัญ :
ใช้งานได้เพราะ Minitest::Test
เป็นคลาสย่อยของ Runnable
.
จิ๊กซอว์ชิ้นสุดท้ายคือ run
วิธีการเรียนใน Runnable
ซึ่งทำการกรองเพิ่มเติมแล้วเรียก run_one_method
กับทุกชื่อเมธอด &วัตถุนักข่าว
นี่คือรหัส :
filtered_methods.each do |method_name| run_one_method self, method_name, reporter end
และจบลงด้วยการเรียก run
วิธีการอินสแตนซ์ใน Minitest::Test
:
capture_exceptions do before_setup; setup; after_setup self.send self.name end
Send เป็นเมธอด metaprogramming ที่ให้คุณเรียกเมธอดอื่นบนอ็อบเจกต์ใดก็ได้โดยใช้สตริงหรือสัญลักษณ์
capture_exceptions
บล็อกใช้เพื่อบันทึกความล้มเหลวในการทดสอบและข้อยกเว้นที่เกิดจากโค้ดของคุณ
def capture_exceptions # :nodoc: yield rescue *PASSTHROUGH_EXCEPTIONS raise rescue Assertion => e self.failures << e rescue Exception => e self.failures << UnexpectedError.new(e) end
นี่คือวิธีที่ฉันชอบอ่านโค้ด เน้นด้านใดด้านหนึ่งหรือคุณลักษณะจากโค้ดที่คุณกำลังอ่าน จากนั้นลอกเลเยอร์ออกเหมือนหัวหอม
หากคุณไม่ทราบความหมาย เช่น คีย์เวิร์ดผลตอบแทน ให้มองหา
เป็นส่วนหนึ่งของกระบวนการเรียนรู้!
บทสรุป
ในโพสต์นี้ คุณได้เรียนรู้วิธีที่ Minitest ใช้ metaprogramming เพื่อค้นหาวิธีการทดสอบของคุณและเรียกพวกเขาว่า คุณยังได้เรียนรู้วิธีบันทึกข้อผิดพลาดและข้อยกเว้นในการทดสอบลงในอาร์เรย์สำหรับการรายงาน
คุณชอบบทความที่ "วิเคราะห์โค้ด" แบบนี้ไหม
แจ้งให้เราทราบในความคิดเห็น 🙂
อย่าลืมแชร์สิ่งนี้บนโซเชียลเน็ตเวิร์กที่คุณชื่นชอบ &สมัครรับจดหมายข่าวของฉันด้านล่าง หากคุณยังไม่ได้เป็นส่วนหนึ่งของนักพัฒนา Ruby กว่า 7000 รายเช่นคุณที่ต้องการพัฒนาทักษะของพวกเขา!