是否可以在不关闭浏览器的情况下在场景大纲中运行多个示例?

时间:2015-02-13 19:01:58

标签: c# specflow

所以我们使用SpecFlow(C#和Selenium WebDriver)进行功能测试。

我仍然很擅长使用SpecFlow和Selenium。我的导师告诉我,他们希望以一种只有一次的方式编写场景(你设置测试,我执行一两个动作然后断言)。

所以我有一个场景大纲,如下:

Scenario Outline: Outline label Given I am on the proper page When I apply filter "" with "" And I click filter Then the data should be filtered Examples: | filter | params | | Date | Today | | Name | Some Name | | ... [20+ more] ... |

然而,我的导师说最好做这样的事情: Scenario: Scenario label Given I am on the proper page When I apply and filter with | filter | params | | Date | Today | | Name | Some Name | | ... [20+ more] ... | Then the data should be filtered

关键在于浏览器不必为每个过滤器测试关闭并重新打开。相反,过滤器将在下一个之前被清除。

但是,我不确定如何以最佳方式完成此任务。由于每个过滤器都需要在下一个过滤器完成之前进行验证,断言在哪里完成?在“当我应用并过滤”时,然后“然后数据应该被过滤”只是检查以确保没有失败?这似乎有点奇怪,因为“When”案例应该在一个人失败后立即停止。

或者“When”可以将所有内容存储在表中,然后“Then”将应用过滤器并执行断言 - 但它随后不再是一个因为它正在做的事情而不是断言预期的条件已经已经满足了。

我一直在寻找与解决方案类似的问题,但我还没有找到任何东西。

我想我的基本问题是如何执行多个不同但相似的步骤,而无需为每个单独的示例打开/关闭浏览器(如场景大纲所示)?这是一种甚至是好的做法还是可能的(在一个场景中无需多次/多次)?在/ thens时做多次(例如当......然后......当......然后......)一个坏主意也是如此?

提前致谢!我一直试图研究相关问题几天,但没有找到任何帮助。

3 个答案:

答案 0 :(得分:3)

避免在测试之间关闭/重新打开浏览器的一个好选择是在SpecFlow中查看Hooks。您可以使用[BeforeFeature]或[BeforeTestRun]挂钩(或更多变体)启动浏览器一次,然后在测试结束时关闭浏览器之前运行大量测试。

如果您需要在每次测试之后/之前让系统恢复到某个状态,您可以在开始时使用一个[BeforeFeature] / [BeforeTestRun]挂钩启动浏览器,然后启动一个或多个[AfterScenario] / [ BeforeScenario]挂钩清理任何特定于场景的数据,以便保持每个测试的清洁,但避免关闭浏览器以清理会话/ cookie /等。如果需要,您甚至可以在[AfterScenario]钩子中使用WebDriver清除过滤器,然后再开始下一次测试。

答案 1 :(得分:0)

这就是我解决问题的方法...... SpecFlow Browser Document

您会注意到我使用单例字典存储功能生命周期中的打开浏览器实例。然后在AfterFeature钩子中,我浏览并关闭所有打开的浏览器。

答案 2 :(得分:-2)


以下是我对这个问题的看法,

首先,它似乎更像是一个Specflow问题,而不是一个Selenium问题 您知道场景和场景大纲之间的区别吗?
场景是一项测试。它可以有里面的表,但只是为了组织特定的步骤。您可以从句子中取出参数并将它们放入表格中,这样可以为您提供更有活力的步骤 而不是:

    当我用 kuku 应用过滤器 filter_a 时 你可以写:

    当我用
施加过滤器时     |过滤器| param |
    | filter_a | kuku |

另一方面, Scenario Outline 是具有相同格式的不同测试的模板,因此每个表行实际上是每个场景的不同参数集。
这是一个来自Google其他许多人的例子:
How can I repeat steps in a Specflow Scenario Outline

关于场景和情景大纲的内容。

如何在测试之间处理关闭webdriver是您的选择。我想这取决于逻辑。
我可以告诉你有关验证的一件事 - 如果你在每个步骤中验证过滤器而不是最终验证过滤器会更容易,因为在后者中如果测试失败了将更难调试并找到导致问题的原因。此外,如果其中一个过滤器出现故障,则无法进一步处理,对吧?当然,如果我理解你的问题,表格只是一组测试的一组参数。