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

การวิเคราะห์อย่างรวดเร็วเกี่ยวกับวิธีการทำงานของ Minitest

Minitest คืออะไร

Minitest คือ ไลบรารีทดสอบ Ruby ช่วยให้คุณเขียนการทดสอบสำหรับรูปแบบ TDD ของโค้ดได้

เป็นเฟรมเวิร์กการทดสอบเริ่มต้นสำหรับรายการโปรดของ Rails &DHH

บางคนชอบเพราะความเรียบง่ายและมีโค้ดน้อยเมื่อเทียบกับทางเลือกหลัก (RSpec)

อย่างที่คุณเห็นในภาพนี้ :

การวิเคราะห์อย่างรวดเร็วเกี่ยวกับวิธีการทำงานของ Minitest

ตอนนี้โพสต์นี้ไม่ได้เกี่ยวกับว่าคุณควรเลือกอันไหนหรืออันไหน "ดีกว่า"

โพสต์นี้เกี่ยวกับ วิธีการทำงานของ 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 รายเช่นคุณที่ต้องการพัฒนาทักษะของพวกเขา!