【问题标题】:How do I call a method just after each test has been constructed? C#, NUnit [closed]如何在构建每个测试后调用方法? C#,NUnit [关闭]
【发布时间】:2019-12-11 16:52:13
【问题描述】:

我正在使用 NUnit + Selenium 编写 Web UI 测试。我正在使用 ValueSource 将浏览器列表传递给测试方法,这将为测试运行器中的每个浏览器创建该测试的副本。在测试方法内部,我调用了另一个方法,将浏览器传递给它,以便调用相关的浏览器驱动程序并进行测试。

我遇到的问题是我需要在每个测试用例中调用 InvokeDriver(browser) 方法,这会重复代码。所有的测试都需要调用这个方法,从 ValueSource 列表中通过浏览器。所以我需要一种方法来调用这个方法就在测试被构造但是没有这个代码重复。我无法调用 [SetUp] 中的方法,因为它会在测试之前运行(此时没有可传递给 InvokeDriver 的 ValueSource 值)。

namespace CoreSeleniumFramework.Tests
{
    public class HomePageTests : TestBase
    {
        [Test]
        public void Test1([ValueSource("BrowserList")] Browsers browser)
        {
            InvokeDriver(browser);
            // Do testing here
        }
    }
}

测试基地...

namespace CoreSeleniumFramework.Base
{
    public enum TestCategories
    {
        Acceptance, Regression, Sanity
    }

    public enum Browsers
    {
        Chrome, Firefox, Edge
    }

    [TestFixture]
    public class TestBase
    {
        public static TestCategories categoryToTest = TestCategories.Acceptance;

        public static List<Browsers> acceptanceBrowsers = new List<Browsers>() {
            Browsers.Chrome
        };
        public static List<Browsers> regressionBrowsers = new List<Browsers>() {
            Browsers.Firefox
        };
        public static List<Browsers> sanityBrowsers = new List<Browsers>() {
            Browsers.Edge
        };

        public IWebDriver driver;

        public void InvokeDriver(Browsers browser)
        {
            switch (browser)
            {
                case Browsers.Chrome:
                    driver = new ChromeDriver();
                    break;
                case Browsers.Firefox:
                    driver = new FirefoxDriver();
                    break;
                case Browsers.Edge:
                    driver = new EdgeDriver();
                    break;
                default:
                    throw new Exception("InitialiseDriver(): chosen browser not recognised.");
            }
        }

        public static List<Browsers> BrowserList()
        {
            List<Browsers> browserList;

            switch (categoryToTest)
            {
                case TestCategories.Acceptance:
                    browserList = acceptanceBrowsers;
                    break;
                case TestCategories.Regression:
                    browserList = regressionBrowsers;
                    break;
                case TestCategories.Sanity:
                    browserList = sanityBrowsers;
                    break;
                default:
                    throw new Exception("BrowserList(): no browser list available.");
            }

            return browserList;
        }
    }
}

【问题讨论】:

    标签: c# selenium unit-testing selenium-webdriver nunit


    【解决方案1】:

    您在测试中的其他任何地方都使用Browsers 吗?还是只需要实例化WebDriver?

    您可以创建另一种方法或更改当前方法以在检索 browserList 后调用驱动程序并将其提供给测试用例,即:

       public static IEnumerable<IWebDriver> BrowserListInitialized()
        {
            return BrowserList().Select(browser => InvokeDriver(browser));            
        }
    

    将InvokeDriver 更改为静态并返回已初始化的驱动程序:

        public static IWebDriver InvokeDriver(Browsers browser)
        {
            switch (browser)
            {
                case Browsers.Chrome:
                    return new ChromeDriver();
                    break;
                case Browsers.Firefox:
                    return new FirefoxDriver();
                    break;
                case Browsers.Edge:
                    return new EdgeDriver();
                    break;
                default:
                    throw new Exception("InitialiseDriver(): chosen browser not recognised.");
            }
        }
    

    并使用它:

        [Test]
        public void Test1([ValueSource("BrowserListInitialized")] IWebDriver driver)
        {
            //driver already initialized and passed as an argument
            driver.DoStuff();
        }
    

    【讨论】:

    • 真正的冠军,谢谢 :) 有一个副作用 - 在 Visual Studio 中,当您更改代码或添加测试(可能两者)然后构建时,会为每个测试加载一个浏览器实例该测试列表中的每个浏览器。如果通过 NUnit Console Runner 之类的控制台运行,则不会出现此问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多