覆盖TestNG中的@BeforeMethod

时间:2014-03-04 10:33:43

标签: java testing testng

我的定义@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方法?

2 个答案:

答案 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) {
}

}