如何使用 BeforeTest 执行 运行 TestNG 多次测试?
How to run TestNG test several times with BeforeTest execution?
我尝试使用 DataProvider 多次执行测试。
一切正常,但 @BeforeTest
和 @AfterTest
只执行一次,但每次迭代我都需要执行此操作。:
public class TestClass{
@BeforeTest
public void before(){
Log.info("BeforeTest");
}
@AfterTest
public void after(){
Log.info("AfterTest");
}
@DataProvider
public Object[][] tenTime(){
return new Object[][]{
{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}
};
}
private static Integer c = 0;
@Test(dataProvider = "tenTime")
public void tenTimesTest(Integer count){
Assert.assertSame(count, c++);
}
}
- 实际结果:
@BeforeTest
和 @AfterTest
执行一次:
[INFO] 19-01-21 11:54:47 main | BeforeTest
[INFO] 19-01-21 11:54:47 main | The tenTimesTest test started
[INFO] 19-01-21 11:54:47 main | tenTimesTest test is starting.
[INFO] 19-01-21 11:54:48 main | The tenTimesTest test succeed
[INFO] 19-01-21 11:54:48 main | tenTimesTest test is passed
[INFO] 19-01-21 11:54:48 main | The tenTimesTest test started
[INFO] 19-01-21 11:54:48 main | tenTimesTest test is starting.
[INFO] 19-01-21 11:54:48 main | The tenTimesTest test succeed
[INFO] 19-01-21 11:54:48 main | tenTimesTest test is passed
..............
[INFO] 19-01-21 11:54:50 main | AfterTest
- 预期结果
@BeforeTest
和 @AfterTest
每次执行 tenTimesTest
:
[INFO] 19-01-21 11:54:47 main | BeforeTest
[INFO] 19-01-21 11:54:47 main | The tenTimesTest test started
[INFO] 19-01-21 11:54:47 main | tenTimesTest test is starting.
[INFO] 19-01-21 11:54:48 main | The tenTimesTest test succeed
[INFO] 19-01-21 11:54:48 main | tenTimesTest test is passed
[INFO] 19-01-21 11:54:50 main | AfterTest
[INFO] 19-01-21 11:54:47 main | BeforeTest
[INFO] 19-01-21 11:54:47 main | The tenTimesTest test started
[INFO] 19-01-21 11:54:47 main | tenTimesTest test is starting.
[INFO] 19-01-21 11:54:48 main | The tenTimesTest test succeed
[INFO] 19-01-21 11:54:48 main | tenTimesTest test is passed
[INFO] 19-01-21 11:54:50 main | AfterTest
使用@BeforeMethod 和@AfterMethod 如下:
public class DemoTest {
private static final Logger log = LoggerFactory.getLogger(DemoTest.class);
@BeforeMethod
public void before() {
log.info("before");
}
@AfterMethod
public void after() {
log.info("after");
}
@Test
public void test1() {
log.info("test1");
}
@Test
public void test2() {
log.info("test2");
}
}
结果:
before
test1
after
before
test2
after
即使您使用的是数据提供程序,您的 tenTimesTest
也被视为单个测试,因此 @BeforeTest
只会执行一次。如果您需要在每次调用之前执行它,您可以尝试 @BeforeMethod
。但是请注意,如果您有更多测试,它也会被执行
如果您需要更细粒度的执行控制,您可能需要自己从测试中调用该方法
您有更多信息in the docs
以下构造适合我:
@BeforeTest
public void before(){
isBeforeTestExecutedFlag = true;
method();
}
private void method(){
Log.info("BeforeTest");
}
bool isBeforeTestExecutedFlag = false;
@BeforeMethod
public void beforeMethod(){
if(isBeforeTestExecutedFlag){
isBeforeTestExecutedFlag = false;
return;
}
method();
}
@AfterTest
public void after(){
Log.info("AfterTest");
}
@DataProvider
public Object[][] tenTime(){
return new Object[][]{
{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}
};
}
private static Integer c = 0;
@Test(dataProvider = "tenTime")
public void tenTimesTest(Integer count){
Assert.assertSame(count, c++);
}
}
我尝试使用 DataProvider 多次执行测试。
一切正常,但 @BeforeTest
和 @AfterTest
只执行一次,但每次迭代我都需要执行此操作。:
public class TestClass{
@BeforeTest
public void before(){
Log.info("BeforeTest");
}
@AfterTest
public void after(){
Log.info("AfterTest");
}
@DataProvider
public Object[][] tenTime(){
return new Object[][]{
{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}
};
}
private static Integer c = 0;
@Test(dataProvider = "tenTime")
public void tenTimesTest(Integer count){
Assert.assertSame(count, c++);
}
}
- 实际结果:
@BeforeTest
和@AfterTest
执行一次:
[INFO] 19-01-21 11:54:47 main | BeforeTest
[INFO] 19-01-21 11:54:47 main | The tenTimesTest test started
[INFO] 19-01-21 11:54:47 main | tenTimesTest test is starting.
[INFO] 19-01-21 11:54:48 main | The tenTimesTest test succeed
[INFO] 19-01-21 11:54:48 main | tenTimesTest test is passed
[INFO] 19-01-21 11:54:48 main | The tenTimesTest test started
[INFO] 19-01-21 11:54:48 main | tenTimesTest test is starting.
[INFO] 19-01-21 11:54:48 main | The tenTimesTest test succeed
[INFO] 19-01-21 11:54:48 main | tenTimesTest test is passed
..............
[INFO] 19-01-21 11:54:50 main | AfterTest
- 预期结果
@BeforeTest
和@AfterTest
每次执行tenTimesTest
:
[INFO] 19-01-21 11:54:47 main | BeforeTest
[INFO] 19-01-21 11:54:47 main | The tenTimesTest test started
[INFO] 19-01-21 11:54:47 main | tenTimesTest test is starting.
[INFO] 19-01-21 11:54:48 main | The tenTimesTest test succeed
[INFO] 19-01-21 11:54:48 main | tenTimesTest test is passed
[INFO] 19-01-21 11:54:50 main | AfterTest
[INFO] 19-01-21 11:54:47 main | BeforeTest
[INFO] 19-01-21 11:54:47 main | The tenTimesTest test started
[INFO] 19-01-21 11:54:47 main | tenTimesTest test is starting.
[INFO] 19-01-21 11:54:48 main | The tenTimesTest test succeed
[INFO] 19-01-21 11:54:48 main | tenTimesTest test is passed
[INFO] 19-01-21 11:54:50 main | AfterTest
使用@BeforeMethod 和@AfterMethod 如下:
public class DemoTest {
private static final Logger log = LoggerFactory.getLogger(DemoTest.class);
@BeforeMethod
public void before() {
log.info("before");
}
@AfterMethod
public void after() {
log.info("after");
}
@Test
public void test1() {
log.info("test1");
}
@Test
public void test2() {
log.info("test2");
}
}
结果:
before
test1
after
before
test2
after
即使您使用的是数据提供程序,您的 tenTimesTest
也被视为单个测试,因此 @BeforeTest
只会执行一次。如果您需要在每次调用之前执行它,您可以尝试 @BeforeMethod
。但是请注意,如果您有更多测试,它也会被执行
如果您需要更细粒度的执行控制,您可能需要自己从测试中调用该方法
您有更多信息in the docs
以下构造适合我:
@BeforeTest
public void before(){
isBeforeTestExecutedFlag = true;
method();
}
private void method(){
Log.info("BeforeTest");
}
bool isBeforeTestExecutedFlag = false;
@BeforeMethod
public void beforeMethod(){
if(isBeforeTestExecutedFlag){
isBeforeTestExecutedFlag = false;
return;
}
method();
}
@AfterTest
public void after(){
Log.info("AfterTest");
}
@DataProvider
public Object[][] tenTime(){
return new Object[][]{
{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}
};
}
private static Integer c = 0;
@Test(dataProvider = "tenTime")
public void tenTimesTest(Integer count){
Assert.assertSame(count, c++);
}
}