TestNG介绍
TestNG意为test next generation,是Java中的一个测试框架,Java中已经有一个JUnit的测试框架,类似于JUnit和NUnit,但TestNG比JUnit功能更加强大,使用也更方便,测试人员一般用TestNG来写自动化测试。
TestNG最简单的测试
下面是TestNG的一个例子
package TankLearn2.Learn; import org.junit.AfterClass; import org.junit.BeforeClass; import org.testng.annotations.Test; public class TestNGLearn1 { @BeforeClass public void beforeClass() { System.out.println("this is before class"); } @Test public void TestNgLearn() { System.out.println("this is TestNG test case"); } @AfterClass public void afterClass() { System.out.println("this is after class"); } } |
TestNG的基本注解
注解 描述 @BeforeSuite 注解的方法将只运行一次,运行所有测试前此套件中。 @AfterSuite 注解的方法将只运行一次,此套件中的所有测试都运行之后。 @BeforeClass 注解的方法将只运行一次先行先试在当前类中的方法调用。 @AfterClass 注解的方法将只运行一次后已经运行在当前类中的所有测试方法。 @BeforeTest 注解的方法将被运行之前的任何测试方法属于内部类的标签的运行。 @AfterTest 注解的方法将被运行后,所有的测试方法,属于内部类的标签的运行。 @BeforeGroups 组的列表,这种配置方法将之前运行。此方法是保证在运行属于任何这些组第一个测试方法,该方法被调用。 @AfterGroups 组的名单,这种配置方法后,将运行。此方法是保证运行后不久,最后的测试方法,该方法属于任何这些组被调用。 @BeforeMethod 注解的方法将每个测试方法之前运行。 @AfterMethod 被注释的方法将被运行后,每个测试方法。 @DataProvider 标志着一个方法,提供数据的一个测试方法。注解的方法必须返回一个Object[] [],其中每个对象[]的测试方法的参数列表中可以分配。 该@Test方法,希望从这个DataProvider的接收数据,需要使用一个dataProvider名称等于这个注解的名字。 @Listeners 定义一个测试类的监听器。 @Parameters 介绍如何将参数传递给@Test方法。 @Test 标记一个类或方法作为测试的一部分。 |
TestNG组测试
在编写测试的过程中,经常遇到只想执行个别或者某一部分/某一类型的测试用例,TestNG提供了分组测试方法,可以按组来执行测试用例。
package TankLearn2.Learn; import org.testng.annotations.Test; public class GroupTest { @Test(groups = {"systemtest"}) public void testLogin(){ System.out.println("this is test login"); } @Test(groups = {"functiontest"}) public void testOpenPage(){ System.out.println("this is test Open Page"); } } |
TestNG依赖测试
有时,我们需要按顺序来调用测试用例,测试用例之间存在依赖关系,TestNG支持测试用例之间的依赖。
import org.openqa.selenium.WebElement; import org.testng.Assert; import org.testng.annotations.Test; import page.*; import util.AppiumTest; import java.util.List; import static util.Helpers.*; @Test public void method1() { BookMarkEditPage bookMarkPageEdit = new BookMarkEditPage(); bookMarkPageEdit.addPoiToBookMark("清华东路西口"); Assert.assertTrue(bookMarkPageEdit.verifyAddPoiToBookMark("清华东路西口"), "添加poi点失败"); System.out.println("This is method 1"); } @Test(dependsOnMethods = { "method1" }) public void method2() { BookMarkCommonPage bookMarkCommonPage = new BookMarkCommonPage(); bookMarkCommonPage.deleteAllItems(); Assert.assertTrue(bookMarkCommonPage.isDisplayed("你还没有添加收藏"), "删除失败!"); System.out.println("This is method 2"); } |
当测试用例还没准备好时,可以给测试用例加上@Test(enable = false), 来禁用此测试用例。
package Testng; import org.junit.AfterClass; import org.junit.BeforeClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class Ltg { @BeforeMethod public void beforeMethod() { System.out.println("this is before method"); } @Test(enabled = false) public void TestNgLearn1() { System.out.println("this is TestNG test case 1"); } @Test public void TestNgLearn2() { System.out.println("this is TestNG test case 2"); } @AfterMethod public void afterMethod() { System.out.println("this is after method"); } } |
TestNg执行顺序
BeforeMethod/AfterMethod会在每个方法中调用一次,这种适用场所,比如执行完第一个用例之后要重置数据才能执行第二条用例时,可以用这种方式,BeforeMethod 就放重置数据的方法,让每个方法执行之前都去调用这个方法
TestNG具体生命周期
TestNg特点
1、annotations注释,如@test @BeforeMethod ;
2、支持多线程执行case ;
3、支持数据驱动dataProvider ;
4、支持参参数 ;
5、能够作为eclipse的插件 ;
6、能够(配合reportng)生产客观的测试报告 ;
7、可通过testng.xml管理执行case和suite;
TestNG suite
<suite> testng.xml文档中最上层的元素
说明:一个xml文件只能有一个<suites>,是一个xml文件的根级
<suite>由<test>和<parameters>组成
suite定义一个测试套件,可以设置是否使用多线程,可包含多个测试用例或者测试group。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="SuiteTG"> <test name="test"> <classes> <class name="Testng.TestngL1"/> </classes> </test> <test name="test12"> <classes> <class name="util.Ltg" /> </classes> </test> </suite> |
testng.xml 配置详解
简单的大概结构如下: 以下详细XML规则 -结-构-树 suite –tests —-parameters —-groups ——definitions ——runs —-classes –parameters 比较详细的结构如下: |
<test name="xxxx"> <!-- 参数定义的方法 --> <parameter name="first-name" value="Cedric"/> <!-- groups的用法,前提是需要存在classes的组,否则所有方法不被运行 --> <groups> <!-- 定义组中组的方法 --> <define name="groups_name"> <include name="group1"/> <include name="group2"/> </define> <run> <!-- 此处用组名来区别 --> <inclue name="groups_name" /> <exclue name="groups_name" /> </run> </groups> <!-- classes的用法,classes中包含类名,类名底下可以包含方法名或排除方法名 --> <classes> <class name="class1"> <methods> <!-- 此处用方法名来区别 --> <inclue name="method_name" /> <exclue name="method_name" /> </methods> </class> </classes> </test> |