Таблицы данных загрузки огурца динамически - PullRequest
1 голос
/ 16 января 2012

В настоящее время я пытаюсь использовать огурец вместе с капибарой для некоторых интеграционных тестов веб-приложения.

Существует один тест, в котором я просто хочу просмотреть все (или большинство) страниц веб-приложения и посмотреть, не было ли ошибок возвращено. Я хочу, чтобы потом было видно, какие страницы не работают.

Я думаю, что схемы сценариев были бы наилучшим подходом, поэтому я начал так:

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 индексной страницы, базы данных и т. Д.).

Но я не понял, как это сделать.

Я наткнулся на статью о преобразовании таблиц , но я не мог понять, как использовать это преобразование в набросках сценария.

Есть предложения?

ОК, так как есть некоторая путаница. Если вы посмотрите на пример выше. Все, что я хочу сделать, это изменить его так, чтобы таблица была почти пустой:

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

Я указал преобразование в том же файле, но оно не выполняется, поэтому я предполагал, что преобразования не работают со схемами сценария.

Ответы [ 4 ]

3 голосов
/ 18 января 2012

Cucumber - действительно неправильный инструмент для этой задачи, вы должны описать функциональность в терминах возможностей.Если вы хотите описать поведение программно, вы должны использовать что-то вроде rspec или test-unit.

Также ваши шаги сценария должны быть описательными и специализированными, как письменный текст, а не абстрактными фразами, такими как используемые в языке программирования.Они не должны включать «случайные детали», такие как точный URL ресурса или его идентификатор.

Пожалуйста, прочитайте http://blog.carbonfive.com/2011/11/07/modern-cucumber-and-rails-no-more-training-wheels/ и посмотрите http://skillsmatter.com/podcast/home/refuctoring-your-cukes

По поводу вашего вопроса о вставкев таблицы ", да, это возможно, если вы хотите добавить в него дополнительные строки, но вы можете делать с ним все, что захотите.Результат блока 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 |

Это должно продемонстрировать, почему «добавление» строк втаблица, возможно, не лучшая практика.

Обратите внимание, что невозможно развернуть примеры тегов внутри таблицы:

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 голос
/ 26 июля 2016

Для конкретного случая динамической загрузки данных вот предложение:

  1. Класс, скажем PageSets, с методами, например all_pages_in_the_sitemap_errorcount, developing_countries_errorcount.

  2. шаг, который читает что-то вроде

    Given I am on the "Check Stuff" page
    Then there are 0 errors in the "developing countries" pages
    

или

    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 , если вам нужно проверить текст. Хотя это не обычно для автоматических тестов, иногда это может быть полезно.

0 голосов
/ 09 мая 2014

Быстрый взлом состоит в том, чтобы изменить код сборщика примеров и использовать eval of ruby ​​для запуска вашей настроенной функции ruby, чтобы перезаписать собранные по умолчанию данные примеров, вот код: generate-dynamic-examples-for-cucumber

недостаток: необходимо изменить файл scene_outline.rb.

0 голосов
/ 16 января 2012

Я думаю, что лучшим подходом было бы использование другого инструмента, просто для сканирования вашего сайта и проверки, не возвращается ли ошибка.Предполагая, что вы используете Rails

Инструмент, который вы можете рассмотреть: Tarantula.

https://github.com/relevance/tarantula

Надеюсь, это поможет:)

...