繁体   English   中英

如何使用 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 但请注意,如果您有更多测试,它也会被执行

如果您需要一些更细粒度的执行控制,您可能需要自己从测试中调用该方法

在文档中有更多信息

跟随施工适合我:

    @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++);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM