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 :
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ọ!