在SpecFlow中的示例表中有表

时间:2015-12-10 11:11:07

标签: cucumber bdd specflow gherkin

我正在使用SpecFlow和VisualStudio 2013来测试具有以下布局的特定Web表单 ********************开始:表格******************
名称:________________
年龄:_________________
经验:
工作地点|年数|
___________ | _________________ |
___________ | _________________ |
___________ | _________________ |
___________ | _________________ |
********************结束:表格******************

如何编写它以便我可以从示例中提取?

Given ...
When user fills 'Name-Box' with '<name>'
And user fills 'Age-Box' with '<age>'
And user fills experience with
|  Workplace   | NumberOfYears |
|  <workplace> |  <years>      |
And user clicks the 'Save' button
Then ...

Examples:
name|age
Sam|40
#note that there will be always 1 here.

Examples:
workplace|years
abc|2
xyz|3
pqr|4

我想这样做的原因是,我可以通过编程方式从外部电子表格生成示例表并动态更改它。是否有可能做到这一点?或者有什么不对吗?

2 个答案:

答案 0 :(得分:2)

您可以,但是您必须重新设置示例表:

Given ...
When user fills 'Name-Box' with '<name>'
And user fills 'Age-Box' with '<age>'
And user fills experience with
    | Workplace     | NumberOfYears |
    | <workplace 1> | <years 1>     |
    | <workplace 2> | <years 2>     |
    | <workplace 3> | <years 3>     |
    | <workplace 4> | <years 4>     |
And user clicks the 'Save' button
Then ...

Examples:
    | name | age | workplace 1 | years 1 | workplace 2 | years 2 | workplace 3 | years 3 | workplace 4 | years 4 |
    | Sam  | 40  | abc         | 2       | xyz         | 3       | pqr         | 4       |             |         |
    | Sam  | 40  | aaa         | 3       | bbb         | 12      |             |         |             |         |
    | Sam  | 40  | nnn         | 2       | ooo         | 20      | ppp         | 1       | qqq         | 3       |

表单中的每一行都需要一个&#34;工作空间X&#34;和&#34;年X&#34;示例表中的列。

STR说:

  

但是我们想让工作场所的数量无限制。那么,我如何为在3个工作场所有经验的人以及在15个工作场所有经验的另一个人定义行。通过固定数量的列,我们是否限制了测试的可能性?

这是事实。如果您需要无限数量的行,您仍然可以重新构建测试,但我认为您不能使用场景大纲。

您可以使用:

And user fills experience with
    | Row | Workplace | Number of Years |
    | 1   | a         | 2               |
    | 2   | b         | 4               |
    | 3   | c         | 10              |
    | ... | ...       | ...             |
    | 15  | o         | 1               |

步骤定义将分为两部分:

public class WorkExperienceRow
{
    public int RowNumber { get; set; }
    public string Workplace { get; set; }
    public int NumberOfYears { get; set; }
}

使用TechTalk.SpecFlow.Assist命名空间中的SpecFlow TableExtensions,上面的类可用于表示SpecFlow表中的每一行。

using TechTalk.SpecFlow;
using TechTalk.SpecFlow.Assist;

[Binding]
public class FooSteps
{
    [When(@"user fills experience with")]
    public void WhenUserFillsExperienceWith(Table table)
    {
        IEnumerable<WorkExperienceRow> experiences = table.CreateSet<WorkExperienceRow>();
        // Find the <table>

        foreach (var experience in experiences)
        {
            // Find the <tr> by index using experience.RowNumber
            // Find the text box in column #1
            // Fill in the text box with experience.Workplace
            // Find the text box in column #2
            // Fill in the text box with experience.NumberOfYears
        }
    }
}

答案 1 :(得分:0)

如果要在电子表格中定义SpecFlow示例集,可以使用SpecFlow+ Excel执行此操作。实际上,如果您愿意,可以在Excel中定义整个要素文件,或者只使用Excel中定义的示例扩展您的要素。您可以直接在Excel中进行更改,这些更改将反映在您的测试用例中。

如果您有兴趣了解更多信息,可以在 www.specflow.org/plus/excel/getting-started / 进行简要介绍,Gaspar Nagy在presentation给出了CukeUp! 2014年,其中包括一些示例以及概述。

但是我应该指出,与SpecFlow不同,SpecFlow +组件(SpecFlow + Excel和SpecFlow + Runner)需要购买许可证,而不是开源软件。您可以免费评估SpecFlow + Excel,但如果您尚未注册许可证,则会生成标题为“SpecFlow + Excel评估模式”的额外方案。

注意:抱歉无法点击链接,但我无法添加超过2个链接:(