TestNG是Java中的一个测试框架,主要用于编写和执行自动化测试用例。它是一个功能强大的测试工具,旨在提供一个比JUnit更强大、更灵活的测试框架。TestNG的设计目标是简化广泛的测试需求,从单元测试(隔离测试一个类)到集成测试(测试由多个类、多个包甚至多个外部框架组成的整个系统)
一、配置maven
TestNG现在自动集成到IEDA中,在创建maven项目后,在pom文件中添加testng的依赖
二、生成测试类并使用注解
然后根据src下的类,生成对应的测试类,里面可以定义测试方法,并用不同的注解修饰
@BeforeSuite | 在该测试套件的所有测试运行之前执行,只执行一次 | |
@AfterSuite | 在该套件的所有测试运行之后执行,只执行一次 | |
@BeforeTest | 注释的方法将在属于test标签内的所有类的所有测试方法运行之前运行,一个test标签内可能有多个class(类),在当前test标签内仅运行一次 | |
@AfterSuite |
| |
@BeforeClass | 在属于test标签下的,当前类的第一个测试方法执行之前执行 | |
@AfterClass | 在属于test标签下的,当前类的最后一个测试方法执行之后执行 | |
@BeforeGroups | 配置方法将在组列表运行之前运行。 此方法保证在调用属于这些组中的任何第一个测试方法之前不久运行 | |
@AfterGroups | 配置方法将在组列表运行之后运行。 此方法保证在调用属于这些组中的最后一个测试方法之后不久运行 | |
@BeforeMethod | 注释方法将在每个测试方法执行前执行 | |
@AfterMethod | 注释方法将在每个测试方法执行后执行 | |
@Parameters | 描述怎么传递参数 | |
@DataProvider | 标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] [] ,其中每个Object [] 可以被分配给测试方法的参数列表。 要从该DataProvider 接收数据的@Test 方法需要使用与此注释名称相等的dataProvider 名称 | |
@Listener | 定义类上的监听器 | |
@Factory | 将一个方法定义为工厂 | |
@Test | 将方法作为测试方法,将类作为测试类,里面的公共方法都视为测试方法 |
各个注解在测试套件执行期间,对应的先后顺序是:
@BeforeSuite -> @BeforeTest -> @BeforeClass ->
{@BeforeGroups[@BeforeMethod -> @Test1 -> @AfterMethod,
@BeforeMethod -> @Test2 -> @AfterMethod
, ...] -> @AfterGroups ->
@BeforeGroups[@BeforeMethod -> @Test3 -> @AfterMethod,
@BeforeMethod -> @Test4 -> @AfterMethod
, ...] -> @AfterGroups, ...}->
@AfterClass->@AfterTest->@AfterSuite
每个测试类下可以存在多个组Groups,而一个组又可以定义多个测试方法,每个测试方法执行前后都要执行。所以测试方法执行完毕,再执行组的方法,直到该类下的所有组测试完毕,执行另一个类,到所有类测试完。
三、通过xml文件执行测试
定义xml文件,文件头为 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
然后定义各种标签,注意标签之间的嵌套关系,和意思
写完后右键执行,里面包含的所有测试类都会被测试
3.1 suite标签
是xml文件的根标签,即测试套件,其下可以有多个<test>和<groups>,只存在一个suite标签。suite标签存在多个属性
TestNG单元测试框架详解_testng框架-CSDN博客
四、通过maven执行测试
可以打开终端,输入mvn -D 后面跟上测试的文件路径
五、测试中常用的断言
1、assertEqual (expected value, actual value, [String message], )
断言两个值相等。值可能是类型有 int, short, long, byte, char or java.lang.Object. message参数是一个可选的字符串消息,表示断言失败输出的信息
2、assertTrue(boolean condition, [String message],)
断言一个条件为真;
message参数是一个可选的字符串消息,表示断言失败输出的信息
3、assertFalse(boolean condition,[String message])
断言一个条件为假;
message参数是一个可选的字符串消息,表示断言失败输出的信息
4、assertNotNull(java.lang.Object object ,[String message])
断言一个对象不为空(null);
message参数是一个可选的字符串消息,表示断言失败输出的信息
5、assertNull(java.lang.Object object, [String message] )
断言一个对象为空(null);
message参数是一个可选的字符串消息,表示断言失败输出的信息
6、assertSame(java.lang.Object expected, java.lang.Object actual, [String message] ) 断言两个对象引用相同的对象;
message参数是一个可选的字符串消息,表示断言失败输出的信息
7、assertNotSame( java.lang.Object unexpected, java.lang.Object actual, [String message])
断言两个对象不是引用同一个对象;
message参数是一个可选的字符串消息,表示断言失败输出的信息
8、assertArrayEquals( expectedArray, resultArray, [String message]) 断言预期数组和结果数组相等。数组的类型可能是 int, long, short, char, byte or java.lang.Object.;
message参数是一个可选的字符串消息,表示断言失败输出的信息
六、Test注解的常用属性解释
6.1 预期异常测试:
通过@Test注解的exceptions 属性,可以定义测试报异常时想捕获的异常类型
如果抛出的异常为该异常类型,则测试通过,否则测试失败。
6.2 忽略测试:
有时候我们写的用例没准备好,或者该次测试不想运行此用例,那么删掉显然不明智,那么就可以通过注解@Test(enabled = false)
来将其忽略掉,此用例就不会运行了
6.3 超时测试:
“超时”表示如果单元测试花费的时间超过指定的毫秒数,那么TestNG将会中止它并将其标记为失败。timeOut设置超时时间,单位是毫秒,此项常用于性能测试
6.4 分组测试:
就是groups属性,对应xml文件里的<groups>
如果是直接在class中,是通过@Test(groups="group2")这种方式来分组
而且@BeforeGroup是需要添加group名称才可以正确挂载到该group下的;
这个group说明可以是在单个的测试方法上,也可以在class上,
只要具有同样的group名称,都会在同一个group中,
同时group名称可以有多个,类似@Test(groups = {"mysql","database"})这种
6.5 分suite测试:
测试套件是用于测试软件程序的行为或一组行为的测试用例的集合。
在TestNG中,我们无法在测试源代码中定义一个套件,但它可以由一个XML文件表示
因为套件是执行的功能。 它还允许灵活配置要运行的测试。
套件可以包含一个或多个测试,并由<suite>标记定义。
<suite>是testng.xml的根标记。 描述了一个测试套件,它又由几个<test>部分组成
下表列出了<suite>接受的所有定义的合法属性
注意xml文件下,suite作为根标签只存在一个,而里面的test标签可以多个
6.6 依赖测试:
有时,我们可能需要以特定顺序调用测试用例中的方法,或者可能希望在方法之间共享一些数据和状态。
TestNG支持这种依赖关系,因为它支持在测试方法之间显式依赖的声明。
TestNG允许指定依赖关系:
在@Test注释中使用属性dependsOnMethods指定要依赖的方法名称
在@Test注释中使用属性dependsOnGroups指定要依赖的组名称
除此之外依赖还分为hard依赖和soft依赖:
简而言之,硬依赖就是被依赖的方法或组,只要出错,依赖它的方法和类就不会执行测试,被略过
软依赖是被依赖的方法或组,只要出错,依赖它的方法和类还是会执行测试,但是要加入属性alwaysRun=true,如@Test(dependsOnMethods= {"TestNgLearn1"}, alwaysRun=true);
6.7 参数化测试:
在大多数情况下,您会遇到业务逻辑需要大量测试的场景。 参数化测试允许开发人员使用不同的值一次又一次地运行相同的测试。
TestNG可以通过两种不同的方式将参数直接传递给测试方法:
使用xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false"><test name="Test"><parameter name="param1" value="1011111" /><parameter name="param2" value="10" /><classes><class name="com.demo.test.testng.TestCase1"/></classes></test> <!-- Test -->
</suite> <!-- Suite -->
public class TestCase1 {@Test(enabled=true)@Parameters({"param1", "param2"})public void TestNgLearn1(String param1, int param2) {System.out.println("this is TestNG test case1, and param1 is:"+param1+"; param2 is:"+param2);Assert.assertFalse(false);}@Test(dependsOnMethods= {"TestNgLearn1"})public void TestNgLearn2() {System.out.println("this is TestNG test case2");}
}
这里使用了parameters注解,里面定义参数名称,这样就可以把xml文件里的参数对应到,获取值
使用注解@DataProvider:
public class TestCase1 {@DataProvider(name = "provideNumbers")public Object[][] provideData() {return new Object[][] { { 10, 20 }, { 100, 110 }, { 200, 210 } };}@Test(dataProvider = "provideNumbers")public void TestNgLearn1(int param1, int param2) {System.out.println("this is TestNG test case1, and param1 is:"+param1+"; param2 is:"+param2);Assert.assertFalse(false);}@Test(dependsOnMethods= {"TestNgLearn1"})public void TestNgLearn2() {System.out.println("this is TestNG test case2");}
}
之前说过使用@DataProvider的方法,返回值一定为Object类型的二维数组,这个就是参数值
然后方法的参数列表定义参数进行接收,参数类型可以不同
每次接收到一个数组元素,就是一个不同参数的同名测试
这样就实现了大量相同的测试,但是传入的参数不同
七、testNG报告产出
使用IDEA+TestNG进行测试,没有生成 测试报告,是因为没有勾选监听器使用默认报告,具体操作如下:
输出报告在项目目录下的index.html文件中