使用testng进行多线程单元测试

时间:2016-12-05 11:44:18

标签: java junit testng

我正在学习使用TestNg进行单元测试。我想传递变量" val"的唯一值。从线程池中的每个线程,但它没有拿起它。

这里是testng类:

public class NewTest {

    int val = 0;

  /*@Test(dataProvider = "dp")
  public void f(Integer n, String s) {
  }*/
  @BeforeMethod
  public void beforeMethod() {
      long id = Thread.currentThread().getId();
      System.out.println("beforeMethod. Thread id is: " + id);



  }

  @AfterMethod
  public void afterMethod() {/*
      long id = Thread.currentThread().getId();
      System.out.println("After test-method. Thread id is: " + id);*/
  }


  @DataProvider
  public Object[][] dp() {
    return new Object[][] {
      new Object[] { 1, "a" },
      new Object[] { 2, "b" },
    };
  }
  @BeforeClass
  public void beforeClass() {

  }

  @AfterClass
  public void afterClass() {
  }

  @BeforeTest
  public void beforeTest() {
      val++;
  }

  @AfterTest
  public void afterTest() {
  }

  @BeforeSuite
  public void beforeSuite() {
  }

  @AfterSuite
  public void afterSuite() {
  }

  @Test(threadPoolSize = 5, invocationCount = 5, timeOut = 1000)
  public void methodOne(){
      System.out.println("Value of val from MethodOne::"+val);
  }
}

并输出:

  

[ThreadUtil]启动执行程序timeOut:1000ms worker:5   threadPoolSize:5 beforeMethod。线程ID是:15 beforeMethod。线   id是:12之前的方法。线程ID是:14 beforeMethod。线程ID是:   13之前的方法。线程id为:16 MethodOne :: 1 Value的val值   来自MethodOne的val :: 1来自MethodOne的val的值:: 1 val的值   来自MethodOne :: 1 MethodOne的值的值:1 PASSED:methodOne   通过:methodOne PASSED:methodOne PASSED:methodOne PASSED:   methodOne

     

===============================================       默认测试

     

测试运行:5,失败:0,跳过:0

     

===============================================默认套件总测试运行:5,失败:0,跳过:0

     

[TestNG] [FailedReporter传递= 0失败= 0跳过= 0]所花费的时间:1   ms [TestNG]时间   org.testng.reporters.SuiteHTMLReporter@3159c4b8:50 ms [TestNG]时间   由org.testng.reporters.JUnitReportReporter@6adede5拍摄:7毫秒   [TestNG] org.testng.reporters.XMLReporter@64bf3bbf所花费的时间:9毫秒   [TestNG] org.testng.reporters.jq.Main@1d16f93d所花费的时间:40毫秒   [TestNG]所用的时间   org.testng.reporters.EmailableReporter2@5bc79255:4 ms

2 个答案:

答案 0 :(得分:0)

注意:@BeforeTest不是@BeforeMethod@BeforeSuite - > @BeforeTest - > @BeforeClass - > @BeforeMethod@BeforeGroup具体的一个)。

然后,@BeforeTest只能通过<test>调用一次:在您的示例中,只有一次val始终为1。

答案 1 :(得分:0)

您可以使用ThreadLocal,如下所示:(但请记住,TestNG保证只有@BeforeMethod&gt; @Test&gt; @AfterMethod带注释的方法才能运行线程。

public class NewTest {
    private static ThreadLocal<Long> val = new ThreadLocal<>();

    @BeforeMethod
    public void beforeMethod() {
        long id = Thread.currentThread().getId();
        val.set(id);
        printer("beforeMethod");
    }

    @AfterMethod
    public void afterMethod() {
        printer("afterMethod");
        //usage of thread locale done. Lets reset it.
        val.set(null);
    }

    @Test (threadPoolSize = 5, invocationCount = 5, timeOut = 1000)
    public void methodOne() {
        printer("methodOne");
    }

    private static void printer(String prefix) {
        System.err.println("Thread ID in the method " + prefix + "() is " + val.get());
    }
}