我的定义@BeforeMethod
的所有测试都有一个基类,适合大多数测试(我正在测试管理员界面,所以我想在测试之前以管理员身份登录并在之后注销) - 但有时候我想要跳过这个方法,或者在扩展我的基类的类中用不同的方法覆盖它。
public class AbstractWebDriverTest {
@BeforeMethod
public void preparePage() {
driver.get("somePage");
signInAsAdmin();
}
}
public class TestConfigWithOtherUser extends AbstractWebDriverTest {
//now I want to skip before method and sign as a different user instead
@Test
public void someTestWithDifferentUser() { }
}
所以我想我可以通过某种方式使用组来解决这个问题,但有没有办法如何覆盖init方法?
答案 0 :(得分:1)
我会按照您在问题中提到的或按例外情况对测试进行分组。如果只有少数情况是例外,那么在这种情况下你的测试必须预期,你从管理员开始。我在Java Pseudocode中的想法:
@Test
public void someTestWithDifferentUser() {
logout();
logInAsDifferentUser();
doSomeStuff();
}
我的另一个想法是介绍User
类,它看起来像这样:
public class User{
private String username;
private String password;
public User(String username, String password){
this.username = username;
this.password = password;
}
public String getUsername(){
return username;
}
public String getPassword(){
return password;
}
}
然后,在您的测试中,您将拥有一个全局变量:
public static final User DEFAULT_USER = new User("admin","AdminSecretPassword");
你的测试看起来像这样:
@Test
public void doAdminStuff(){
loginAsUser(DEFAULT_USER);
doAdminStuff;
}
@Test
public void doUserStuff(){
loginAsUser(new User("testytester","testytest"));
doUserStuff();
}
@BeforeMethod
将完全避免登录。
答案 1 :(得分:1)
您可以使用Listeners界面覆盖默认行为。请参阅与您有相似要求的this帖子。
public class SkipLoginMethodListener implements IInvokedMethodListener {
private static final String SKIP_GROUP = "loginMethod";
@Override
public void beforeInvocation(IInvokedMethod invokedMethod, ITestResult testResult) {
ITestNGMethod method = invokedMethod.getTestMethod();
if (method.isAfterMethodConfiguration() || method.isBeforeMethodConfiguration()) {
for (String group : method.getGroups()) {
if (group.equals(SKIP_GROUP)) {
System.out.println("skipped " + method.getMethodName());
throw new SkipException("Configuration of the method " + method.getMethodName() + " skipped");
}
}
}
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
}
}