如何使用selenium和单个NUnit套件测试多个浏览器并将其保持干燥状态?

Tim*_*ord 9 selenium nunit cross-browser

我正在寻找一种方法来重用一个NUnit测试套件,而无需为每个浏览器复制整个套件.看起来我需要为每个浏览器安装一个新夹具.我可以从NUnit gui发送某种环境变量或配置设置来切换浏览器吗?见下文:

[TestFixture]
public class User
{
    private ISelenium selenium;
    private StringBuilder verificationErrors;

    [SetUp]
    public void SetupTest()
    {
        // TheBrowser = How do I populate this variable from the NUnit gui? 
        selenium = new DefaultSelenium("localhost", 4444, **TheBrowser**, "http://localhost:52251/");
        selenium.Start();
        verificationErrors = new StringBuilder();
    }

    [TearDown]
    public void TeardownTest()
    {
      ...
    }

    [Test]
    public void SearchUser()
    {
       ... 
    }

}
Run Code Online (Sandbox Code Playgroud)

ala*_*ing 6

NUnit 2.5+支持通用测试夹具,这使得在多个浏览器中进行测试变得非常简单. http://www.nunit.org/index.php?p=testFixture&r=2.5

构建以下内容将创建两个"GoogleTest"NUnit测试,一个用于Firefox,另一个用于IE.

using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;
using System.Threading;

namespace SeleniumTests 
{
    [TestFixture(typeof(FirefoxDriver))]
    [TestFixture(typeof(InternetExplorerDriver))]
    public class TestWithMultipleBrowsers<TWebDriver> where TWebDriver : IWebDriver, new()
    {
        private IWebDriver driver;

        [SetUp]
        public void CreateDriver () {
            this.driver = new TWebDriver();
        }

        [Test]
        public void GoogleTest() {
            driver.Navigate().GoToUrl("http://www.google.com/");
            IWebElement query = driver.FindElement(By.Name("q"));
            query.SendKeys("Bread" + Keys.Enter);

            Thread.Sleep(2000);

            Assert.AreEqual("bread - Google Search", driver.Title);
            driver.Quit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


pne*_*ook 4

这个问题问得好,很多人都遇到过这个问题。我喜欢使用 IoC 容器将浏览器注入到我的测试用例中。这让我可以将所有浏览器配置放入注入“模块”中

我使用 Java 绑定和 Guice 作为我的 IoC 容器,但 .Net 中的原理是相同的。您希望在您的类中注入一个 DefaultSelnium 字段。然后,您的测试将使用该对象并在完成后将其处置。您可能会发现可以立即注入它,或者您可能需要在设置方法中创建对象。根据您的单元测试框架,您应该注意一些事项:

  • 您的测试类是否为每个测试创建了新的?JUnit 为每个要运行的测试创建一个新的测试类实例。TestNG 著名地废除了这一点,为每个包含的测试重用测试类对象。重用的问题是您注入的 DefaultSelenium 实例会一直运行,如果您的测试并行运行或更改浏览器状态,这可能会导致问题。
  • 延迟加载浏览器对象如果您的单元测试工具立即加载所有测试类,它将尝试预先创建浏览器对象,这是相当资源密集型的。

我确信您可以比我更好地自行 Google,但这些是我认为看起来很有前途的一些 DI 和 NUnit 链接。

NUnit 集成测试和依赖注入

http://buildstarted.com/2010/08/24/dependency-injection-with-ninject-moq-and-unit-testing/

如果您不喜欢 DI,我听说有人使用工厂方法根据某些外部设置生成浏览器。