1、TestNG是什么:是Java中的一个测试框架,即可以做单元测试,也可以做集成测试。
2、TestNG的特点:注解;灵活的测试配置;测试例可以更容易地进行分组;实现测试并行;支持数据驱动测试;内置的报告。
3、TestNG注解
@BeforeSuite:在此套件中的所有测试运行之前运行。
@AfterSuite:在此套件中的所有测试运行之后运行。
@BeforeTest:在运行属于<test>标签内的类的任何测试方法之前运行。
@AfterTest:在运行属于<test>标签内的类的所有测试方法都已运行之后运行。
@BeforeGroups:在调用属于该组的第一个测试方法之前运行。
@AfterGroups:在调用属于组的最后一个测试方法之后运行。
@BeforeClass:在当前类的第一个测试方法之前运行。
@AfterClass:运行当前类中的所有测试方法之后都运行。
@BeforeMethod:每个测试方法之前运行。
@AfterMethod:每个测试方法之后运行。
4、TestNG套件测试类
第一个测试类:
@BeforeSuite public void beforeSuite() { System.out.println("beforeSuite"); } @AfterSuite public void afterSuite() { System.out.println("afterSuite"); } @BeforeTest public void beforeTest() { System.out.println("beforeTest"); } @AfterTest public void afterTest() { System.out.println("afterTest"); }
第二个测试类:
@Test public void test() { System.out.println("test"); } @Test public void test1() { System.out.println("test1"); }
创建一个XML文件一起运行多个测试用例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <!-- @BeforeSuite --> <suite name="TestAll"> <!-- @BeforeTest --> <test name="case1"> <classes> <class name="com.fu2.TestConfiguration"/> <class name="com.fu2.TestDBConnection"/> <class name="com.fu2.DBConfig"/> </classes> </test> <!-- @AfterTest --> <!-- @BeforeTest --> <test name="case2"> <classes> <class name="com.fu2.TestDBConnection"/> <class name="com.fu2.DBConfig"/> </classes> </test> <!-- @AfterTest --> </suite> <!-- @AfterSuite -->
5、TestNG异常测试
1.运行时异常
@Test(expectedExceptions = ArithmeticException.class) public void test() { int i = 1 / 0; System.out.println(i); }
2.检查异常
定义一个类:
private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; }
自定义异常:
public class OrderSaveException extends RuntimeException { public OrderSaveException(String message) { super(message); } }
在其他方法抛出自定义异常:
public void save(Order order) throws OrderSaveException{ if (order == null){ throw new OrderSaveException("为空"); } }
验证:
OrderBo orderBo = new OrderBo(); Order o = new Order(); @Test() public void throwIfOrderIsNull() throws OrderSaveException { orderBo.save(null); }
6、TestNG忽略测试
@Test(enabled = false)注释在测试方法上,禁用此测试用例。
//不禁用此测试用例 @Test(enabled = true) public void test() { Assert.assertEquals(true, true); } //禁用此测试用例 @Test(enabled = false) public void test1() { Assert.assertEquals(true, true); }
7、TestNG超时测试
“超时”表示如果单元测试花费的时间超过指定的毫秒数,那么Test将会中止它并将其标记为失败。
@Test(timeOut = 5000) public void test() throws InterruptedException { Thread.sleep(4000); } @Test(timeOut = 1000) public void test1() { while (true) { } }
8、分组测试:将方法调度到适当的部分,并执行复杂的测试方法分组。
1.在方法上的分组:
@BeforeGroups("database") public void test1() { System.out.println("test1"); } @AfterGroups("database") public void test2() { System.out.println("test2"); } @Test(groups = "selenium-test") public void test3() { System.out.println("test3"); } @Test(groups = "selenium-test") public void test4() { System.out.println("test4"); } @Test(groups = "database") public void test5() { System.out.println("test5"); } @Test(groups = "database") public void test6() { System.out.println("test6"); } @Test(dependsOnGroups = {"database", "selenium-test"}) public void test7() { System.out.println("test7"); }
2.在类上的分组:
@Test(groups = "selenium-test") public class TestSelenium { public void test8() { System.out.println("test8"); } public void test9() { System.out.println("test9"); }
9、TestNG依赖测试:使用dependOnMethods和dependOnGroups来实现依赖测试。如果依赖方法失败,将跳过所有后续测试方法。
1.dependOnMethods示例:方法一通过,执行方法二。方法一不通过,则跳过方法二。
@Test public void method1() { System.out.println("method1"); } @Test(dependsOnMethods = {"method1"}) public void method2() { System.out.println("method2"); }
2.dependOnGroups示例:
创建第一个类:
@Test(groups = "deploy") public class TestServer { @Test public void test() { System.out.println("test..."); } @Test(dependsOnMethods = "test") public void test1() { System.out.println("test1..."); } }
创建第二个类:
@Test(groups = "db", dependsOnGroups = "deploy") public void test2() { System.out.println("test2..."); } @Test(dependsOnMethods = {"test2"}, groups = "db") public void test3() { System.out.println("test3..."); }
创建第三个类:
@Test(dependsOnGroups = {"deploy", "db"}) public void test4() { System.out.println("test4..."); } @Test(dependsOnMethods = "test4") public void test5() { System.out.println("test5..."); }
创建XML文件:
<?xml version="1.0" encoding="UTF-8"?> <suite name="TestDependency"> <test name="TestCase1"> <classes> <class name="com.fu8.TestApp"> </class> <class name="com.fu8.TestDatabase"> </class> <class name="com.fu8.TestServer"> </class> </classes> </test> </suite>
10、TestNG参数化测试:使用testng.xml和使用数据提供者2种方式。
1.使用XML传递参数:
创建一个test.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" > <suite name="suite1"> <test name="test01"> <!--parameter标签中写要传入的参数 --> <parameter name="URL" value="https://www.baidu.com"></parameter> <parameter name="PORT" value="443"></parameter> <classes> <class name="com.fu9.ParametersTest" /> </classes> </test> </suite>
创建一个类:
WebDriver driver; @Parameters({"URL", "PORT"}) @BeforeMethod public void test(String URL, String PORT) { System.setProperty("webdriver.firefox.bin", "E:\\Mozilla Firefox\\firefox.exe"); System.setProperty("webdriver.gecko.driver", "E:\\selenium\\geckodriver\\geckodriver.exe"); driver = new FirefoxDriver(); driver.manage().window().maximize(); driver.get(URL+":"+PORT); } @Test public void test1() { String str = driver.getTitle(); Assert.assertEquals(str, "百度一下,你就知道"); } @AfterMethod public void test2() throws InterruptedException { Thread.sleep(2000); driver.quit(); }
2.通过@DataProvider传递参数:
WebDriver driver; @DataProvider(name = "data01") public Object[][] test() { return new Object[][]{{"!", "!_百度搜索"}, {"?", "?_百度搜索"}}; } @DataProvider(name = "data02") public Iterator<Object[]> test1() { Set<Object[]> set = new HashSet<Object[]>(); set.add(new String[]{"!", "!_百度搜索"}); set.add(new String[]{"?", "?_百度搜索"}); return set.iterator(); } @Parameters({"URL", "PORT"}) @BeforeMethod public void test2(String URL, String PORT) { System.setProperty("webdriver.firefox.bin", "E:\\Mozilla Firefox\\firefox.exe"); System.setProperty("webdriver.gecko.driver", "E:\\selenium\\geckodriver\\geckodriver.exe"); driver = new FirefoxDriver(); driver.manage().window().maximize(); driver.get(URL + ":" + PORT); } @Test(dataProvider = "data02") public void test3(String a, String b) throws InterruptedException { driver.findElement(By.cssSelector("#kw")).sendKeys(a); driver.findElement(By.cssSelector("#su")).click(); Thread.sleep(1000); String str = driver.getTitle(); Assert.assertEquals(str, b); } @AfterMethod public void test4() throws InterruptedException { Thread.sleep(2000); driver.quit(); }