RSpec: Filtering & Formatters

Introduction

RSpec là một unit test framework rất phổ biến của ngôn ngữ Ruby. RSpec không giống như các framework xUnit truyền thống (vd: JUnit) vì RSpec là một công cụ phát triển theo hành vi. Tức là các cases được viết trong RSpec đều tập trung vào hành vi của ứng dụng đang được test. RSpec không nhấn mạnh vào cách thức hoạt động của ứng dụng, mà thay vào đó là các hành vi và luồng xử lý, hay nói cách khác là những gì mà ứng dụng đang thực sự làm. Bài viết này nhằm giới thiệu về 2 feature khá hữu dụng của RSpecfilteringformatter.

Filtering & Formatters

Filtering

Giả sử như chúng ta có 1 file test_spec.rb và bên trong có chứa 2 examples tương ứng với 2 trường hợp pass (positive) hoặc fail (negative), như sau:

RSpec.describe "An Example Group with positive and negative Examples" do 
   context 'when testing Ruby\'s build-in math library' do
      
      it 'can do normal numeric operations' do 
         expect(1 + 1).to eq(2) 
      end 
      
      it 'generates an error when expected' do
         expect{1/0}.to raise_error(ZeroDivisionError) 
      end
      
   end 
end

Sau khi chạy thử test_spec.rb chúng ta được kết quả:

.. 
Finished in 0.003 seconds (files took 0.11201 seconds to load) 
2 examples, 0 failures

Nếu như bây giờ chúng ta muốn chạy lại file test_spec.rb nhưng chỉ áp dụng cho một trong 2 cases là positive pass hoặc là case negative, thì chúng ta sẽ cần dùng đến filter:

RSpec.describe "An Example Group with positive and negative Examples" do 
   context 'when testing Ruby\'s build-in math library' do
      
      it 'can do normal numeric operations', positive: true do 
         expect(1 + 1).to eq(2) 
      end 
      
      it 'generates an error when expected', negative: true do 
         expect{1/0}.to raise_error(ZeroDivisionError) 
      end
      
   end 
end

Sau khi save lại chúng ta dùng lệnh:

rspec --tag positive filter_spec.rb

Chúng ta sẽ được output:

Run options: include {:positive=>true} 
. 
Finished in 0.001 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

Bằng cách chỉ định --tag pass, RSpec sẽ chỉ chạy example chứa metadata positive được định nghĩa là true. Tương tự cho case fail:

rspec --tag negative filter_spec.rb

Chúng ta có thể đặt các tag name theo ý muốn.

Formatters

Formatters cho phép RSpec hiển thị ra test result output theo nhiều cách khác nhau. Giả sử như chúng ta có 1 file formatter_spec.rb:

RSpec.describe "A spec file to demonstrate how RSpec Formatters work" do 
   context 'when running some tests' do 
      
      it 'the test usually calls the expect() method at least once' do 
         expect(1 + 1).to eq(2) 
      end
      
   end 
end

Giờ chúng ta sẽ thử chạy với option --format progress:

rspec --format progress formatter_spec.rb

Kết quả thu được:

... 
Finished in 0.002 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

Không có gì khác biệt so với khi chạy với câu lệnh thông thường, vì progress là format mặc định, giờ chúng ta sẽ thử với option doc:

rspec --format doc formatter_spec.rb

Kết quả:

A spec file to demonstrate how RSpec Formatters work 
   when running some tests 
      the test usually calls the expect() method at least once
Finished in 0.002 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

Như đã thấy, output giờ đang được format theo dạng document style. Tương tự với trường hợp test fail:

RSpec.describe "A spec file to demonstrate how RSpec Formatters work" do 
   context 'when running some tests' do 
      
      it 'the test usually calls the expect() method at least once' do 
         expect(1 + 1).to eq(1) 
      end
      
   end 
end

Run command rspec khi chưa chỉ định option:

F 
Failures:
1) A spec file to demonstrate how RSpec Formatters work when running some tests 
the test usually calls the expect() method at least once
   Failure/Error: expect(1 + 1).to eq(1)
	
      expected: 1
         got: 2
			  
      (compared using ==)			  
   # ./formatter_spec.rb:4:in `block (3 levels) in <top (required)>'

Finished in 0.016 seconds (files took 0.11201 seconds to load)
1 example, 1 failure
Failed examples:

rspec ./formatter_spec.rb:3 # A spec file to demonstrate how RSpec 
   Formatters work when running some tests the test usually calls 
   the expect() method at least once

Khi có thêm option format:

A spec file to demonstrate how RSpec Formatters work
   when running some tests
      the test usually calls the expect() method at least once (FAILED - 1)
		
Failures:

1) A spec file to demonstrate how RSpec Formatters work when running some
   tests the test usually calls the expect() method at least once
   Failure/Error: expect(1 + 1).to eq(1)
	
   expected: 1
        got: 2
		  
   (compared using ==)
   # ./formatter_spec.rb:4:in `block (3 levels) in <top (required)>'
	
Finished in 0.015 seconds (files took 0.11401 seconds to load) 
1 example, 1 failure

RSpec Formatters cho phép chúng ta có thể thay đổi hiển thị của các kết quả test, thậm chí ta có thể tự tạo ra các định dạng format theo ý mình muốn (chẳng hạn như thay đổi màu sắc, format dạng JSON..) chi tiết có thể tham khảo thêm tại đây.

Summary

Bài viết này nhằm giới thiệu về 2 feature khá hữu dụng của RSpecfilteringformatter. Bài viết còn nhiều hạn chế và thiếu sót, cảm ơn các bạn đã dành thời gian đọc. Nguồn và tài liệu tham khảo: