【问题标题】:Rails + RSpec + Set the Order of Test Cases Files while running RSpec Test SuiteRails + RSpec + 在运行 RSpec 测试套件时设置测试用例文件的顺序
【发布时间】:2018-03-10 22:59:36
【问题描述】:

对于 RSpec Capybara 测试用例 [Selenium],我有大约 7 到 8 个规范文件。很少有测试用例相互依赖。例如,在删除产品之前,我必须创建产品。

但是当开始执行测试用例时,删除基于产品的 rspec 在创建产品 rspec 之前运行。

文件名:-

product_delete.rspec

product_listing.rspec

product_newly_added.rspec

命令:rspec

根文件夹中的.rspec文件

--require spec_helper
--format html
--out ./log/rspec_results.html
--color

执行删除产品时测试用例失败。

有没有办法在运行 RSpec 时定义文件执行的顺序。

【问题讨论】:

标签: ruby-on-rails selenium testing rspec capybara


【解决方案1】:

测试用例应该是独立的。对于您的删除测试用例,您可以使用工厂并创建一条记录,然后在单个测试用例中将其删除,如示例所示。 只需定义一次工厂并使用它来创建记录,这样就不会违反 DRY。

describe 'POST destroy' do
 before(:each) do
  @obj = build(:factory_name)
  @obj.save
 end

 it 'it has status 200' do
  post :destroy, {"id" => @obj.id}
  expect(ClassOfObj.count).to eq(0)
 end
end

【讨论】:

  • Buddy 这是一个 selenium 测试用例。忘记在问题中提及。谢谢提醒。
  • @Rubyist 你有什么样的测试并不重要。这个例子只是描述了方法,并且正确地做到了
  • @chumakoff:他可能的意思是,在这种情况下,服务器在一个单独的进程中运行,并且看不到来自该进程的工厂构建对象(因为事务隔离)。所以是的,“测试类型”很重要。
  • @SergioTulentsev 虽然 selenium 确实在单独的进程中运行 firefox/chrome/etc,但 Capybara(默认情况下)在单独的线程(而不是进程)中运行应用服务器。在 Rails
  • @SergioTulentsev database_cleaner 如果运行 rails 5.1+ 则不需要(它是 Capybara 使用 selenium 作为驱动程序,只要应用程序和测试在同一进程中运行,浏览器运行的位置无关紧要并在线程之间共享数据库连接)
【解决方案2】:

一种可能的方法是不将这些操作分离到它们自己的测试用例中。使用功能规范,您可以测试整个功能,而不是单个按钮。因此,您的测试可能如下所示:

  1. 导航到新项目页面。确保显示表单
  2. 填写表格。点击提交。验证屏幕上是否显示成功消息。
  3. 确认您已被重定向到项目索引页面。验证页面上确实存在新创建的项目。
  4. 单击“删除”按钮。
  5. 确认您在索引页面上并且该项目不再显示。

【讨论】:

  • SergioTulentsev:感谢您的回复。已经在文件中完成了。试图分离代码以使其更易于管理,只是在序列上挣扎。
  • @Rubyist:是的,这是一条死胡同。听听其他人的。您仅有的两个选择是:让每个测试自给自足,或者......真的没有选择 2。
  • SergioTulentsev - 也许你是对的。我必须通过进行一些函数调用来在系统中找到其他替代方法。谢谢
【解决方案3】:

正如大多数/所有其他答案所提到的,您的测试应该是独立的,并且 RSpec 支持以随机顺序运行测试以保证这一点。在这些条件下实现测试的最简单方法之一是使用工厂来创建测试数据(FactorGirl 等)。在这种情况下,您最终会得到一个类似于

的测试
feature "deleting of products" do
  scenario "removes last product" do
     create(:product) # Use factory to create one product
     visit products_path 
     expect(page).to have_css('div.product', count: 1) # verify there is only one product shown on the page
     click_link('delete') # click the delete button
     expect(page).to have_text("Product deleted!") # check for a visible change that indicates deletion has completed        
     visit products_path
     expect(page).not_to have_css('div.product') # No products shown any more - you may need to expect for something else first if the products are dynamically loaded to the page to ensure that has completed
  end
end

您可以检查数据库内容而不是重新访问 products_path,但在特性测试中直接查询数据库通常是一种不好的气味,因为它将用户体验与实现细节相结合。

如果在 Rails https://github.com/teamcapybara/capybara#transactions-and-database-setup 和 https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example。在 Rails 5.1+ 中,数据库连接在应用程序和测试之间共享,因此您通常可以启用事务测试并且不需要 database_cleaner。

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 2019-02-21
    • 1970-01-01
    • 2011-07-21
    • 2012-11-28
    • 1970-01-01
    • 2020-03-27
    • 2011-11-07
    • 1970-01-01
    相关资源
    最近更新 更多