SpecFlow: Примеры структуры сценария

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

Просто интересно, нормально ли то, с чем я сталкиваюсь, или в этом есть какой-то трюк.

Я использую C # Visual Studio 2013 и пишу приложение MVC, используя стиль подчеркивания определения шага. Я также пробовал использовать стиль регулярного выражения, но все еще сталкиваюсь с аналогичными проблемами.

Итак, проблема в том, что я предоставляю имя пользователя, пароль и т. Д. В качестве параметров и включаю образцы данных в свои примеры. Похоже, что происходит следующее: -

  1. Я должен поставить "" вокруг параметров при первом создании сценария, иначе он вообще не будет принят в качестве параметра. Однако при передаче данных из примеров я получаю «/» в конце переданных данных. Когда я возвращаюсь к сценарию, я затем удаляю «» вокруг параметра. Это немного расстраивает, но если это лучший способ справиться с этим, я могу с этим жить. Просто интересно, есть ли у кого-нибудь совет по этому поводу.

  2. Следующая проблема связана с самими данными. Похоже, если у меня есть какие-либо символы, такие как @ или & и т.д. в моих данных, тогда он разбивает эти данные в этой точке и передает их следующему параметру, поэтому я получаю неверные данные, передаваемые через.

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

Файл функций Функция: Регистрация учетной записи Чтобы использовать сервисы Mojito в моей организации В качестве гостя я хочу создать учетную запись с правами администратора.

Scenario Outline: Register with valid details
    Given I am on the registration page
        And I have completed the form with <email> <organisation> <password> and <passwordConfirmation>
    When I have clicked on the register button
    Then I will be logged in as <username>
        And my account will be assigned the role of <role>

        Examples: 
        | email     | organisation | password  | passwordConfirmation | username  | role  |
        | usernamea | Bytes        | password1 | password1            | usernamea | Admin |
        | usernameb | Bytes        | password2 | password2            | usernameb | Admin |
        | usernamec | Bytes        | password3 | password3            | usernamec | Admin |
        | usernamed | Bytes        | password4 | password4            | usernamed | Admin |
        | usernamee | Bytes        | password5 | password5            | usernamee | Admin |

Scenario Outline: Register with invalid details
    Given I am on the registration page
        And I have completed the form with <email> <organisation> <password> and <passwordConfirmation>
    When I have clicked on the register button
    Then I will get an error message

        Examples: 
        | email             | organisation    | password   | passwordConfirmation | 
        | [email protected] | Bytes           | 1LTIuta&Sc | wrongpassword      | 
        | [email protected] | Bytes           | 1LTIuta&Sc | 1LTIuta&Sc         | 
        | [email protected] | No Organisation | 1LTIuta&Sc | 1LTIuta&Sc         | 

Созданный файл шагов

[Binding]
    public class AccountRegistrationSteps
    {
        [Given]
        public void Given_I_am_on_the_registration_page()
        {
            ScenarioContext.Current.Pending();
        }

        [Given]
        public void Given_I_have_completed_the_form_with_usernamea_Bytes_password_P0_and_password_P1(int p0, int p1)
        {
            ScenarioContext.Current.Pending();
        }

        [Given]
        public void Given_I_have_completed_the_form_with_Jonesa_mojito_com_Bytes_P0_LTIuta_Sc_and_wrongpassword(int p0)
        {
            ScenarioContext.Current.Pending();
        }

        [When]
        public void When_I_have_clicked_on_the_register_button()
        {
            ScenarioContext.Current.Pending();
        }

        [Then]
        public void Then_I_will_be_logged_in_as_usernamea()
        {
            ScenarioContext.Current.Pending();
        }

        [Then]
        public void Then_my_account_will_be_assigned_the_role_of_Admin()
        {
            ScenarioContext.Current.Pending();
        }

        [Then]
        public void Then_I_will_get_an_error_message()
        {
            ScenarioContext.Current.Pending();
        }
    }

person ccocker    schedule 19.08.2014    source источник


Ответы (3)


SpecFlow выполняет обработку строковых параметров по умолчанию, проблема в том, что вы оставили право SpecFlow определять во время выполнения, каковы ваши значения.

Когда вы запускали «Создать определения шагов», вы выбрали «Имя метода - подчеркивания» в раскрывающемся списке «Стиль». Это оставило интерпретацию входных параметров до SpecFlow, который создаст так называемые «жадные» регулярные выражения для идентификации значений параметров. Это означает, что он будет включать запятую как часть значения.

Если бы вы выбрали «Регулярные выражения в атрибутах» (или слегка отредактировали код и вручную украсили атрибуты), ваш шаг мог бы выглядеть следующим образом:

[Given(@"I have completed the form with (.*), (.*), (.*), and (.*)")]
public void Given_I_have_completed_the_form_with(string email, string org, string pwd, string conf)
{
    //do stuff here
}

Это создает более «экономное» выражение, которое сообщает SpecFlow принимать строки любой длины, вплоть до конечных запятых, но не включая их. Одиночные кавычки вокруг регулярных выражений сделают его еще более явным:

[Given(@"I have completed the form with '(.*)', '(.*)', '(.*)', and '(.*)'")]

Самостоятельное управление регулярными выражениями может создать головную боль, но если вы это сделаете, оно действительно раскроет всю мощь SpecFlow.

person Carter Wickstrom    schedule 03.09.2014

РЕШЕНО. Не было проблем с использованием таких символов, как @ или &. На самом деле в моем «Данном заявлении» использовались запятые. Я обнаружил, что если я использовал «и», это работает. Итак, чтобы заставить его работать, заявление должно было быть написано следующим образом: -

РЕШЕНИЕ

  1. Запишите заявление как

    Given I have completed the form with <email> and <organisation> and <password> and <passwordConfirmation>

  2. Оператор модификации, чтобы заключить в одинарные кавычки параметры, которые должны быть строками

    Given I have completed the form with '<email>' and '<organisation>' and '<password>' and '<passwordConfirmation>'

  3. Определения шагов генерации, а затем изменить оператор обратно, чтобы исключить одинарные кавычки

    Given I have completed the form with <email> and <organisation> and <password> and <passwordConfirmation>

Немного возиться, но результат верный. Надеюсь, что в будущем SpecFlow будет обновлен для обработки параметров как строк по умолчанию.

person ccocker    schedule 20.08.2014
comment
На самом деле в документации по спецификации говорится: размещение одинарных кавычек ( ') вокруг заполнителей (например,' ‹placeholder› ') не является обязательным в соответствии с языком Gherkin, но помогает улучшить способность SpecFlow анализировать схему сценария. Шаг 3 здесь устарел, он отлично работает без удаления кавычек. - person qbik; 28.01.2017

Для справки в будущем, если ответ Катера не сработает. У меня была следующая проблема

Give I have a <typeOfDay> day
When Im asked how I am
Then I will say <feeling>

Example:
|typeOfDay|feeeling|
|good     |happy  |
|bad      |sad    |

Вы заметите, что в инструкции Then невозможно найти соответствующее значение из-за опечатки. Это приводит к тому, что SpecFlow генерирует ошибку неправильного формата входной строки. В моем случае на то, чтобы найти это, потребовалось невероятно много времени.

Еще кое-что проверить :)

person DylanB    schedule 10.07.2020