2011-12-16 23 views
3

對於我的一個項目,我需要在運行測試之前在JVM級別設置兩個屬性(使用testng,正如主題所述)。下面是我用它來執行這兩個屬性的存在的代碼:Test-NG:將@BeforeClass變成別的東西(@BeforeSuite可能?)

import org.testng.annotations.BeforeClass; 

public class AbstractPamTest 
{ 
    protected String user; 
    protected String passwd; 
    protected String badPasswd; 

    @BeforeClass 
    public void setUp() 
    { 
     user = System.getProperty("test.login"); 
     passwd = System.getProperty("test.passwd"); 
     if (user == null || passwd == null) 
      throw new IllegalStateException("Please define test.login and" 
       + " test.passwd before running tests"); 
     badPasswd = passwd + "x"; 
    } 
} 

此代碼有我所有的測試必須繼承這一類的問題,因此setUp()每次運行。我怎樣才能讓這個方法只運行一次?

+0

這些變量都不是靜態的。這會在測試中引起意外的行爲。事實上,如果您的設置非常簡單,那麼您應該使用@Before來防止一個單元測試干擾另一個單元測試的可能性。 – Dunes 2011-12-16 10:15:21

回答

2

如果所有的測試都擴展了這個類,那麼你可以把它放到一個靜態初始化器中。這隻會被執行一次(當類被加載時)。

public class AbstractPamTest 
{ 
    protected static final String user; 
    protected static final String passwd; 
    protected static final String badPasswd; 

    static 
    { 
     user = System.getProperty("test.login"); 
     passwd = System.getProperty("test.passwd"); 
     if (user == null || passwd == null) 
      throw new IllegalStateException("Please define test.login and" 
       + " test.passwd before running tests"); 
     badPasswd = passwd + "x"; 
    } 
} 

或者把它放在一個完全不同的類中,它被需要密碼/用戶的類使用/調用。那麼您將不需要繼續擴展AbstractPamTest。此外,您應該在那裏提供getter/setter,以便您可以在運行時更改用戶/密碼,如果一個測試用例需要不同的值。

private static String user; 
    private static String passwd; 
    private static String badPasswd; 

    static 
    { 
     user = System.getProperty("test.login"); 
     passwd = System.getProperty("test.passwd"); 
     if (user == null || passwd == null) 
      throw new IllegalStateException("Please define test.login and" 
       + " test.passwd before running tests"); 
     badPasswd = passwd + "x"; 
    } 

    public static String getUser() 
    { 
    return user; 
    } 

    public static void setUser(String pUser) 
    { 
    user = pUser; 
    } 

    public static String getPasswd() 
    { 
    return passwd; 
    } 

    public static void setPasswd(String pPasswd) 
    { 
    passwd = pPasswd; 
    } 
+0

好點...我會那樣做的。但是,如果可能的話,我想最終擺脫繼承。 – fge 2011-12-16 10:11:41

+0

@fge看到答案的第二部分,我會建議做一個獨立的類來保存/處理/設置這些值。 – oers 2011-12-16 10:16:41

1

爲什麼不使用@BeforeSuite

相關問題