2014-03-04 39 views
1

我有一個適用於大多數測試的定義爲@BeforeMethod的所有測試的基類(我正在測試管理用戶界面,所以我希望通常以管理員身份登錄,然後在測試之前以管理員身份登錄) - 但有時我想跳過這個方法,或者在擴展我的基類的類中使用不同的方法來覆蓋它。覆蓋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方法?

回答

1

我會去分組測試,如你在你的問題或異常說明。如果只有少數情況是例外,那麼在這種情況下,您的測試必須期望,您以管理員身份開始。我在Java的僞代碼的想法:

@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將完全避免登錄。

+0

首先選擇看起來不錯 - 但我想,以避免在每次測試是不同的,這就是爲什麼方法重載將是很好的,因爲你將有一個方法與全班初始設置代碼重複。 –

+0

這實際上取決於你的設置:如果你有100個案例,其中5個是針對不同用戶的,那麼請按照我的例子。如果對於不同的用戶有20個,我會嘗試進行一些測試分組 –

+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) { 
} 

} 
+0

謝謝,聽衆的作品,但我只是不知道如何跳過我想要的方法。我將配置方法放入一個組中,每當將此偵聽器附加到測試類時,我都會跳過這些方法。我試着拋出'SkipException',但是這也會跳過所有的測試。 –

+0

我用我的代碼編輯了你的答案,隨時更新它,謝謝! –