安装
方式一:Eclipse安装(安装不上)
Help-> insert new software ->work with 输入 http://beust.com/eclipse
方式二
打开连接 https://marketplace.eclipse.org/content/testng-eclipse#group-external-install-button
, 直接拖拽Eclipse图标到打开的工程项目中。
注解
注解用来标注测试用例是否执行,以及执行的时间、顺序 注解加在方法前,这个方法会当测试项执行; 注解加在类前,类中的所有方法都会当测试项执行;
- @Test:注解测试用例,在"Run as-TestNG Test"时,会执行;
- @BeforeSuite:在测试集运行之前运行。
- @AfterSuite:在测试集运行之后运行
- @BeforeTest:执行测试方法之前运行。
- @AfterTest:执行测试方法之后运行。
- @BeforeGroups:在测试组第一个测试方法之前运行。
- @AfterGroups:在测试组最后一个测试方法之后运行。
- @BeforeClass- 在当前类的第一个测试方法之前运行。
- @AfterClass - 运行当前类中的所有测试方法之后都运行。
- @BeforeMethod - 在每个测试方法之前运行。
- @AfterMethod - 在每个测试方法之后运行。
使用xml控制测试用例的执行
xml执行:右键-Run as-TestNG Test
异常检查 expectedExceptions
expectedExceptions 检查抛出的异常是否正确,
public class Test { @Test(expectedExceptions = ArithmeticException.class) public void test1() { int i = 1 / 0; //1/0会抛出ArithmeticException异常,会被@Test注解的expectedExceptions捕获, }}
禁用测试用例 enabled
使用enabled葫芦哦不想执行某些测试用例,
@Test(enabled = true) //执行测试项public void test1() { System.out.println("test1");}@Test(enabled = false) //忽略测试项public void test2() { System.out.println("test2");}
超时 timeOut
timeOut,设置测试用例的超时时间,如果超过超时时间没有执行完成,则认定为执行失败。超时时间以毫秒为单位。
@Test(timeOut = 1000) //1S内用例没有执行完成,认定为超时,执行失败public void test2() { System.out.println("test2");}
测试组
将测试用例分组分别执行。 分组可以在类上应用,类的每个公共方法都属于该分组。
@Test(dependsOnGroups = {"test1", "test2"}) //组依赖:只有test1和test2组中的用例都执行完,才会执行test7public void test7() { System.out.println("test7");}@Test(groups = "test1")public void test1() { System.out.println("test1");}@Test(groups = "test2")public void test2() { System.out.println("test2");}@Test(groups = "test1")public void test3() { System.out.println("test3");}@Test(groups = "test2")public void test4() { System.out.println("test4");}
- xml执行测试组,必须要指定class,否则测试组不会执行。
- xml文件中,groups要写在Classes之前,否则会报错。
test.xml常用方法
指定package
指定执行的类和方法;排除不执行的方法
//指定执行的组 //指定不执行的组 //指定不执行的方法
依赖
- dependsOnMethods:依赖方法
- dependsOnGroups:依赖组
- 如果依赖的方法或组执行失败,则会跳过后续所有操作。
@Test(dependsOnGroups = {"test1", "test2"})public void test7() { System.out.println("test7");}@Test(groups = "test1", dependsOnMethods = {"test2"})public void test1() { System.out.println("test1");}
传递参数
使用xml传递参数
xml中使用parameter定义参数的名称和值
方法中通过@Parameters使用xml的参数
public class test1 { @Test @Parameters({"par1", "par2"}) public void test(String par1, String par2) { System.out.println("par1 = " + par1); System.out.println("par2 = " + par2); }}
使用dataProvider传值
注解为@DataProvider的方法,返回值必须是 Object[][]
public class test1 { @Test(dataProvider = "dataProvider") public void test(int n, int m, Boolean flag) { assertTrue((n == m) == flag); } @DataProvider(name = "dataProvider") public Object[][] test2() { return new Object[][] { { 10, 10, true}, { 100, 110 ,false}, { 200, 200 ,true} }; }}
@Test(dataProvider = "dataProvider")public void test(Mapmap) { for (Map.Entry entry : map.entrySet()) { System.out.println("[Key] : " + entry.getKey() + " [Value] : " + entry.getValue()); }}@DataProvider(name = "dataProvider")public Object[][] test2() { Map data = tes3(); return new Object[][] { {data} };}public Map tes3() { Map map = new HashMap (); map.put("13", "13"); map.put("23", "23"); return map;}
根据方法名,返回不同数据
@Test(dataProvider = "dataProvider")public void test(int n, int m) { System.out.println(n + m);}@Test(dataProvider = "dataProvider")public void test_1(int n, int m) { System.out.println(n + m);}@DataProvider(name = "dataProvider")public Object[][] test2(Method method) { if (method.getName().equals("test")) { return new Object[][] { {1,2} }; }else { return new Object[][] { {3,4} }; }}
根据分组名,返回不同参数
@Test(dataProvider = "dataProvider", groups = { "group1" })public void test(int n, int m) { System.out.println(n + m);}@Test(dataProvider = "dataProvider", groups = { "group2" })public void test_1(int n, int m) { System.out.println(n + m);}@DataProvider(name = "dataProvider")public Object[][] test2(ITestContext context) { for (String group: context.getIncludedGroups()) { if (group.equals("group1")) { return new Object[][] { {1,2} }; } } return new Object[][] { {3,4} };}