对于我的项目,我需要在运行测试之前在JVM级别设置两个属性(使用testng,如主题所述)。以下是我用来强制执行这两个属性的代码:
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 :(得分: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;
}
答案 1 :(得分:1)
为什么不使用@BeforeSuite
?