gpt4 book ai didi

c# - SpecFlow 功能可以在步骤之间共享吗?

转载 作者:太空狗 更新时间:2023-10-30 00:33:58 38 4
gpt4 key购买 nike

我们有我们想从三个不同角度测试的代码:

  • 内部(直接调用)
  • 网络服务
  • 网络应用

因为我们不想写三次特性文件,所以似乎我们应该在步骤之间共享特性,但我不知道如何做到这一点,除了可能在 VS 项目之间共享文件,它有总是看起来有点,嗯,不稳定。

在项目之间共享特征文件是实现这一目标的最佳方式,还是有更明智的方法?

最佳答案

我知道很久以前有人问过这个问题,但我认为您想要的是可能的,据我所知,有几种方法可以实现。实际上,您真正想要的是一次定义该功能,但根据您是调用内部服务、公共(public) Web 服务还是 WebApp 来切换为该功能调用的步骤。在 mailing list for specflow 上讨论了解决此问题的各种方法。但它的要点如下(示例显示了 API 与 UI 方法,但我相信这同样适用于您的内部与网络服务与 webapp):

选项1#

(感谢邮件列表中的 Oliver Friedrich)

您需要为每个您想要为步骤而变化的选项创建一个程序集,一个用于内部,一个用于 Web 服务,一个用于 Web 应用程序。您告诉 specflow 关于配置中的所有不同程序集,如下所示:

<specFlow>
<stepAssemblies>
<stepAssembly assembly="Tests.API" />
<stepAssembly assembly="Tests.UI" />
</stepAssemblies>
</specFlow>

然后在您的常见测试步骤中,您有一些 [BeforeTestRun] 步骤选择从哪个程序集加载步骤:

[Binding]
public class TestRunSetup {

// this method needs to be static
[BeforeTestRun]
public static void BeforeTestRun()
{
if (RunApiTests()) // <-- implement this method to choose whether to run the tests via your chosen method
{
Assembly.Load("Tests.API");
}
else
{
Assembly.Load("Tests.UI");
}
}
}

选项 2 ##

(感谢邮件列表中的 Gáspár Nagy)

尝试 generating the tests during the build .我不确定这将如何运作,但这是我们可以调查的领域。

选项 3 ##

(感谢邮件列表中的 Dan Mork)

如果您使用 SpecFlow 的依赖项注入(inject)功能,那么您可以创建一个接口(interface)来执行您想要执行的调用,并在一组通用步骤中使用它。然后您可以拥有该接口(interface)的 3 个实现,一个调用您的内部服务,一个调用 Web 服务,一个操作 Web 应用程序。剩下的就是将该接口(interface)的正确实现注入(inject)到 specflow 步骤文件中,这可以像这样完成:

// the abstract concept of the system that could be implemented with 
Selenium, HttpClient, etc.
public interface IDocument
{
string Title { get;}
void Load();
}

// the steps that are executed when the scenarios from your feature
file are executed
[Binding]
public class Steps
{
private readonly IDocument _document;

public Steps(IDocument document)
{
_document = document;
}

[Given("something")]
public void GivenSomething()
{
// set up given state
}

[When("I view the document")]
public void WhenIViewTheDocument()
{
_document.Load();
}

[Then(@"the title should be ""(.*)""")]
public void Then(string title)
{
Assert.ArEqual(_document.Title, title);
}
}

// this is where the magic happens - get the dependency injection
// container and register an IDocument implementation
[Binding]
public class Dependencies
{
private readonly IObjectContainer _objectContainer;

public Dependencies(IObjectContainer objectContainer)
{
_objectContainer = objectContainer;
}

[BeforeScenario]
public void RegisterDocumentInterfaces()
{
// register the correct IDocument implementation - UI or API
}
}

这仍然留给你如何知道哪个问题实现注册。这将取决于你的具体情况解决方案,您的构建环境,您的测试执行环境,等等。一些选项...

  • BeforeScenarioAttribute 的标记参数
  • 为您的项目创建两个不同的构建配置每个定义不同的常量并使用预编译器指令来在代码中建立正确的注册
  • 添加条件逻辑来检查环境变量
  • 添加条件逻辑来检查配置设置
  • 我没有检查过,但也许 ScopeAttribute 是可扩展的你创建一个子类并提供你自己的逻辑是否BeforeScenarioAttribute 方法被执行。

希望这会给你一些选择来做你想做的事。

恕我直言,第一个选项可能是最好的,尽管选项 3 也很不错。

关于c# - SpecFlow 功能可以在步骤之间共享吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9381350/

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