gpt4 book ai didi

specflow - 是否可以以编程方式向场景添加行?

转载 作者:行者123 更新时间:2023-12-04 18:41:42 25 4
gpt4 key购买 nike

我想在每个 SpecFlow 测试的开头添加相同的行。

该行指定了随时间变化的几个场景的列表,因此为每个测试维护此列表是不可行的。

例如:

Given I have set my site theme to <MyTheme>
|Theme Names|
|Theme 1 |
|Theme 2 |
|Theme 3 |
|Theme 4 |
|Theme 5 |

我想为每个主题重复这个测试。主题列表不是一成不变的,应该在一个地方维护。

到目前为止,我已经成功地创建了一个 Generator Plugin ,并且我计划在生成测试类之前立即使用此插件来更改 SpecFlow 功能。但是,我看不到在此上下文中编辑场景的方法。

是否可以从 IUnitTestGeneratorProvider 的实现中获取和设置场景文本? ?

我不打算使用这种方法,所以如果有人可以提出更好的方法来做到这一点,那么我也会接受。

抱歉,如果我弄错了一些术语 - 我才刚刚开始使用 SpecFlow。

编辑:

我添加此部分是为了澄清我实际追求的内容。

假设我有一个包含 800 个测试的测试套件。我们有一个业务需求,即对每个可用主题运行这 800 个测试中的每一个。可用主题列表可以随时更改,将这个列表保存在多个位置是不可行的。

因此,例如,如果我进行以下两个测试:

示例 A:
    Given I set context to < site >
Given I go to base url
When I type <username> in username field
When I type <password> in password field
When I click login button
Examples:
| site | username | password |
| MySuperSite | chris | mypassword |
| MySuperSite2 | chris2 | mypassword |



Given I am logged in
Given I go to base url
When I click logout button
Then I am logged out

我可以简单地手动将这些测试更改为以下内容:

示例 B:
    Given I am using the < theme > theme
Given I set context to < site >
Given I go to base url
When I type <username> in username field
When I type <password> in password field
When I click login button
Examples:
| site | username | password | theme |
| MySuperSite | chris | mypassword | theme1 |
| MySuperSite2 | chris2 | mypassword | theme1 |
| MySuperSite | chris | mypassword | theme2 |
| MySuperSite2 | chris2 | mypassword | theme2 |
| MySuperSite | chris | mypassword | theme3 |
| MySuperSite2 | chris2 | mypassword | theme3 |



Given I am using the < theme > theme
Given I am logged in
Given I go to base url
When I click logout button
Then I am logged out
Examples:
| theme |
| theme1 |
| theme2 |
| theme3 |

这有几个问题:
  • 重复的数据使测试变得臃肿
  • 如果我们不再选择支持 theme2然后有人将不得不通过每个测试并将其从示例表中删除(在上面的示例中不算太糟糕,但是我们有超过 800 个测试)
  • 已经有示例表的测试的表大小将乘以我们支持的主题数 (>40)
  • 由于有人无意中忘记将特定主题添加到测试中,因此存在很大的手动错误风险

  • 目标:
    我希望能够让我们的测试人员以 Example A 的风格编写测试。 ,但是让测试本身编译成如果它们以 Example B 的风格编写时会怎样。 .

    我为 specflow 创建了一个生成器插件,目的是拦截测试创建,然后以编程方式添加行 Given I am using the < theme > theme ,然后根据需要更新或添加任何示例数据。但是,我似乎无法从这里执行此操作。

    谁能告诉我这是否可行,如果可以,我应该怎么做?

    最佳答案

    好的,我想通了。它采取了几个步骤:

    翻翻GitHub上的源代码,发现UnitTestFeatureGenerator这似乎是负责将 specflow 文件转换为单元测试的类。

    然后我创建了一个继承自 UnitTestFeatureGenerator 的新类。并隐藏 GenerateUnitTestFixture来自基类的方法。

    在我的 body GenerateUnitTestFixture类,然后在移交 base.GenerateUnitTestFixture 之前将所需的额外步骤添加到场景中生成单元测试。这是它的要点:

    public class MultiThemeUnitTestFeatureGenerator : UnitTestFeatureGenerator, IFeatureGenerator
    {
    public MultiThemeUnitTestFeatureGenerator(IUnitTestGeneratorProvider testGeneratorProvider, CodeDomHelper codeDomHelper, GeneratorConfiguration generatorConfiguration, IDecoratorRegistry decoratorRegistry)
    : base(testGeneratorProvider, codeDomHelper, generatorConfiguration, decoratorRegistry)
    {}

    public new CodeNamespace GenerateUnitTestFixture(Feature feature, string testClassName, string targetNamespace)
    {
    foreach (var scenario in feature.Scenarios)
    {
    scenario.Steps.Insert(0, new Given {Text = "Given I have <Theme> set as my current theme"});

    //add any other steps you need....
    }

    return base.GenerateUnitTestFixture(feature, testClassName, targetNamespace);
    }
    }

    一旦我完成了所有这些设置,我需要一种方法来告诉 specflow 使用我的新类而不是当前注册的 UnitTestFeatureGenerator .这是开始工作的复杂部分,因为文档几乎只是说“即将推出”。谢天谢地,我 found an excellent blog post which outlines all the pitfalls.

    我的 IGeneratorPlugin实现看起来像这样:
    public class MultiThemeGeneratorPlugin : IGeneratorPlugin
    {
    public void RegisterDependencies(ObjectContainer container)
    {}

    public void RegisterCustomizations(ObjectContainer container, SpecFlowProjectConfiguration generatorConfiguration)
    {
    container.RegisterTypeAs<MultiThemeFeatureGeneratorProvider, IFeatureGeneratorProvider>("default");
    }

    public void RegisterConfigurationDefaults(SpecFlowProjectConfiguration specFlowConfiguration)
    {}
    }

    注意我注册了 IFeatureGeneratorProvider而不是 IFeatureGenerator .我必须创建 IFeatureGeneratorProvider 的实现返回 IFeatureGenerator 的实现实例我感兴趣的是:
    public class MultiThemeFeatureGeneratorProvider : IFeatureGeneratorProvider
    {
    private readonly ObjectContainer _container;

    public MultiThemeFeatureGeneratorProvider(ObjectContainer container)
    {
    _container = container;
    }

    public int Priority
    {
    get { return int.MaxValue; }
    }

    public bool CanGenerate(Feature feature)
    {
    return true;
    }

    public IFeatureGenerator CreateGenerator(Feature feature)
    {
    return _container.Resolve<MultiThemeUnitTestFeatureGenerator>();
    }
    }

    关于specflow - 是否可以以编程方式向场景添加行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24610533/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com