web-dev-qa-db-fra.com

SpecFlow: exemples de plan de scénario

Je commence tout juste à travailler avec SpecFlow et j'aime vraiment l'outil. Cependant, je rencontre certains problèmes liés aux exemples d'entrées de données dans les plans de scénario.

Je me demande simplement si ce à quoi je fais face est normal ou s'il y a une astuce.

J'utilise C # Visual Studio 2013 et j'écris une application MVC en utilisant le style de soulignement de la définition d'étape. J'ai également essayé le style d'expression régulière, mais j'ai toujours des problèmes similaires.

Le problème est donc que je fournis un nom d'utilisateur, un mot de passe, etc. en tant que paramètres et que j'inclus des exemples de données dans mes exemples. Il semble que les événements suivants se produisent: -

  1. Je dois mettre "" autour des paramètres lors de la première génération du scénario, sinon il ne sera pas du tout récupéré comme paramètre. Cependant, lorsque je passe des données à partir des exemples, j'obtiens un "/" à la fin des données transmises. Lorsque je reviens au scénario, je supprime ensuite le "" autour du paramètre. C'est un peu frustrant mais si c'est la meilleure façon de gérer ça, je peux vivre avec ça. Je me demande simplement si quelqu'un a des conseils sur ce point.

  2. Le prochain problème est lié aux données elles-mêmes. Il apparaît si j'ai des caractères tels que @ ou & etc dans mes données, puis il divise ces données à ce stade et les alimente au paramètre suivant, donc j'obtiens des données incorrectes.

J'ai inclus mon code ci-dessous - si quelqu'un a des suggestions ou des ressources à consulter, ce serait apprécié.

Feature File Feature: AccountRegistration Afin d'utiliser les services Mojito dans mon organisation En tant qu'utilisateur invité, je souhaite créer un compte avec des privilèges d'administration

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         | 

fichier généré par étapes

[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();
        }
    }
12
ccocker

SpecFlow fait gère les paramètres de chaîne par défaut, le problème est que vous avez laissé le contrôle à SpecFlow pour déterminer au moment de l'exécution quelles sont vos valeurs.

Lorsque vous avez exécuté "Générer des définitions d'étape", vous avez sélectionné "Nom de la méthode - souligne" dans la liste déroulante Style. Cela a laissé l'interprétation des paramètres d'entrée jusqu'à SpecFlow, ce qui créera ce que l'on appelle des expressions régulières "gourmandes" pour identifier les valeurs des paramètres. Cela signifie qu'il inclurait la virgule dans la valeur.

Si vous aviez sélectionné "Expressions régulières dans les attributs" (ou refactorisé votre code une touche et décoré vos attributs à la main), votre étape pourrait ressembler à ceci:

[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
}

Cela crée une expression plus "parcimonieuse" qui indique à SpecFlow d'accepter des chaînes de n'importe quelle longueur, sans inclure de virgules de fin. Des guillemets simples autour des expressions régulières le rendraient encore plus explicite:

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

La gestion des expressions régulières vous-même peut créer des maux de tête, mais cela expose vraiment toute la puissance de SpecFlow si vous le faites.

15
Carter Wickstrom

RÉSOLU - Ce n'était pas un problème avec l'utilisation de caractères tels que @ ou &. Il utilisait en fait des virgules dans ma déclaration donnée. J'ai trouvé que si j'utilisais 'et' ça marche. Donc, pour le faire fonctionner, la déclaration devait être écrite comme suit: -

SOLUTION

  1. Écrire l'instruction comme

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

  2. Modifier l'instruction pour mettre des guillemets simples autour des paramètres qui doivent être des chaînes

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

  3. Définitions des étapes de génération, puis modifiez l'instruction pour exclure les guillemets simples

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

Un peu de déblayage mais ça donne les bons résultats. Espérons que dans le futur SpecFlow sera mis à jour pour gérer les paramètres comme chaînes par défaut.

3
ccocker