Mục lục

Hôm nay chúng ta sẽ học cách kiểm thử (test) mã Ruby của mình bằng một công cụ gọi là RSpec.

RSpec là gì?

RSpec là một test framework cho Ruby. RSpec giống như một trợ lý robot hữu ích. Bạn nói cho nó biết mã của bạn nên làm gì, và nó kiểm tra xem mã của bạn có thực sự làm điều đó hay không. Đó là cách để đảm bảo chương trình của bạn hoạt động như mong đợi.
Cài đặt: $ gem install rspec # for rspec-core, rspec-expectations, rspec-mocks

Một ví dụ đơn giản
Giả sử chúng ta có một chương trình máy tính đơn giản.

# calculator.rb
class Calculator
  def add(a, b)
    a + b
  end
end

Làm sao bạn biết nó hoạt động chính xác? Bạn có thể thử cộng một vài số và xem liệu bạn có nhận được kết quả đúng không. Đó chính xác là điều mà kiểm thử đề cập đến - nhưng chúng ta để máy tính làm việc kiểm tra này cho chúng ta!
RSpec sử dụng các từ "describe" và "it" để chúng ta có thể biểu đạt các khái niệm như một cuộc hội thoại:

"Describe a Calculator."
"It correctly adds two numbers."

"Mô tả một Máy tính."
"Nó cộng chính xác hai số."

Đừng lo lắng về việc nhớ các lệnh hoặc cú pháp chính xác - hãy tập trung vào bức tranh tổng thể!

Đây là cách chúng ta có thể sử dụng RSpec để kiểm thử. Chúng ta gọi phương thức add với 2 và 3. Chúng ta mong đợi kết quả là 5.

# calculator_spec.rb
require_relative 'calculator'

RSpec.describe Calculator do
  describe '#add' do
    it 'correctly adds two numbers' do
      calc = Calculator.new
      result = calc.add(2, 3)
      expect(result).to eq(5)
    end
  end
end

Để chạy bài kiểm thử này, bạn sẽ gõ $ rspec calculator_spec.rb trong terminal của mình. Nếu mọi thứ hoạt động đúng, bạn sẽ thấy một chấm màu xanh, chỉ ra rằng bài kiểm thử đã thành công!

RSpec Expectations và RSpec::Matchers

RSpec::Expectations cung cấp một API đơn giản, dễ đọc để biểu đạt các kết quả mong đợi trong một ví dụ mã. Để biểu đạt một kết quả mong đợi, bao quanh một đối tượng hoặc khối trong expect, gọi to hoặc to_not (được đặt bí danh là not_to) và truyền nó một đối tượng matcher. Đọc thêm https://rspec.info/documentation/3.13/rspec-expectations/RSpec/Expectations.html
RSpec::Matchers cung cấp một số matchers hữu ích mà chúng ta sử dụng để định nghĩa các kỳ vọng. Bất kỳ đối tượng nào thực hiện giao thức matcher có thể được sử dụng như một matcher. Đọc thêm https://rspec.info/documentation/3.13/rspec-expectations/RSpec/Matchers.html

Kiểm thử các tình huống khác nhau

Khi chúng ta kiểm thử chức năng cộng của máy tính, chúng ta muốn đảm bảo rằng nó hoạt động trong mọi tình huống. Dưới đây là một số ý tưởng về những gì chúng ta có thể muốn kiểm tra:

  1. Nó có cộng chính xác hai số dương không?
  2. Thế còn một số dương và một số âm?
  3. Hai số âm thì sao?
  4. Nó có xử lý đúng số không?
  5. Nó có thể xử lý số thập phân không?
  6. Điều gì xảy ra với các số rất lớn?

Đây là phiên bản nâng cao của mã RSpec:

# calculator_spec.rb
require_relative 'calculator'

RSpec.describe Calculator do
  let(:calculator) { Calculator.new }

  describe '#add' do
    it 'correctly adds two positive numbers' do
      expect(calculator.add(2, 3)).to eq(5)
    end

    it 'correctly adds a positive and a negative number' do
      expect(calculator.add(5, -3)).to eq(2)
    end

    it 'correctly adds two negative numbers' do
      expect(calculator.add(-2, -3)).to eq(-5)
    end

    it 'returns zero when adding zero to zero' do
      expect(calculator.add(0, 0)).to eq(0)
    end

    it 'returns the same number when adding zero' do
      expect(calculator.add(7, 0)).to eq(7)
      expect(calculator.add(0, 7)).to eq(7)
    end

    it 'correctly adds decimal numbers' do
      expect(calculator.add(1.5, 2.7)).to be_within(0.01).of(4.2)
    end

    it 'correctly adds large numbers' do
      expect(calculator.add(1000000, 2000000)).to eq(3000000)
    end
  end
end

Bằng cách bao gồm các bài kiểm thử bổ sung này, chúng ta đảm bảo rằng phương thức add hoạt động đúng cho nhiều loại đầu vào. Đây được gọi là "kiểm thử trường hợp biên (edge case testing)" - chúng ta không chỉ kiểm thử các trường hợp rõ ràng mà còn cả những trường hợp ít phổ biến hoặc có khả năng gây ra vấn đề.
Để chạy các bài kiểm thử này, bạn vẫn sẽ sử dụng lệnh rspec calculator_spec.rb trong terminal của mình. Nếu tất cả các bài kiểm thử đều thành công, bạn sẽ thấy một loạt các chấm xanh, một cho mỗi bài kiểm thử. Nếu bất kỳ bài kiểm thử nào thất bại, bạn sẽ thấy một chữ F màu đỏ thay vì chấm xanh, kèm theo thông tin về những gì đã xảy ra sai.

Tư duy kiểm thử

Khi bạn viết các kiểm thử, hãy cố gắng suy nghĩ như một trinh thám. Những cách nào mà mã của bạn có thể được sử dụng? Điều gì có thể xảy ra sai? Bằng cách dự đoán các tình huống này, bạn có thể viết các kiểm thử tốt hơn và kết quả là mã tốt hơn.
Khi các chương trình của bạn trở nên lớn hơn và phức tạp hơn, thật dễ dàng để những thay đổi mới vô tình làm hỏng điều gì đó khác. Các kiểm thử giúp phát hiện những vấn đề này sớm.

Xin chào! Cám ơn bạn đã đọc bài viết có tiêu đề Viết Mã Ruby Đáng Tin Cậy với Kiểm Thử RSpec của tác giả Vũ Lê Huân. Trong trường hợp bạn muốn tìm hiểu thêm thông tin về tác giả, bạn có thể truy cập .