5

我有几个用 NUnit 编写的单元测试,它们调用 selenium 命令。我已经设置了 2 个 win2k3 服务器盒,一个正在运行 selenium 网格集线器和 2 个 selenium rc。另一个盒子正在运行 5 个 selenium rc。它们都在中心注册为在 Windows 上运行 Firefox(为了简单起见)。在我的单元测试设置方法中,我已将它连接到端口 4444 处的集线器主机名。

运行测试时,它们仅按顺序运行(如预期的那样)。我已经阅读了大量关于 NUnit 的路线图以及他们如何争取并行测试能力的内容。与此同时,我已经看到了很多使用 PNUnit 的建议。然而,这似乎完全违背了 Selenium Grid 的目的。

你们中是否有人使用连接到 Selenium Grid 设置的 C#/NUnit 成功实现了并行测试?如果有,请详细说明。

我完全不知道这将如何/可以使用现在存在的 NUnit 工作(我使用的是 2.9.3 版)

4

5 回答 5

4

不幸的是,NUnit 无法并行运行测试,因此您必须使用另一个运行器来归档使用 Selenium Grid 进行并行测试的所有优势。

我在 c# 上使用 Gallio runner 进行测试,并在此处提供示例:

c# 上的项目,测试并行运行:http ://code.google.com/p/design-of-selenium-tests-for-asp-net/

描述:http ://slmoloch.blogspot.com/2009/12/design-of-selenium-tests-for-aspnet_19.html

Gallio 测试运行器:http ://www.gallio.org/

于 2009-12-23T09:54:42.897 回答
1

还有PNUnit,值得一看,我还没试过并行测试。

于 2010-04-24T18:12:46.653 回答
1

NCrunch ( http://www.ncrunch.net/ ) 值得一看 - 它可以选择分布式处理作为构建的一部分,它的主要功能之一是并行测试。

于 2014-09-23T09:32:43.867 回答
-1

通过将 Selenium Grid 与 .NET 的任务并行库和 DynamicObject 类结合使用,您可以同时在多个 Selenium Grid 节点(多个浏览器)上运行相同的测试。

http://blog.dmbcllc.com/running-selenium-in-parallel-with-any-net-unit-testing-tool/

于 2014-09-01T15:29:45.677 回答
-1

Gallio 今天已经过时了,所以你可以坚持使用 NUnit 解决方案。

从 3.7 版本开始,NUnit 允许并行运行测试。在此之前,可以在夹具级别上执行此操作,但在 3.7+ 中,您甚至可以在一个 TestFixute 中进行测试。请参阅下面的示例以演示如何实现它。

using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

namespace ConsoleApp1
{
    [TestFixture]
    public class Dummy
    {
        static TestCaseData Case(int i)
            => new TestCaseData(TimeSpan.FromSeconds(2)).SetName($"Case {i}");

        public static IEnumerable<TestCaseData> Cases()
            => Enumerable.Range(1, 5).Select(Case);

        [TestCaseSource(nameof(Cases)), Parallelizable(ParallelScope.Children)]
        public void ItShouldSleep(TimeSpan t)
            => Thread.Sleep(t);


        static TestCaseData Case2(int i)
            => new TestCaseData(TimeSpan.FromSeconds(2)).SetName($"Case2 {i}");

        public static IEnumerable<TestCaseData> Cases2()
            => Enumerable.Range(1, 5).Select(Case2);

        [TestCaseSource(nameof(Cases2)), Parallelizable(ParallelScope.Children)]
        public void ItShouldSleep2(TimeSpan t)
            => Thread.Sleep(t);
    }

    [TestFixture()]
    public class Dummy2
    {
        static TestCaseData Case(int i)
            => new TestCaseData(TimeSpan.FromSeconds(2)).SetName($"Case {i}");

        public static IEnumerable<TestCaseData> Cases()
            => Enumerable.Range(1, 5).Select(Case);

        [TestCaseSource(nameof(Cases)), Parallelizable(ParallelScope.Children)]
        public void ItShouldSleep(TimeSpan t)
            => Thread.Sleep(t);
    }
}
于 2018-08-09T19:42:08.953 回答