C# 如何使用SpecFlow使用不同的输入数据多次运行同一场景?

C# 如何使用SpecFlow使用不同的输入数据多次运行同一场景?,c#,selenium-webdriver,specflow,C#,Selenium Webdriver,Specflow,我想知道使用SpecFlow多次使用不同的输入数据运行场景的最佳方式是什么。我对场景大纲和示例/表格有基本的了解,但我不知道如何实现我的目标,所以这里是我真正需要的:我有一个步骤,应该用.feature文件中提供的数据填写表单。表单应该接受“Dictionary”格式的数据(其中key-fieldname和value-value被设置为该字段)。第一个选项是使用表(在步骤下方执行以下操作): 什么时候 |键值| |姓名|马特| |年龄| 20| ... 然后创建一个将表变量(参数)转换为字典的

我想知道使用SpecFlow多次使用不同的输入数据运行场景的最佳方式是什么。我对场景大纲和示例/表格有基本的了解,但我不知道如何实现我的目标,所以这里是我真正需要的:我有一个步骤,应该用.feature文件中提供的数据填写表单。表单应该接受“Dictionary”格式的数据(其中key-fieldname和value-value被设置为该字段)。第一个选项是使用表(在步骤下方执行以下操作):

什么时候 |键值| |姓名|马特| |年龄| 20| ... 然后创建一个将表变量(参数)转换为字典的方法,但在这里,我必须使用值列中的不同数据创建几个场景

第二种选择是使用场景大纲和示例,但我想这也不好,因为如果我的表单有大量字段,并且每个字段都应该有一个相应的占位符,该怎么办


所以,在我看来,我正在寻找的解决方案介于这两种方法之间。希望你能帮助我,请不要对我太苛刻,我是一个非常初学者)听起来你在寻找一个纯数据驱动的测试。场景概述是如何在SpecFlow和行为驱动开发中实现这一点的。您希望使用数据驱动测试的程度使得此测试不适合BDD测试。这就是为什么你在这方面有麻烦-现在说,也许有办法在中间相遇。它将涉及场景大纲和一些修改的步骤,以便场景大纲中的占位符引用字典中的键。每个步骤都需要接受此键作为参数,并按照以下方式处理数据:

When the form is filled in with "<Dictionary Key>"
Then the thing exists for "<Dictionary Key>"

Examples:
    | Dictionary Key |
    | key1           |
    | key2           |

这至少可以消除功能文件中数据的复杂性,这样您就可以将每个步骤的措辞集中在业务操作上。您也不一定需要用C#硬编码数据。我想您可以将其保存为文本、CSV或excel电子表格,阅读并将其解析为可用的内容,如果这样做效果更好的话。

嗨,格雷格,谢谢您的帮助。好主意,很适合我。
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
}