如何从 TestNG 测试和 Selenium 的接口调用默认方法?
How to call default method from interface with TestNG tests and Selenium?
我想知道是否可以使用带有 TestNG @BeforeMethod
注释的接口的默认方法?
这是我试过的示例:
@Listeners(TestListener.class)
public interface ITestBase {
String baseUrl = Config.getProperty(Config.TEST_HOST);
String driverName = Config.getProperty(Config.BROWSER);
DriversEnum driverInstance = DriversEnum.valueOf(driverName.toUpperCase());
@BeforeMethod(alwaysRun = true)
default public void start() {
try {
driver.init();
DriverUnit.preconfigureDriver(Driver.driver.get());
driver.get().manage().deleteAllCookies();
driver.get().get(baseUrl);
} catch (TimeoutException e) {
Logger.logEnvironment("QT application is not available");
}
}
@AfterMethod(alwaysRun = true)
default public void end() {
if (driver.get() != null) {
try {
driver.get().quit();
} catch (UnreachableBrowserException e) {
Logger.logDebug("UnreachableBrowser on close");
} finally {
driver.remove();
}
}
}
当我运行典型的TestNG测试方法,如:
public class AppUiDemo implements ITestBase {
@Test(enabled = true)
public void checkWebDriverCreation() {
...
}
start()
和 end()
方法未被调用。没有为测试执行创建驱动程序实例。
是否可以使用 default
方法和 TestNG 方法制作类似的东西?
如果我将接口更改为常规 class,调用方法前后(驱动程序实例创建良好):
public class TestBase {
protected final String baseUrl = Config.getProperty(Config.TEST_HOST);
protected final String driverName = Config.getProperty(Config.BROWSER);
protected final DriversEnum driverInstance = DriversEnum.valueOf(driverName.toUpperCase());
@BeforeMethod(alwaysRun = true)
public void start() {
....
问题是我的测试 class 已经在扩展另一个 class:
public class MainTest extends ExecutionContext
因此我无法扩展 TestBase
。
是否可以在测试方法之前和之后使用任何实现的接口来执行代码?
是的,这是可能的,但允许在测试中使用接口方法的 TestNG 版本尚未发布。您需要从 this 存储库下载它。
如果您使用 Maven,您可以在 pom.xml
:
中指定额外的存储库
<repository>
<id>testng</id>
<name>testng</name>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
然后添加TestNG依赖:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.11.1-SNAPSHOT</version>
</dependency>
示例:
package test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class DummyTest implements ITest {
@BeforeMethod
public void beforeTest() {
System.out.println("before from class");
}
@Test
public void test1() {
System.out.println("I am test1");
}
}
和ITest接口
package test;
import org.testng.annotations.BeforeMethod;
public interface ITest {
@BeforeMethod
default void beforeDefaultInterface() {
System.out.println("before from default interface method");
}
@BeforeMethod
static void beforeStaticInterface() {
System.out.println("before from static interface method");
}
}
上面测试的输出将是:
before from default interface method
before from static interface method
before from class
I am test1
TestNg 版本“6.14.2”是可能的
替代存储库,不再需要。
其他版本我没试过。
我想知道是否可以使用带有 TestNG @BeforeMethod
注释的接口的默认方法?
这是我试过的示例:
@Listeners(TestListener.class)
public interface ITestBase {
String baseUrl = Config.getProperty(Config.TEST_HOST);
String driverName = Config.getProperty(Config.BROWSER);
DriversEnum driverInstance = DriversEnum.valueOf(driverName.toUpperCase());
@BeforeMethod(alwaysRun = true)
default public void start() {
try {
driver.init();
DriverUnit.preconfigureDriver(Driver.driver.get());
driver.get().manage().deleteAllCookies();
driver.get().get(baseUrl);
} catch (TimeoutException e) {
Logger.logEnvironment("QT application is not available");
}
}
@AfterMethod(alwaysRun = true)
default public void end() {
if (driver.get() != null) {
try {
driver.get().quit();
} catch (UnreachableBrowserException e) {
Logger.logDebug("UnreachableBrowser on close");
} finally {
driver.remove();
}
}
}
当我运行典型的TestNG测试方法,如:
public class AppUiDemo implements ITestBase {
@Test(enabled = true)
public void checkWebDriverCreation() {
...
}
start()
和 end()
方法未被调用。没有为测试执行创建驱动程序实例。
是否可以使用 default
方法和 TestNG 方法制作类似的东西?
如果我将接口更改为常规 class,调用方法前后(驱动程序实例创建良好):
public class TestBase {
protected final String baseUrl = Config.getProperty(Config.TEST_HOST);
protected final String driverName = Config.getProperty(Config.BROWSER);
protected final DriversEnum driverInstance = DriversEnum.valueOf(driverName.toUpperCase());
@BeforeMethod(alwaysRun = true)
public void start() {
....
问题是我的测试 class 已经在扩展另一个 class:
public class MainTest extends ExecutionContext
因此我无法扩展 TestBase
。
是否可以在测试方法之前和之后使用任何实现的接口来执行代码?
是的,这是可能的,但允许在测试中使用接口方法的 TestNG 版本尚未发布。您需要从 this 存储库下载它。
如果您使用 Maven,您可以在 pom.xml
:
<repository>
<id>testng</id>
<name>testng</name>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
然后添加TestNG依赖:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.11.1-SNAPSHOT</version>
</dependency>
示例:
package test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class DummyTest implements ITest {
@BeforeMethod
public void beforeTest() {
System.out.println("before from class");
}
@Test
public void test1() {
System.out.println("I am test1");
}
}
和ITest接口
package test;
import org.testng.annotations.BeforeMethod;
public interface ITest {
@BeforeMethod
default void beforeDefaultInterface() {
System.out.println("before from default interface method");
}
@BeforeMethod
static void beforeStaticInterface() {
System.out.println("before from static interface method");
}
}
上面测试的输出将是:
before from default interface method before from static interface method before from class I am test1
TestNg 版本“6.14.2”是可能的
替代存储库,不再需要。
其他版本我没试过。