Computer >> Máy Tính >  >> Lập trình >> Ruby

Phân tích nhanh về cách hoạt động của Minitest

Minitest là gì?

Minitest là một thư viện thử nghiệm Ruby , nó cho phép bạn viết các bài kiểm tra cho kiểu mã TDD của bạn.

Đây là khung thử nghiệm mặc định cho yêu thích của Rails &DHH.

Một số người thích nó vì sự đơn giản và ít mã so với phương thức thay thế chính (RSpec).

Như bạn có thể thấy trong hình này :

Phân tích nhanh về cách hoạt động của Minitest

Bây giờ, bài đăng này không phải về việc bạn nên chọn cái nào hay cái nào "tốt hơn".

Bài đăng này nói về cách Minitest hoạt động .

Nếu bạn đang tự hỏi:Chỉ sử dụng cái nào bạn thích nhất, nhưng bạn vẫn nên làm quen với cả hai 🙂

Nếu bạn muốn tìm hiểu cách mọi thứ hoạt động, bạn sẽ thích bài đăng này…

Bất kể thư viện thử nghiệm nào là yêu thích của bạn!

Hãy xem dưới mui xe

Một trong những điều mà mọi người khuyên (bao gồm cả tôi) là đọc mã nguồn vì đó là một cách tuyệt vời để tìm hiểu cách mọi thứ hoạt động và đó cũng là một cách tuyệt vời để học một số thủ thuật Ruby mới mà bạn có thể chưa từng thấy trước đây.

Đó là những gì tôi đã làm với Minitest và tôi sẽ chia sẻ với bạn những gì tôi học được.

Hãy bắt đầu với một số mã thử nghiệm thực tế để chúng ta có thể thảo luận xem điều này liên quan như thế nào đến cách Minitest thực hiện mọi việc.

class Thingy < Minitest::Test
  def test_it_works
    assert_equal 1, 1
  end
end

Vậy làm cách nào để Minitest tìm ra các phương pháp thử nghiệm này (như test_it_works ) &chạy chúng?

Câu trả lời là một chút 'ma thuật' lập trình siêu hình:

def self.methods_matching(re)
  public_instance_methods(true).grep(re).map(&:to_s)
end

Điều này đến từ Runnable lớp được định nghĩa trong lib/minitest.rb . Mã này tìm tất cả các phương thức phiên bản cho lớp hiện tại và chọn những phương thức phù hợp với biểu thức chính quy.

Vì vậy, nếu bạn gọi methods_matching(/^test_/) bạn sẽ nhận được một mảng với tất cả các tên phương thức bắt đầu bằng test_ .

Cách hoạt động của Minitest

Minitest tìm thấy những test_ này , sau đó nó gọi chúng.

Điều đó xảy ra trong lib/minitest/test.rb tệp (và cụ thể hơn, trên runnable_methods phương thức này cũng trả về danh sách các phương thức theo thứ tự ngẫu nhiên).

Điểm quan trọng :
Điều này hoạt động vì Minitest::Test là một lớp con của Runnable .

Phần cuối cùng của câu đố là run phương thức lớp trên Runnable , thực hiện một số lọc bổ sung và sau đó gọi run_one_method với mọi tên phương thức và một đối tượng báo cáo.

Đây là mã :

filtered_methods.each do |method_name|
  run_one_method self, method_name, reporter
end

Và điều này kết thúc bằng cách gọi run phương thức phiên bản trên Minitest::Test :

capture_exceptions do
  before_setup; setup; after_setup

  self.send self.name
end

Gửi là một phương pháp lập trình siêu mẫu cho phép bạn gọi một phương thức khác trên bất kỳ đối tượng nào bằng cách sử dụng một chuỗi hoặc một ký hiệu.

capture_exceptions khối được sử dụng để ghi lại các lỗi kiểm tra và các trường hợp ngoại lệ do mã của bạn nêu ra.

def capture_exceptions # :nodoc:
  yield
rescue *PASSTHROUGH_EXCEPTIONS
  raise
rescue Assertion => e
  self.failures << e
rescue Exception => e
  self.failures << UnexpectedError.new(e)
end

Đây là cách tôi thích đọc mã, tập trung vào một khía cạnh hoặc tính năng từ mã bạn đang đọc và sau đó tiếp tục bóc các lớp ra như một củ hành.

Nếu bạn không biết điều gì đó có nghĩa là gì, chẳng hạn như từ khóa lợi nhuận này, thì hãy tra cứu nó.

Đó là một phần của quá trình học tập!

Kết luận

Trong bài đăng này, bạn đã học cách Minitest sử dụng lập trình siêu ứng dụng để tìm ra các phương pháp thử nghiệm của bạn và gọi chúng. Bạn cũng đã biết cách ghi lại các lỗi và ngoại lệ kiểm tra vào một mảng để báo cáo.

Bạn có thích loại bài viết "phân tích mã" này không?

Hãy cho tôi biết trong phần bình luận 🙂

Cũng đừng quên chia sẻ điều này trên các mạng xã hội yêu thích của bạn &đăng ký nhận bản tin của tôi bên dưới nếu bạn chưa phải là thành viên của hơn 7000 nhà phát triển Ruby như bạn đang muốn cải thiện kỹ năng của họ!