【问题标题】:How to run the same scenario for many times with different input data using SpecFlow?如何使用 SpecFlow 使用不同的输入数据多次运行相同的场景?
【发布时间】:2020-09-17 18:09:08
【问题描述】:

我想知道使用 SpecFlow 以不同的输入数据多次运行我的场景的最佳方法是什么。我对 Scenario Outline&Examples/Tables 有基本的了解,但我不知道如何实现我的目标,所以这是我真正需要的:

我有一个步骤应该使用通过 .feature 文件提供的数据填写表格。表单应该接受 'Dictionary ' 格式的数据(其中键 - 字段名称和值 - 要设置为该字段的值)。第一种选择是使用表格(在步骤下面执行以下操作):

什么时候 ... |键 |值| |姓名|马特 | |年龄 |20 | ...

然后创建一个将表格变量(参数)转换为字典的方法,但是在这里我必须在值列中创建几个具有不同数据的场景。

第二个选项是使用 Scenario Outline&Examples,但我想这也不好,因为如果我的表单有大量字段并且每个字段都应该是一个相应的占位符怎么办。

因此,在我看来,我正在寻找的解决方案介于这两种方法之间。希望你能帮助我,请不要对我太苛刻,我是一个非常初学者)

【问题讨论】:

    标签: c# selenium-webdriver specflow


    【解决方案1】:

    听起来您正在寻找纯粹的数据驱动测试。场景概述是如何在 SpecFlow 和行为驱动开发中实现这一点。您希望使用数据驱动测试的程度使该测试不适合 BDD 测试。这就是您遇到问题的原因 - 话虽如此,可能有一种方式可以在中间相遇。它将涉及场景大纲和一些修改的步骤,因此场景大纲中的占位符引用字典中的键。每一步都需要接受这个key作为参数,并据此处理数据:

    When the form is filled in with "<Dictionary Key>"
    Then the thing exists for "<Dictionary Key>"
    
    Examples:
        | Dictionary Key |
        | key1           |
        | key2           |
    

    字典是字典的字典:

    private readonly Dictionary<string, Dictionary<string, object>> testCaseData = new Dictionary<string, Dictionary<string, object>>()
    {
        {
            "key1",
            new Dictionary<string, object>()
            {
                { "field1", "value1" },
                { "field2", "value2" }
            }
        }, {
            "key2",
            new Dictionary<string, object>()
            {
                { "field1", "value3" },
                { "field2", "value4" }
            }
        }
    }
    

    还有你的步骤:

    [When(@"the form is filled in with ""(.*)"""]
    public void WhenSomething(string testCaseKey)
    {
        var formData = testCaseData[testCaseKey];
    
        // Enter formData["field1"] in web form
        // Enter formData["field2"] in web form
        // Submit form
    }
    
    [Then(@"Then the thing exists for ""(.*)"""]
    public void ThenTheThingExistsFor(string testCaseKey)
    {
        var expectedData = testCaseData[testCaseKey];
    
        // Make your assertions
    }
    

    这至少应该消除功能文件中数据的复杂性,这样您就可以将每个步骤的措辞重点放在业务运营上。您也不一定需要在 C# 中对数据进行硬编码。我想你可以将它保存为文本、CSV 或 excel 电子表格,阅读它,然后将其解析成可用的东西,如果效果更好的话。

    【讨论】:

    • 嗨,格雷格,感谢您帮助我。好主意,很适合我。
    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2020-11-13
    • 2013-06-13
    • 2010-10-19
    相关资源
    最近更新 更多