Sử dụng Capybara để test ứng dụng
Bài đăng này đã không được cập nhật trong 6 năm
Chúng ta hầu như đều rất quen thuộc với Rspec-một công cụ viết test trên ứng dụng Ruby on Rails.Rspec là 1 công cụ rất mạnh hỗ trợ chúng ta test độ chính xác của logic code của mình tạo ra.Với rspec ta có thể dùng để kiểm nghiệm độ chính xác của function mình viết ra, thế nhưng đối với sự hoạt động của sản phẩm trên từng yêu cầu cụ thể cũng chưa chắc chính xác so với những gì người lập trình mong muốn.Capybara là công cụ giúp chúng ta có thể giải quyết vấn đề này.
CÀI ĐẶT
Capybara
yêu cầu Ruby 1.9.3 trở lên, để cài đặt, chúng ta có thể add dọng sau vào Gemfile
va chạy bundle install
gem 'capybara'
sau đó thêm dòng sau vào rspec_helper.rb
:
require 'capybara/rails'
Sử dụng với Rpsec
chúng ta tạo thư mục spec/features
, Capybara specs code sẽ được viết ở trong này(nếu sử dụng config như sau: config).Hoặc nếu files specs nằm ở thư mục khác thì cần phải có cài đặt sau: :type => :feature
Ví dụ:
describe "the signin process", :type => :feature do
before :each do
User.make(email: 'user@example.com', password: 'password')
end
it "signs me in" do
visit '/sessions/new'
within("#session") do
fill_in 'Email', with: 'user@example.com'
fill_in 'Password', with: 'password'
end
click_button 'Sign in'
expect(page).to have_content 'Success'
end
end
Sử dụng js: true
để thay đổi tới Capybara.javascript_driver
, hoặc cũng cấp thông tin :driver
để xác định chuyển đến 1 drive nhất định:
describe 'some stuff which requires js', js: true do
it 'will use the default js driver'
it 'will switch to one specific driver', :driver => :webkit
end
Điều hướng
Ta dùng method visit
để truy cập 1 trang nhất định, ví dụ:
visit('/projects')
visit(post_comments_path(post))
visit
method chỉ nhận duy nhất 1 parameter, request method luôn luôn là dạng GET
.
chúng ta có thể kiểm tra dường dẫn hiện thời của trang truy cập như sau:
expect(page).to have_current_path(post_comments_path(post))
CLick link và button
Bạn có thể tương tác với webapp bằng cách click vào liên kết và nút. Capybara tự động theo dõi bất kỳ chuyển hướng nào và submit form liên kết với các nút.
click_link('id-of-link')
click_link('Link Text')
click_button('Save')
click_on('Link Text') # clicks on either links or buttons
click_on('Button Value')
Tương tác với form
chúng ta có nhiều công cụ để có thể thực hiện các action liên quan tới form như sau:
- Điền form với
fill_in
:
fill_in('First Name', with: 'John')
fill_in('Password', with: 'Seekrit')
fill_in('Description', with: 'Really Long Text...')
- lựa chọn radio button hoặc checkbox:
choose('A Radio Button')
check('A Checkbox')
uncheck('A Checkbox')
- upload image:
attach_file('Image', '/path/to/image.jpg')
- chọn option trong select box:
select('Option', from: 'Select Box')
Querying
chúng ta có nhiều công cụ để kiểm tra các phần tử của trang như sau:
page.has_selector?('table tr')
page.has_selector?(:xpath, './/table/tr')
page.has_xpath?('.//table/tr')
page.has_css?('table tr.foo')
page.has_content?('foo')
dùng với Rspec:
expect(page).to have_selector('table tr')
expect(page).to have_selector(:xpath, './/table/tr')
expect(page).to have_xpath('.//table/tr')
expect(page).to have_css('table tr.foo')
expect(page).to have_content('foo')
Tìm kiếm
Ta có thể tìm kiếm các phần tử của trang như sau:
find_field('First Name').value
find_field(id: 'my_field').value
find_link('Hello', :visible => :all).visible?
find_link(class: ['some_class', 'some_other_class'], :visible => :all).visible?
find_button('Send').click
find_button(value: '1234').click
find(:xpath, ".//table/tr").click
find("#overlay").find("h1").click
all('a').each { |a| a[:href] }
Đây là cách khác với việc sử dụng block:
find_field('First Name'){ |el| el['data-xyz'] == '123' }
find("#img_loading"){ |img| img['complete'] == true }
Scoping
Capybara cho phép chúng ta giới hạn những hành động nhất định, ví dụ nhưu tương tác với các form hoặc click vào các link hay button ở trong một vùng cụ thể của trang web. Để làm được điều này, bạn sử dụng hàm within.Bạn có thể tùy chọn các selector khác nhau để sử dụng, ví dụ như sau:
within("li#employee") do
fill_in 'Name', with: 'Jimmy'
end
within(:xpath, ".//li[@id='employee']") do
fill_in 'Name', with: 'Jimmy'
end
Ngoài ra còn có một số hàm khác dành cho các fieldset hoặc table, định danh bởi id hoặc đoạn text của fieldset hay table đó:
within_fieldset('Employee') do
fill_in 'Name', with: 'Jimmy'
end
within_table('Employee') do
fill_in 'Name', with: 'Jimmy'
end
Làm việc với cửa sổ
chúng ta có thể phát hiện sự chuyển cửa sổ như sau:
facebook_window = window_opened_by do
click_button 'Like'
end
within_window facebook_window do
find('#login_email').set('a@example.com')
find('#login_password').set('qwerty')
click_button 'Submit'
end
Test script
ta có thể chạy lệnh script như sau:
page.execute_script("$('body').empty()")
result = page.evaluate_script('4 + 4');
Modal
chúng ta có thể chấp nhận hoặc bỏ qua alert bằng cách sau:
accept_alert do
click_link('Show Alert')
end
Tương tự với confirm và prompt:
dismiss_confirm do
click_link('Show Confirm')
end
accept_prompt(with: 'Linus Torvalds') do
click_link('Show Prompt About Linux')
end
và chúng ta có thể kiểm tra message trả về như sau:
message = accept_prompt(with: 'Linus Torvalds') do
click_link('Show Prompt About Linux')
end
expect(message).to eq('Who is the chief architect of Linux?')
All rights reserved