是否可以在不关闭浏览器的情况下在场景大纲中 运行 多个示例?
Is it possible to run multiple Examples in a Scenario Outline without closing the browser?
所以我们使用 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 I apply and filter with" 然后 "Then the data should be filtered" 只是检查以确保没有失败?这似乎有点奇怪,因为 "When" 案例一旦失败就应该停止。
或者,"When" 可以只将所有内容存储在 table 中,而 "Then" 将应用过滤器并进行断言——但它不再是 then,因为它正在做的不仅仅是断言已满足预期条件。
我一直在浏览以尝试解决类似问题的解决方案,但我没有找到任何东西。
我想我的基本问题是如何执行多个不同但相似的步骤,而不必 open/close 每个单独示例的浏览器(如场景大纲所示)?这甚至是好的做法还是可能的(无需在单个场景中执行多个 when/thens)?做多个 when/thens(例如,当...然后...当...然后...)也是一个坏主意吗?
提前致谢!几天来我一直在尝试研究相关问题,但没有找到任何帮助。
这是我对这个问题的看法,
首先,它看起来更像是一个 Specflow 问题,而不是一个 Selenium 问题。
你知道Scenario和Scenario Outline的区别吗?
场景是单人测试。它可以有 table 里面,但这只是为了组织那个特定的步骤。您可以将论点从句子中取出并放入 table 中,这会给您带来更多动态步骤。
而不是:
当我应用过滤器 filter_a 和 kuku
你可以这样写:
当我使用
应用过滤器时
|过滤器|参数 |
|filter_a |库库 |
另一方面,Scenario Outline是不同测试的模板,格式相同,所以每个table行实际上是不同的一组参数场景。
这是 Google 中许多其他示例中的一个示例:
How can I repeat steps in a Specflow Scenario Outline
关于场景和场景大纲。
您如何处理测试之间关闭 webdriver 是您的选择。我想这取决于逻辑。
关于验证我可以告诉你一件事 - 如果你在每个步骤中而不是在最后验证过滤器,那对你来说会容易得多,因为在后者中如果测试失败调试和查找导致问题的原因将更加困难。此外,如果其中一个过滤器失败,则没有必要进一步处理,对吗?那当然是为了防止我理解你的问题,table 只是一个测试的一组参数。
避免在测试之间 close/re-open 浏览器的一个很好的选择是查看 SpecFlow 中的 Hooks。您可以使用 [BeforeFeature] 或 [BeforeTestRun] 挂钩(或更多变体)启动浏览器一次,然后 运行 多次测试,然后在测试结束时关闭浏览器。
如果你需要让你的系统回到特定状态after/before每次测试,你可以有一个 [BeforeFeature]/[BeforeTestRun] 挂钩在开始时启动浏览器,然后一个或多个 [ AfterScenario] / [BeforeScenario] 挂钩清理任何特定于场景的数据,以便您保持每个测试干净,但避免关闭浏览器来清理您的 session/cookies/etc。如果需要,您甚至可以在 [AfterScenario] 钩子中使用 WebDriver 清除过滤器,然后再开始下一次测试。
我就是这样解决问题的...SpecFlow Browser Document
您会注意到我使用单例字典来存储功能生命周期内打开的浏览器实例。然后在 AfterFeature 挂钩中,我检查并关闭所有打开的浏览器。
所以我们使用 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 I apply and filter with" 然后 "Then the data should be filtered" 只是检查以确保没有失败?这似乎有点奇怪,因为 "When" 案例一旦失败就应该停止。
或者,"When" 可以只将所有内容存储在 table 中,而 "Then" 将应用过滤器并进行断言——但它不再是 then,因为它正在做的不仅仅是断言已满足预期条件。
我一直在浏览以尝试解决类似问题的解决方案,但我没有找到任何东西。
我想我的基本问题是如何执行多个不同但相似的步骤,而不必 open/close 每个单独示例的浏览器(如场景大纲所示)?这甚至是好的做法还是可能的(无需在单个场景中执行多个 when/thens)?做多个 when/thens(例如,当...然后...当...然后...)也是一个坏主意吗?
提前致谢!几天来我一直在尝试研究相关问题,但没有找到任何帮助。
这是我对这个问题的看法,
首先,它看起来更像是一个 Specflow 问题,而不是一个 Selenium 问题。
你知道Scenario和Scenario Outline的区别吗?
场景是单人测试。它可以有 table 里面,但这只是为了组织那个特定的步骤。您可以将论点从句子中取出并放入 table 中,这会给您带来更多动态步骤。
而不是:
当我应用过滤器 filter_a 和 kuku
你可以这样写:
当我使用
应用过滤器时
|过滤器|参数 |
|filter_a |库库 |
另一方面,Scenario Outline是不同测试的模板,格式相同,所以每个table行实际上是不同的一组参数场景。
这是 Google 中许多其他示例中的一个示例:
How can I repeat steps in a Specflow Scenario Outline
关于场景和场景大纲。
您如何处理测试之间关闭 webdriver 是您的选择。我想这取决于逻辑。
关于验证我可以告诉你一件事 - 如果你在每个步骤中而不是在最后验证过滤器,那对你来说会容易得多,因为在后者中如果测试失败调试和查找导致问题的原因将更加困难。此外,如果其中一个过滤器失败,则没有必要进一步处理,对吗?那当然是为了防止我理解你的问题,table 只是一个测试的一组参数。
避免在测试之间 close/re-open 浏览器的一个很好的选择是查看 SpecFlow 中的 Hooks。您可以使用 [BeforeFeature] 或 [BeforeTestRun] 挂钩(或更多变体)启动浏览器一次,然后 运行 多次测试,然后在测试结束时关闭浏览器。
如果你需要让你的系统回到特定状态after/before每次测试,你可以有一个 [BeforeFeature]/[BeforeTestRun] 挂钩在开始时启动浏览器,然后一个或多个 [ AfterScenario] / [BeforeScenario] 挂钩清理任何特定于场景的数据,以便您保持每个测试干净,但避免关闭浏览器来清理您的 session/cookies/etc。如果需要,您甚至可以在 [AfterScenario] 钩子中使用 WebDriver 清除过滤器,然后再开始下一次测试。
我就是这样解决问题的...SpecFlow Browser Document
您会注意到我使用单例字典来存储功能生命周期内打开的浏览器实例。然后在 AfterFeature 挂钩中,我检查并关闭所有打开的浏览器。