适合测试人员使用的原因
比Junit涵盖功能更全面的测试框架 Junit更适合隔离性比较强的单元测试 TestNG更适合复杂的集成测试
TestNG使用引入版本到pom文件中
<dependencies> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.10</version> </dependency> </dependencies>下图为TestNG基本注解说明
输入注解@Test 选择testng包,自动引入TestNG套件测试
验证多个类中加入Test注解,配置resources下的xml文档,把多个类分别引入,如下图 再有一个befortest与aftertest注解,beforesuit与aftersuit注解 运行配置文件,查看运行结果为先运行suit套件再运行beforetest注解再运行test注解 //一个Test注解类代码: public class PayTest { @Test public void paytest(){ System.out.println("支付宝支付成功"); } } //一个套件注解类代码: public class suitConfig { @BeforeSuite public void BeforeSuite() { System.out.println("before suit 运行"); } @AfterSuite public void AfterSuite() { System.out.println("After suit 运行"); } @BeforeTest public void BeforeTest() { System.out.println("BeforeTest yunxing"); } @AfterTest public void AfterTest() { System.out.println("AfterTest yunxing"); } }配置文件与运行结果展示: TestNG忽略测试
注解后加enabled,则运行时跳过此方法 @Test(enabled = false) public void enable2() { System.out.println("enable2 执行"); }TestNG组测试
注解后加groups 对一个类中不同方法分组 @Test(groups="server") //注解写在方法上 public void test1(){ System.out.println("这是服务端的测试方法111"); } @Test(groups="client") public void test2(){ System.out.println("这是客户端的测试方法111"); } @BeforeGroups("server") public void test3(){ System.out.println("这是服务端组运行之前运行的方法"); } @AfterGroups("server") public void test4(){ System.out.println("这是服务端组运行之后运行的方法"); }运行结果: 这是服务端组运行之前运行的方法 这是服务端的测试方法111 这是服务端组运行之后运行的方法 这是客户端的测试方法111
注解后加groups对不同类分组 @Test(groups = "stu")//注解写在类上 public class GroupClass1 { public void test1(){ System.out.println("班级 1 中的 男 学生"); } public void test2(){ System.out.println("班级 1 中的 女 学生"); } }对应配置文件 TestNG异常测试 什么时候用到异常测试:传入某些不合法的参数,期望程序抛出异常的预期结果
@Test(expectedExceptions = RuntimeException.class) public void runTimeExceptionFailed(){ System.out.println("注解方式抛出异常"); } @Test(expectedExceptions = RuntimeException.class) public void runTimeExceptionSuccess(){ System.out.println("throw方式抛出异常"); throw new RuntimeException(); }TestNG依赖测试 如果被依赖方法未执行通过,则依赖方法不执行 TestNG参数化测试
类方法
@Test @Parameters({"name","age"}) public void paramTest1(String name,int age){ System.out.println("这个小哥哥的name是 "+name+"age为 "+age); }通过xml传递参数
<?xml version="1.0" encoding="utf-8" ?> <suite name="parameter"> <test name="xiaoge"> <classes> <parameter name="name" value="张三"/> <parameter name="age" value="23"/> <class name="Exception"/> </classes> </test> </suite>通过本类中注解传递 参数 通过方法名传递参数 - 引入java-long包中的Method TestNG多线程测试 注解实现多线程
@Test(invocationCount = 10,threadPoolSize = 3)xml配置文件实现多线程
<!-- parallel线程是方法级别的 , methods级别:所有用例都可以在不同的线程下执行。tests级别:不同的test tag下的用例可以在不同的线程下执行,相同的test tag下的用例只能在同一个线程中去执行 。class级别:相同的class tag下的用例在同一线程中执行,不同的class tag下的用例可以在不同的线程中运行 thread-count:最大并发线程数 xml文件配置这种方法不能指定线程池,只有方法上才可以指定线程池 --> <suite name="thread" parallel="methods" thread-count="2">TestNG超时测试
@Test(timeOut = 3000) public void testSusess() throws InterruptedException{ Thread.sleep(2000); } @Test(timeOut = 3000) public void testFaild() throws InterruptedException{ Thread.sleep(4000); }