SpecFlow:场景大纲示例

Posted

技术标签:

【中文标题】SpecFlow:场景大纲示例【英文标题】:SpecFlow: Scenario Outline Examples 【发布时间】:2014-10-12 20:24:02 【问题描述】:

我刚开始使用 SpecFlow,非常喜欢这个工具。但是,我遇到了与场景大纲中的示例数据输入相关的一些问题。

只是想知道我所面对的是否正常或是否有技巧。

我正在使用 C# Visual Studio 2013 并使用下划线样式的步骤定义编写 MVC 应用程序。我也尝试过正则表达式样式,但仍然遇到类似的问题。

所以问题是我提供用户名、密码等作为参数,并在我的示例中包含示例数据。似乎发生了以下情况:-

    在第一次生成场景时,我必须在参数周围加上“”,否则它根本不会作为参数被拾取。但是,当从示例中传入数据时,我在传入的数据末尾得到一个“/”。当我回到场景时,我删除了参数周围的“”。这有点令人沮丧,但如果这是处理它的最佳方式,我可以忍受。只是想知道是否有人对此有任何建议。

    下一个问题与数据本身有关。如果我的数据中有任何字符,例如 @ 或 & 等,那么它会在该点拆分该数据并将其提供给下一个参数,这样我就会得到不正确的数据。

我在下面包含了我的代码 - 如果有人有任何建议或资源可以查看,我们将不胜感激。

功能文件 功能:帐户注册 为了在我的组织中使用 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 | 
        | Jonesa@mojito.com | Bytes           | 1LTIuta&Sc | wrongpassword      | 
        | Jonesb@mojito.com | Bytes           | 1LTIuta&Sc | 1LTIuta&Sc         | 
        | Jonesc@mojito.com | 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();
        
    

【问题讨论】:

【参考方案1】:

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 的全部功能。

【讨论】:

【参考方案2】:

已解决 - 使用 @ 或 & 等字符不是问题。它实际上在我的 Given Statement 中使用了逗号。我发现如果我使用“并且”它有效。因此,为了让它发挥作用,声明必须写成如下:-

解决方案

    将语句写成

    Given I have completed the form with &lt;email&gt; and &lt;organisation&gt; and &lt;password&gt; and &lt;passwordConfirmation&gt;

    修改语句以在需要为字符串的参数周围加上单引号

    Given I have completed the form with '&lt;email&gt;' and '&lt;organisation&gt;' and '&lt;password&gt;' and '&lt;passwordConfirmation&gt;'

    生成步骤定义,然后将语句改回以排除单引号

    Given I have completed the form with &lt;email&gt; and &lt;organisation&gt; and &lt;password&gt; and &lt;passwordConfirmation&gt;

有点混乱,但它得到了正确的结果。希望将来 SpecFlow 将更新为默认将参数作为字符串处理。

【讨论】:

其实specflow documentation 说:根据 Gherkin 语言在占位符(例如 '' )周围放置单引号 ('),但有助于提高 SpecFlow 的解析能力场景大纲。第 3 步在此已过时,无需删除引号即可正常工作。【参考方案3】:

供将来参考,如果 Cater 的回答不起作用。我遇到了以下问题

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 抛出“输入字符串格式不正确”错误。就我而言,这需要很长时间才能找到。

还有什么要检查的:)

【讨论】:

以上是关于SpecFlow:场景大纲示例的主要内容,如果未能解决你的问题,请参考以下文章

Specflow:为许多场景大纲维护一个示例表

您可以在 SpecFlow 的场景大纲中标记各个示例吗?

Specflow 场景大纲未按预期工作

如何在下拉列表中选择与 specflow 大纲值相同的值

Specflow 场景大纲 - 更改自动生成的测试名称

具有多个场景的 Specflow 场景大纲