黄瓜动态加载数据表

时间:2012-01-16 09:30:28

标签: ruby cucumber integration-testing

我目前正在尝试将黄瓜与水豚一起用于网络应用的一些集成测试。

有一个测试,我只想点击Web应用程序的所有(或大部分)页面,看看是否没有返回错误。我希望以后能够看到哪些页面不起作用。

我认为情景概述是最好的方法所以我开始这样:

Scenario Outline: Checking all pages pages

   When I go on the page <page>
   Then the page has no HTTP error response

    Examples:
      | page                        |
      | "/resource1"                |
      | "/resource2"                |
      ...

我目前有82页,工作正常。

但是我发现这种方法不可维护,因为可能会删除新的资源和资源。

更好的方法是从某个地方加载表中的数据(解析索引页的HTML,数据库等......)。

但我不明白该怎么做。

我遇到了article about table transformation,但我无法弄清楚如何在场景大纲中使用此转换。

有什么建议吗?

好的,因为有一些混乱。如果你看一下上面的例子。我想做的就是改变它,使表几乎为空:

Scenario Outline: Checking all pages pages

  When I go on the page <page>
  Then the page has no HTTP error response

  Examples:
    | page                        |
    | "will be generated"         |

然后我想添加一个看起来像这样的转换:

Transform /^table:page$/ do
  all_my_pages.each do |page|
    table.hashes << {:page => page}
  end 
  table.hashes
end

我在同一个文件中指定了转换,但是没有执行,所以我假设转换不适用于Scenario轮廓。

4 个答案:

答案 0 :(得分:3)

Cucumber确实是完成该任务的错误工具,您应该根据功能描述功能。如果要以编程方式描述行为,则应使用类似rspec或test-unit的内容。

此外,您的场景步骤应该具有描述性和专业性,如书面文字,而不是编程语言中使用的抽象短语。他们不应该包括&#34;附带细节&#34;比如资源的确切网址或它的ID。

请阅读http://blog.carbonfive.com/2011/11/07/modern-cucumber-and-rails-no-more-training-wheels/并观看http://skillsmatter.com/podcast/home/refuctoring-your-cukes

关于你关于&#34;插入表格的问题&#34;,是的,如果你有可能 意味着为它添加额外的行,事实上你可以用它做任何你喜欢的事情。 Transform块的结果完全取代了原始表。

Transform /^table:Name,Posts$/ do
  # transform the table into a list of hashes
  results = table.hashes.map do |row|
    user = User.create! :name => row["Name"]
    posts = (1..row["Posts"]).map { |i| Post.create! :title => "Nr #{i}" }
    { :user => user, :posts => posts }
  end
  # append another hash to the results (e.g. a User "Tim" with 2 Posts)
  tim = User.create! :name => "Tim"
  tims_posts = [Post.create! :title => "First", Post.create! :title => "Second"]
  results << { :user => tim, :posts => tims_posts }
  results
end

Given /^I have Posts of the following Users:$/ do |transformation_results|
  transformation_results.each do |row|
    # assing Posts to the corresponding User
    row[:user].posts = row[:posts]
  end
end

您可以将此与“方案大纲”结合使用,如下所示:

Scenario Outline: Paginate the post list of an user at 10
  Given I have Posts of the following Users:
    | Name | Posts |
    | Max  | 7     |
    | Tom  | 11    |
  When I visit the post list of <name>
  Then I should see <count> posts
Examples:
  | name | count |
  | Max  |     7 |
  | Tom  |    10 |
  | Tim  |     2 |

这应该说明为什么&#34;添加&#34;行到表,可能不是最佳做法。

请注意,无法在表格中扩展示例代码:

Scenario Outline: Paginate the post list of an user at 10
  Given I have Posts of the following Users:
    | Name   | Posts      |
    | <name> | <existing> | # won't work
  When I visit the post list of <name>
  Then I should see <displayed> posts
Examples:
  | name | existing | displayed |
  | Max  |     7    |         7 |
  | Tom  |    11    |        10 |
  | Tim  |     2    |         2 |

答案 1 :(得分:1)

对于动态加载数据的具体情况,这里有一个建议:

  1. 一个类,比方说PageSets,使用方法,例如all_pages_in_the_sitemap_errorcountdeveloping_countries_errorcount

  2. 读取类似

    的步骤
    Given I am on the "Check Stuff" page
    Then there are 0 errors in the "developing countries" pages
    
  3.     Then there are 0 errors in "all pages in the sitemap"
    

    Then步将字符串"developing countries"转换为方法名称developing_countries_errorcount,并尝试在类PageSets上调用它。在这种情况下,该步骤期望所有_errorcount方法返回一个整数。返回像地图这样的数据结构为您提供了编写简洁动态步骤的多种可能性。

    对于更多静态数据,我们发现YAML对于使我们的测试自我记录和自我验证非常有用,并且帮助我们删除难以维护的文字,如“5382739”,我们都忘记了三个的含义几周后。

    YAML格式易于阅读,必要时可以评论(通常不是。)

    而不是写:

    Given I am logged in as "jackrobinson@gmail.com"
    And I select the "History" tab
    Then I can see 5 or more "rows of history"
    

    我们可以写:

    Given I am logged in as "a user with at least 5 items of history"
    When I select the "History" tab
    Then I can see 5 or more "rows of history"
    

    在文件logins.yaml ....

    a member with at least 5 items of history:
         username: jackrobinson@gmail.com
         password: WalRus
    

    我们使用YAML来保存与各种实体(如成员,提供商,政策等)相关的数据集......该列表一直在增长:

    在文件test_data.yaml ...

    a member who has direct debit set up:
        username: jackrobinson@gmail.com
        password: WalRus
        policyId: 5382739
        first name: Jack
        last name: Robinson
        partner's first name: Sally
        partner's last name: Fredericks
    

    如果您需要验证文字,也值得查看YAML的multi-line text facilities。虽然这对于自动化测试来说并不常见,但它有时会很有用。

答案 2 :(得分:0)

我认为更好的方法是使用不同的工具,只是为了抓取您的网站并检查是否没有返回错误。假设你正在使用Rails

您可能考虑的工具是:Tarantula

https://github.com/relevance/tarantula

我希望有帮助:)

答案 3 :(得分:0)

快速入侵是更改示例收集器代码,并使用eval of ruby​​运行自定义ruby函数来覆盖默认收集的示例数据,这里是代码: generate-dynamic-examples-for-cucumber

缺点:需要更改scenario_outline.rb文件。