如何在构建每个测试后立即调用方法? C#, 单元
How do I call a method just after each test has been constructed? C#, NUnit
我正在使用 NUnit + Selenium 编写 Web UI 测试。我正在使用 ValueSource 将浏览器列表传递到测试方法中,这会为测试 运行ner 中的每个浏览器创建该测试的副本。在测试方法中,我调用了另一个方法,将浏览器传递给它,以便调用相关的浏览器驱动程序并进行测试。
我遇到的问题是我需要在每个测试用例中调用 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;
}
}
}
你在测试的其他地方使用了Browsers
吗?或者只是实例化 WebDriver
?
您可以创建另一种方法或更改当前方法以在检索 browserList
后调用驱动程序并将其提供给测试用例,即:
public static IEnumerable<IWebDriver> BrowserListInitialized()
{
return BrowserList().Select(browser => InvokeDriver(browser));
}
将 InvokeDriver
更改为静态和 return 初始化驱动程序:
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();
}
我正在使用 NUnit + Selenium 编写 Web UI 测试。我正在使用 ValueSource 将浏览器列表传递到测试方法中,这会为测试 运行ner 中的每个浏览器创建该测试的副本。在测试方法中,我调用了另一个方法,将浏览器传递给它,以便调用相关的浏览器驱动程序并进行测试。
我遇到的问题是我需要在每个测试用例中调用 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;
}
}
}
你在测试的其他地方使用了Browsers
吗?或者只是实例化 WebDriver
?
您可以创建另一种方法或更改当前方法以在检索 browserList
后调用驱动程序并将其提供给测试用例,即:
public static IEnumerable<IWebDriver> BrowserListInitialized()
{
return BrowserList().Select(browser => InvokeDriver(browser));
}
将 InvokeDriver
更改为静态和 return 初始化驱动程序:
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();
}