【问题标题】:Relationship between NUnit, Selenium, Selenium Grid and Specflow and the role/purpose of eachNUnit、Selenium、Selenium Grid 和 Specflow 之间的关系以及它们各自的作用/目的
【发布时间】:2019-12-29 06:09:06
【问题描述】:

在修改测试代码(C#、Selenium + Specflow VS 2017 项目)以使用 selenium 网格运行并在我的机器上设置 selenium 服务器后,测试成功并行运行。

当我关闭 selenium 服务器并将测试代码修改回只使用 webDriver 而不是 RemoteWebDriver 时,我很困惑地看到测试仍然并行运行......但是,我没有删除以下代码行来自 AssemblyInfo.cs 文件:

[assembly: Parallelizable(ParallelScope.Fixtures)]

一旦上面的代码行被注释掉,测试就会再次串行运行。

问题 1:Selenium 和 Specflow 都有自己的工具(不仅仅是 selenium)来允许并行运行测试,这是否正确?这是在花时间阅读试图弄清楚为什么/如何发生这种魔法之后得出的结论 (specflow parallel)。在出现这种意外行为之前,我还没有阅读任何有关 specflow 并行工具的信息(总是硒网格)。

问题 2:哪个最好用?我猜想虽然与 Selenium 服务器并行工具 (Selenium Grid) 并行运行涉及更多,但从长远来看,Selenium Grid 可能是最好的。看起来像 Selenium Grid,您可能可以同时运行更多线程,因为您可以创建任意数量的节点,并且每个节点可以处理多个线程(浏览器)。


编辑 JimEvans 评论:

嗨,吉姆·埃文。在测试世界中阅读信息时,我经常看到你的名字。非常感谢提供信息。您在下面的陈述重定向了我的阅读和搜索信息。在阅读了更多关于您所说的内容之后,这就是我现在所理解的。我想知道这离正确有多近……尤其是声明#4。

  1. AssemblyInfo.cs 中的语句 [assembly: ... ] 被 NUnit 测试框架读取和理解。如果 NUnit 不存在,则语句 [assembly: ...] 将不存在。
  2. Specflow 和 Selenium 都可以放置在(使用)不同的测试框架之上;其中之一是 NUnit。 Specflow 和 Selenium 都致力于确保它们的库(基于 NUnit 的代码)不会阻止使用 NUnits 并行功能。
  3. 看来,specflow 可能对线程设置了一些限制。看起来 Specflow 架构可能最适合并行运行功能(fixtures ... ParallelScope.Fixtures),但不允许功能内的场景并行运行(ParallelScope.All 可能在 Specflow 中不起作用,但 需要进一步研究)。
  4. 这是一个正确的陈述吗:Selenium Grid 将 NUnit 并行执行提升到了一个新的水平……它允许在多个节点上运行测试,从而使其更加强大……这些节点要么在一台机器上或分散在多台机器上(获得更多处理能力)。我猜如果没有 Selenium Grid,由于硬件限制,NUnit 只能创建这么多线程。 Selenium Grid 作为一种可用空间管理器(大部分时间跨多台机器)用于运行测试。 Selenium webdriver 与浏览器和浏览器交互(浏览器的打开和关闭)密切相关;每个线程一个浏览器; NUnit 控制和管理线程; Selenium Grid 知道有多少资源(处理器和机器)可用于运行允许 NUnit 不断推出新线程的线程,然后 selenium webdriver 可以在该线程上打开 Web 浏览器并开始测试。

在了解 Selenium 没有可并行执行的特殊代码后,我开始对下图中的信息进行不同的解释(这是描述 Selenium Grid 的一个很好的陈述)。

Location the above text came from

【问题讨论】:

  • Selenium 没有特殊的代码可以并行执行代码。它完全是您的测试运行程序和/或执行框架的功能。
  • @JimEvans,感谢您的反馈。我希望所做的更正更准确地描述了 Selenium、Selenium Grid、Specflow 和 NUnit 之间的联系。
  • 第 4 点 - Selenium Hub 只是充当一种分发器。“Selenium Grid 知道有多少资源(处理器和机器)” - Selenium 集线器/节点不知道机器上的处理器。 Selenium Hub 知道注册了特定功能的节点(firefox+linux/firefox+windows 等)github.com/SeleniumHQ/selenium/wiki/Grid2 (github.com/SeleniumHQ/selenium/wiki/Grid2#optional-parameters) 检查'-maxSession'

标签: selenium parallel-processing specflow selenium-grid


【解决方案1】:

SpecFlow 是 C# 的行为驱动开发测试框架

SpecFlow 确实适用于各种测试运行器 - 在您的情况下,Nunit 充当运行器。 [Nunit 也可以不用specflow作为框架使用]

AssemblyInfo.cs 中的语句 [assembly: ... ] 被读取并 由 NUnit 测试框架理解。如果 NUnit 不存在 语句 [assembly: ...] 将不存在。

-- 正确。 [程序集:Parallelizable(ParallelScope.Fixtures)] [Parallelizable 属性来自Nunit]1

Specflow 和 Selenium 都可以放置在(使用)不同的之上 测试框架的;其中之一是 NUnit。 Specflow 和 Selenium 工作以确保他们的库(NUnit 之上的代码)确实 不阻止使用 NUnits 并行功能。

-- SpecFlow 是 C# 的行为驱动开发测试框架,Nunit 充当运行器。还有其他运行器,例如xUnit,MsTest V2 。 Specflow 正在使用 Nunit 并行运行这些功能。将 Selenium 视为与并行执行无关的独立库。

specflow 似乎对 穿线。看起来 Specflow 架构可能是最好的 适合在 并行,但不允许功能中的场景在其中运行 并行(ParallelScope.All 可能在 Specflow 中不起作用,但需要 多看看这个)。

-- 如果在 Assembly 中添加 Parallelizable(ParallelScope.Fixtures),Specflow+NUnit 会并行运行功能。

参考:Specflow+NUnit just run features in parallel not scenarios

这是一个正确的说法吗:Selenium Grid 采用 NUnit 并行 执行力更上一层楼……它通过以下方式使其更加强大 允许测试在多个节点上运行......节点要么在 1 机器或隔开多台机器(访问更多 处理能力)。我猜如果没有 Selenium Grid,NUnit 由于硬件限制,只能创建这么多线程。 Selenium Grid 充当一种可用空间的管理器(大多数 跨多台机器的时间)用于运行测试。硒 webdriver与浏览器和浏览器交互密切相关 (打开和关闭浏览器);每个线程一个浏览器; NUnit 是 控制和管理线程; Selenium Grid 知道有多少 资源(处理器和机器)可用于运行 允许 NUnit 不断推出新线程的线程 selenium webdriver 然后可以在该线程上打开 Web 浏览器,然后 开始测试。

假设我们有两个功能文件。 功能文件 1 - 场景 A 功能文件 2 - 场景 B

假设我们在一个功能(一个线程)中创建一个 Chromedriver 实例。

如果两个功能并行运行,那么我们就有两个 chromedriver 实例。当我们创建 chromedriver (remote) 实例时,请求将转到 Selenium Grid hub。 根据能力,Selenium Hub 会将请求转发到有能力的节点。节点将创建会话(浏览器)并将会话 ID 发送回客户端(这里是它的 C# Selenium)。 所有未来的通信都将使用这个唯一的会话 ID 进行。当我们并行运行两个功能时,我们将有两个会话 ID。一个线程一个会话 ID。

为了在本地机器上并行运行场景,您可能不需要您已经想出的网格 (RemoteWebDriver),如问题中所述。

Selenium 集线器没有关于处理器/机器的信息。 Hub 只知道注册的节点。

以上信息是在 Selenium Grid 3 的上下文中

您可能想了解 Selenium Grid 4 Selenium Grid 4 运行新网格的三种方式

  1. “独立”
  2. “集线器”和“节点”
  3. “路由器”,“分销商”,“会话”, 和“节点”

【讨论】:

  • 谢谢@Rahul L. 很好的回答。帮了大忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2021-06-08
  • 2021-05-26
  • 1970-01-01
  • 2011-05-28
相关资源
最近更新 更多