我正在学习使用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
答案 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());
}
}