了解Rails 7为系统测试截图助手接受 "html "和 "screenshot "的kwargs

124 阅读2分钟

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