使用C#和Selenium进行Nunit参数化

时间:2017-06-19 12:46:17

标签: c# .net visual-studio selenium nunit

在Visual Studio中与C#和Selenium一起使用时,我正在寻找一些帮助来理解NUnit。

我已经构建了一套测试,其中很多测试通过自学和YouTube视频拼凑而成。

该项目过去只需要针对多个浏览器中的单个站点进行一系列回归测试。

我已经实现了这一点,并对结果非常满意。

我现在要做的是进一步扩展这个

我一直在测试的产品是一个针对不同客户的网站,其中99%的内容是相同的。

我不想仅仅在visual studio中创建多个项目/解决方案,而是想做一些更有活力的事情来覆盖不同皮肤的回归。

我想做的是参数化测试用例/浏览器/网址组合,例如

  • TestCase1 /铬/站点1
  • TestCase1 /铬/站点2
  • TestCase1 / EDGE /站点1
  • TestCase1 / Edge / Site2等。

我已经能够让Visual Studio Test Explorer识别参数,但由于某种原因,它似乎产生了意想不到的结果,例如。

  • TestCase1 / Site1
  • testcase1 /铬
  • TestCase1 /站点2
  • TestCase1 / EDGE /等

我见过论坛,他们通过使用NUnit参数讨论做类似于我在这里讨论的事情,但是却无法产生预期的结果。

我认为这只是添加另一个NUnit婴儿车并像以前一样传递它的情况。这是我正在使用的代码的slimmed down版本:

namespace AutomationStuffs.SmokeTests
{
    [TestFixture]
    public class LoginTests : TestBase
    {
        [Test]
        [TestCaseSource(typeof(TestBase), "BrowserToRunWith")]
        public void FirstTimeLogin(String BrowserName, String Url)
        {
            //Browser Driver Setup For test
            Setup(BrowserName);

            //...DO SOME TESTING THINGS
        }
    }
}

namespace AutomationStuffs.Utilities
{
    public class TestBase
    {
        public static IWebDriver driver;

        public void Setup(String BrowserName)
        {
            Driver.Intialize(BrowserName);
            //... DO SOME SETUP STUFF
            LoginPage.GoTo();
            //..I DO SOME LOGIN SETUP HERE
        }


        public static IEnumerable<String> BrowserToRunWith()
        {
            String[] browsers = BrowsersList.theBrowserList.Split(',');
            foreach (String b in browsers)
            {
                yield return b;
            }
        }
    }
}


namespace AutomationStuffs.Pages
{
    public class LoginPage
    {
        public static void GoTo()
        {
            Driver.Instance.Navigate().GoToUrl(Driver.baseURL);
        }
    }
}


namespace AutomationStuffs.Selenium
{
    public class Driver
    {
        public static IWebDriver Instance { get; set; }
        public static string baseURL
        {
            get
            {
                string url = System.Configuration.ConfigurationManager.AppSettings["BaseUrl"];
                return url;
            }
        }

        public static string chromeDriver
        {
            get
            {
                string driver = System.Configuration.ConfigurationManager.AppSettings["ChromeDriver"];
                driver = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, driver);
                return driver;
            }
        }

        public static string ieDriver
        {
            get
            {
                string driver = System.Configuration.ConfigurationManager.AppSettings["IEDriver"];
                driver = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, driver);
                return driver;
            }
        }


        public static string edgeDriver
        {
            get
            {
                string driver = System.Configuration.ConfigurationManager.AppSettings["EdgeDriver"];
                driver = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, driver);
                return driver;
            }
        }

        public static void Intialize(String BrowserName)
        {
            String DRIVER_PATH = chromeDriver;
            String DRIVER_PATH_IEFF = ieDriver;
            String DRIVER_PATH_EDGE = edgeDriver;

            var optionsChrome = new ChromeOptions();
            optionsChrome.AddArgument("start-maximized");
            optionsChrome.AddArgument("no-sandbox");

            var optionsIe = new InternetExplorerOptions();

            if (BrowserName.Equals("ie"))
            {
                Instance = new InternetExplorerDriver(DRIVER_PATH_IEFF);
                Instance.Manage().Window.Maximize();
            }
            else if (BrowserName.Equals("firefox"))
            {
                Instance = new FirefoxDriver();
                Instance.Manage().Window.Maximize();
            }
            else if (BrowserName.Equals("edge"))
            {
                Instance = new EdgeDriver(DRIVER_PATH_EDGE);
                Instance.Manage().Window.Maximize();
            }
            else
            {
                Instance = new ChromeDriver(DRIVER_PATH, optionsChrome);
            }
        }
    }
}

以下是我认为我必须做的事情(显然只是在适当的地方复制并调整基础方法):

namespace AutomationStuffs.SmokeTests
{
    [TestFixture]
    //[Parallelizable]
    public class LoginTests : TestBase
    {
        [Test]
        [TestCaseSource(typeof(TestBase), "BrowserToRunWith")]
        [TestCaseSource(typeof(TestBase), "URLToRunWith")]
        public void FirstTimeLogin(String BrowserName, String Url)
        {
            //Browser Driver Setup For test
            Setup(BrowserName);

            Assert.IsTrue(FiveComponentsAndDocStorePage.AssertOnThePage());
        }
    }
}

2 个答案:

答案 0 :(得分:2)

NUnit会分别处理每个TestCaseSource,它会为BrowserToRunWith创建测试用例,然后才会为URLToRunWith执行此操作。{1}}如果您尝试运行它,您将获得

  

结果消息:提供的参数数量错误

要为这两个参数创建测试用例,您需要将它们一起发送到TestCaseSource。你可以做点什么

public static IEnumerable TestData
{
    get
    {
        string[] browsers = BrowsersList.theBrowserList.Split(',')
        string[] urls = UrlsList.theUrlList.Split(',')

        foreach (string browser in browsers)
        {
            foreach (string url in urls)
            {
                yield return new TestCaseData(browser, url);
            }
        }
    }
}

或者使用linq

public static IEnumerable TestData
{
    get
    {
        string[] browsers = BrowsersList.theBrowserList.Split(',')
        string[] urls = UrlsList.theUrlList.Split(',')

        return from browser in browsers
               from url in urls
               select new TestCaseData(browser, url);
    }
}

TestCaseSource看起来像

[TestCaseSource(typeof(AAA), "TestData")]

答案 1 :(得分:1)

@Guy的答案是完全正确的 - 我投了票。

为了完整起见,这是另一种编写测试的方法,当您认为NUnit会做出一些魔术时,这可能是您的想法。&#34;

    [Test]
    public void FirstTimeLogin(
        [ValueSource("BrowserToRunWith")] String BrowserName, 
        [ValueSource("UrlToRunWith")] String Url)
    {
        //Browser Driver Setup For test
        Setup(BrowserName);

        Assert.IsTrue(FiveComponentsAndDocStorePage.AssertOnThePage());
    }

ValueSource成员与您现有的成员类似,但每个成员都会返回string而不是TestCaseData个实例。

请注意,在这种情况下需要[Test]属性。在原始示例中,它是可选的(并且丑陋,IMO!)。 : - )