我在使用TestNG注释时遇到了一些问题,而且我还没有在stackoverflow或testng文档中找到一个好的答案。我要做的是将testng侦听器以及testng.xml文件中的参数添加到“test base”超类中。所有testng测试都将继承超类。这将减轻testng测试类文件中的大量代码冗余。但是当我在超类中使用@Listeners和@Parameters注释,而不是包含@Test方法的类时,注释不起作用。换句话说,监听器似乎没有“看到”测试,并且testng.xml中的参数在运行时没有被引入超类。
我的“测试基础”(超类)有一个来自Sauce Labs api的testng监听器,它将监听测试并在远程执行期间将测试的成功/失败更新到Sauce Labs。它还使用@Parameters注释从当前测试运行的testng.xml中提取参数。
TestBase超类:
@Listeners(SauceOnDemandTestListener.class)
public class TestBase implements SauceOnDemandSessionIdProvider, SauceOnDemandAuthenticationProvider {
private SauceOnDemandAuthentication authentication;
private DesiredCapabilities capabilities;
protected ParallelWebDriver parallelWebDriver;
@Parameters({"sauce_username", "sauce_accesskey", "platform", "browser", "version"})
@BeforeClass(alwaysRun = true)
public void setUp(String userName, String accessKey, String platform, String browser, String version) {
// Set up Sauce Auth
if (userName != null && accessKey != null) {
this.authentication = new SauceOnDemandAuthentication(userName, accessKey);
} else {
this.authentication = new SauceOnDemandAuthentication();
}
// Set up the DesiredCapabilities
if (platform != null) {
this.capabilities.setCapability("platform", platform);
} else {
throw new NullArgumentException("[Parameter] platform does not exist or is not a valid value in testng.xml:");
}
if (browser != null) {
this.capabilities.setCapability("browser", browser);
} else {
throw new NullArgumentException("[Parameter] browser does not exist or is not a valid value in testng.xml:");
}
if (version != null) {
this.capabilities.setCapability("version", version);
} else {
throw new NullArgumentException("[Parameter] version does not exist or is not a valid value in testng.xml:");
}
// Set up the ParallelWebDriver for the test run
parallelWebDriver = new ParallelWebDriver(new RemoteParallelDriver(), this.testingPlatform, capabilities);
parallelWebDriver.setUserName(userName);
parallelWebDriver.setAccessKey(accessKey);
}
@Override
public String getSessionId() {
SessionId sessionId = ((RemoteWebDriver)((WebDriver)parallelWebDriver.getDriver())).getSessionId();
return (sessionId == null) ? null : sessionId.toString();
}
@Override
public SauceOnDemandAuthentication getAuthentication() {
return authentication;
}
}
这是一个继承TestBase的示例测试类。
public class SauceLabsRemote_Test extends TestBase {
@BeforeTest
public void testSetUp() throws MalformedURLException {
parallelWebDriver.openBrowser();
}
public void searchGoogle(String searchText) throws InterruptedException {
parallelWebDriver.getDriver().get("https://google.com");
WebElement searchBox = parallelWebDriver.getDriver().findElement(By.id("gbqfq"));
searchBox.sendKeys(searchText);
WebElement searchButton = parallelWebDriver.getDriver().findElement(By.id("gbqfb"));
searchButton.click();
Assert.assertEquals(searchBox.getText(), "banjo");
}
@Test
public void searchGoogle_Test1() throws InterruptedException {
searchGoogle("banjo");
}
@Test
public void searchGoogle_Test2() throws InterruptedException {
searchGoogle("guitar");
}
@AfterTest
public void testTearDown() {
parallelWebDriver.closeBrowser();
}
}
这是我的testng.xml的模型。
<suite name="Base Framework Unit Test Suite" verbose="1" >
<!-- Parameters required for Sauce Labs run -->
<parameter name="sauce_username" value="testuser" />
<parameter name="sauce_accesskey" value="acc3-55k3y-t3st-t3st-t3st" />
<test name="Sauce Labs Remote Execution Test" >
<parameter name="platform" value="OS X 10.6" />
<parameter name="browser" value="firefox" />
<parameter name="version" value="26" />
<classes>
<class name="unittest.SauceLabsRemote_Test" />
</classes>
</test>
</suite>
那么,有没有办法让TestNG的@Listeners和@Parameters处理不包含@Test的超类?提前致谢!抱歉任何糟糕的编码习惯;所有这些代码都是在动态模拟的。
答案 0 :(得分:0)
超类中的@Listeners和@Parameters注释将在子类中继承。我测试过这个并验证它有效。因此,就像我的代码示例一样,我的TestBase父类中使用的@Listeners注释侦听了继承TestBase的子类的任何@Test注释。
我遇到的问题与Sauce Labs测试执行与Selenium Grid测试执行与本地测试执行有关。我不得不在Sauce Lab的SauceOnDemandTestListener类中添加逻辑,以确定测试执行是否确实路由到Sauce Labs VM浏览器作业。这个逻辑超出了我原来问题的范围,所以我不会在这里发布。