Test-NG:将@BeforeClass变成其他东西(@BeforeSuite可能?)

时间:2011-12-16 09:10:08

标签: java unit-testing testng

对于我的项目,我需要在运行测试之前在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()。如何让这个方法只运行一次?

2 个答案:

答案 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