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 <email> and <organisation> and <password> and <passwordConfirmation>
修改语句以在需要为字符串的参数周围加上单引号
Given I have completed the form with '<email>' and '<organisation>' and '<password>' and '<passwordConfirmation>'
生成步骤定义,然后将语句改回以排除单引号
Given I have completed the form with <email> and <organisation> and <password> and <passwordConfirmation>
有点混乱,但它得到了正确的结果。希望将来 SpecFlow 将更新为默认将参数作为字符串处理。
【讨论】:
其实specflow documentation 说:根据 Gherkin 语言在占位符(例如 '供将来参考,如果 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:场景大纲示例的主要内容,如果未能解决你的问题,请参考以下文章