Testng继承处理
在testng进行测试的时候,往往会用到流程测试,在测试流程的时候,会有一些重复的操作可以多个类共用相同的方法,即放在父类中。
1.Before
Before包含@BeforeClass、@BeforeMethod、@BeforeGroups、@BeforeSuite。
在子类中可以调用到父类的@Before方法,包含上面的所有的Before。下面代码示例:
TestngTestng.java
package com.yesterday.time.testng; import org.apache.log4j.Logger; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; public class TestngTestng { Logger logger = Logger.getLogger(TestngTestng.class); @BeforeClass public void testbefore(){ logger.debug("testbfore"); } }
TestngTestng1.java
package com.yesterday.time.testng; import org.testng.annotations.Test; public class TestngTestng1 extends TestngTestng{ @Test public void testb(){ logger.debug("TestngTestng1.testb"); } }
结果为:
[DEBUG] 2016-12-27 13:29:33,718 method:com.yesterday.time.testng.TestngTestng.testbefore(TestngTestng.java:14)testbfore [DEBUG] 2016-12-27 13:29:33,738 method:com.yesterday.time.testng.TestngTestng1.testb(TestngTestng1.java:10)TestngTestng1.testb
2.DataProvider 此方法也可以写在父类中,常用于对同一个对象做流程操作。
package com.yesterday.time.testng; import org.apache.log4j.Logger; import org.testng.annotations.DataProvider; public class TestngTestng { Logger logger = Logger.getLogger(TestngTestng.class); @DataProvider(name = "test1") public Object[][] test1(){ logger.debug("TestngTestng.test1"); return new Object[][]{{5}}; } @DataProvider(name = "testA") public Object[][] testA(){ logger.debug("TestngTestng.testA"); return new Object[][]{{10}}; } } package com.yesterday.time.testng; import org.testng.annotations.Test; public class TestngTestng1 extends TestngTestng{ @Test(dataProvider = "test1") public void test(int id){ logger.debug("TestngTestng1.test"); System.out.println("sfsd"); if(id>5) { System.out.println("GGGGGGGG"); }else{ System.out.println("aaaaaaa"); } } @Test(dataProvider = "test1") public void test2(int id){ logger.debug("TestngTestng1.test2"); System.out.println("sfsd"); if(id>5) { System.out.println("GGGGGGGG"); }else{ System.out.println("aaaaaaa"); } } @Test(dataProvider = "testA") public void test1(int id){ logger.debug("TestngTestng1.test1"); System.out.println("sfsd"); if(id>5) { System.out.println("GGGGGGGG"); }else{ System.out.println("aaaaaaa"); } } }
结果为:
[DEBUG] 2016-12-27 13:39:33,501 method:com.yesterday.time.testng.TestngTestng.test1(TestngTestng.java:14)TestngTestng.test1 [DEBUG] 2016-12-27 13:39:33,536 method:com.yesterday.time.testng.TestngTestng1.test(TestngTestng1.java:10)TestngTestng1.test sfsd aaaaaaa [DEBUG] 2016-12-27 13:39:33,538 method:com.yesterday.time.testng.TestngTestng.testA(TestngTestng.java:22)TestngTestng.testA [DEBUG] 2016-12-27 13:39:33,539 method:com.yesterday.time.testng.TestngTestng1.test1(TestngTestng1.java:34)TestngTestng1.test1 sfsd GGGGGGGG [DEBUG] 2016-12-27 13:39:33,541 method:com.yesterday.time.testng.TestngTestng.test1(TestngTestng.java:14)TestngTestng.test1 [DEBUG] 2016-12-27 13:39:33,543 method:com.yesterday.time.testng.TestngTestng1.test2(TestngTestng1.java:22)TestngTestng1.test2 sfsd aaaaaaa
从上面的例子中还可以发下,每个关联@DataProvider的test都会在运行之前调用@DataProvider的。
那么在调用父类中的方法的先后顺序是什么样的呢?
事实证明:直接例子
package com.yesterday.time.testng; import org.apache.log4j.Logger; import org.testng.annotations.*; public class TestngTestng { Logger logger = Logger.getLogger(TestngTestng.class); @BeforeClass public void testbeforeClass(){ logger.debug("testbforeClass"); } @BeforeMethod public void testbeforeMethod(){ logger.debug("testbeforeMethod"); } @BeforeSuite public void testbeforeSuite(){ logger.debug("testbeforeSuite"); } @BeforeGroups public void testbeforeGroups(){ logger.debug("testbeforeGroups"); } @BeforeTest public void testbeforeTest(){ logger.debug("testbeforeTest"); } @DataProvider(name = "test1") public Object[][] test1(){ logger.debug("TestngTestng.test1"); return new Object[][]{{5}}; } } package com.yesterday.time.testng; import org.testng.annotations.Test; public class TestngTestng2 extends TestngTestng{ @Test(dataProvider = "test1") public void test(int id){ logger.debug("TestngTestng2.test"); System.out.println("sfsd"); if(id>5) { System.out.println("GGGGGGGG"); }else{ System.out.println("aaaaaaa"); } } }
结果为:
[DEBUG] 2016-12-27 13:51:15,916 method:com.yesterday.time.testng.TestngTestng.testbeforeSuite(TestngTestng.java:22)testbeforeSuite [DEBUG] 2016-12-27 13:51:15,923 method:com.yesterday.time.testng.TestngTestng.testbeforeTest(TestngTestng.java:30)testbeforeTest [DEBUG] 2016-12-27 13:51:15,933 method:com.yesterday.time.testng.TestngTestng.testbeforeClass(TestngTestng.java:13)testbforeClass [DEBUG] 2016-12-27 13:51:15,955 method:com.yesterday.time.testng.TestngTestng.test1(TestngTestng.java:36)TestngTestng.test1 [DEBUG] 2016-12-27 13:51:15,960 method:com.yesterday.time.testng.TestngTestng.testbeforeMethod(TestngTestng.java:18)testbeforeMethod [DEBUG] 2016-12-27 13:51:15,966 method:com.yesterday.time.testng.TestngTestng2.test(TestngTestng2.java:10)TestngTestng2.test sfsd aaaaaaa
从结果上来看,在父类中要注意调用的@DataProvider无法用@BeforeMethod中的方法的问题,这个和继承的加载顺序有关。如果测试方法和@DataProvider、@BeforeMethod在相同的类中,就不会存在这个问题