【问题标题】:Run SpecFlow scenario from code从代码运行 SpecFlow 场景
【发布时间】:2020-02-11 03:41:05
【问题描述】:

我正在尝试从代码而不是通过测试资源管理器或命令行运行 SpecFlow 场景。有人设法做到这一点吗?

从一个场景中,我可以通过递归提取方法名和测试方法,但是我不能运行这个场景方法。它似乎需要适当的初始化和拆卸,但我无法做到这一点。

我的第一个想法是使用TechTalk.SpecFlow.TestRunner类,但它似乎没有场景选择方法。

编辑我为什么要这样做:
我们想从 TFS 运行特定场景。在 TFS 中将 TestMethods 连接到 WorkItems 非常麻烦,因为:

  • 您只能将一种测试方法分配给一个工作项
  • 对于每个工作项,您必须搜索方法名称,这本身就是一件麻烦事,因为列表很长,有很多规范流场景。
  • 当您的 specflow 场景获得不同的名称时(这种情况经常发生),TFS 无法再找到正确的方法
  • Specflow 场景大纲几乎无法使用,但它们是一个非常强大的功能。

我想创建一种机制,让每个自动化工作项都分配相同的方法。此方法提取工作项 id 并搜索并执行带有此工作项标记的场景。

【问题讨论】:

  • 我认为从代码中运行场景有点棘手,因为您必须设置一个测试运行环境,我认为这可能有点复杂。你能简要解释一下你想通过这样做实现什么吗?也许有一种更简单的方法来解决您的问题,而不是通过代码运行场景。
  • @realtime,谢谢提问,我加了解释。
  • 感谢您的解释!抱歉,这目前有点跑题了。但我不明白将 WorkItems 连接到 TestMethods 背后的意义。如果我有一个 WorkItem,它会解决某个错误,也许是我想要拥有的功能。然后我想要一个单独的测试用例来专门解决这个问题。仅此一项就对可追溯性有很大帮助!一个测试用例(在我的世界里)等于一个特性文件。所以我将功能(或文件)连接到 WorkItems。不再关心场景名称的更改,您需要维护的跟踪连接也少了很多。

标签: c# unit-testing specflow


【解决方案1】:

我遇到了类似的问题,因为我的测试在场景之间存在一些依赖关系(我感到羞耻,但它为每个功能文件节省了大量的复制粘贴行)。在大多数情况下,我当然会坚持孤立的场景。

我使用了反射

  1. Find all Types with a DescriptionAttribute(又名功能)
  2. 使用 TestAttribute 和 DescriptionAttribute(又名场景)查找他们的 MethodInfos
  3. 将它们存储到字典中
  4. 使用 Activator.CreateInstance 和 Invoke 通过“功能标题/场景标题”调用它们

当然,您必须根据需要设置(私有)字段“testRunner”。

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    相关资源
    最近更新 更多