Rails提供了一个强大的测试环境,使得测试一个应用程序的所有方面变得非常容易。 通过系统测试用例,人们可以通过模拟用户交互来测试工作流。
这里有一个简单的例子。
class RocketsTest < ApplicationSystemTestCase
include Devise::Test::IntegrationHelpers
setup do
@user = create(:user)
@rocket = create(:rocket, user_id: @user.id)
sign_in @user
end
test "should create rocket" do
visit rockets_url
click_on "New rocket"
fill_in "Name", with: @rocket.name
fill_in "Description", with: @rocket.description
click_on "Create Rocket"
assert_text "Rocket was successfully created"
click_on "Back"
end
end
这个例子模拟了一个用户,创建了一个新的火箭,然后导航到火箭的索引页面。 现在,如果测试失败,有一个屏幕截图或页面的HTML转储是很有用的。 这加快了调试的过程。
之前
Rails提供了在测试过程中的任何时候对页面进行截图的选项。 只需多次调用take_screenshot方法即可。 为了同时包括HTML转储,请使用RAILS_SYSTEM_TESTING_SCREENSHOT_HTML 环境变量。
下面是一个例子。首先让我们在测试中添加一个take_screenshot 方法。
class RocketsTest < ApplicationSystemTestCase
include Devise::Test::IntegrationHelpers
setup do
@user = create(:user)
@rocket = create(:rocket, user_id: @user.id)
sign_in @user
end
test "should create rocket" do
visit rockets_url
click_on "New rocket"
take_screenshot
fill_in "Name", with: @rocket.name
fill_in "Description", with: @rocket.description
take_screenshot
click_on "Create Rocket"
assert_text "Rocket was successfully created"
click_on "Back"
end
end
现在我们将在更新表单之前和之后获得调试数据。 让我们运行这个测试。
RAILS_SYSTEM_TESTING_SCREENSHOT_HTML=1 rails test test/system/rockets_test.rb
屏幕截图和HTML转储被存储在tmp/screenshots 目录中。
之后
然而,每次使用环境变量时,Rails 都会同时获取图片和 HTML 转储。 在调试时,这很快就会成为一个问题,因为只有 HTML 问题。
为了缓解这个问题,Rails 现在允许在 take_screenshot 方法中使用html 参数。
class RocketsTest < ApplicationSystemTestCase
include Devise::Test::IntegrationHelpers
setup do
@user = create(:user)
@rocket = create(:rocket, user_id: @user.id)
sign_in @user
end
test "should create rocket" do
visit rockets_url
click_on "New rocket"
take_screenshot
fill_in "Name", with: @rocket.name
fill_in "Description", with: @rocket.description
take_screenshot(html: true)
click_on "Create Rocket"
assert_text "Rocket was successfully created"
click_on "Back"
end
end
我们现在可以在没有环境变量的情况下运行测试了。 这一次将只创建两个文件,而不是四个。 一个图片和一个HTML文件。
rails test test/system/rockets_test.rb
本PR介绍了take_screenshot 方法的四种变化。
take_screenshot(html: true, screenshot: "inline") # takes a screenshot, shows it in iTerm, and dumps the HTML to a file, and prints paths for both
take_screenshot(html: true) # dumps the HTML to a file and prints its path
take_screenshot(screenshot: "artifact") # takes a screenshot, shows it in the terminal
and prints its path
take_screenshot # takes a screenshot, prints its path