TestNg 是 test next generation 意为下一代的测试框架,在JUnit基础之上,变得更加灵活
(1)批量进行测试用例管理维护以及调度执行,能够写出用例后按照设想的逻辑执行
(2)生成测试报告,显示测试数据
<dependencies>
<dependency>
<groupId>org.testnggroupId>
<artifactId>testngartifactId>
<version>7.5version>
dependency>
dependencies>
按照层级关系进行划分的,主要是可以在一个 testNg.xml的文件里面编写执行顺序,标签的层级关系是
suite -> test -> group\class -> method
<suite name=">
" ">
<group>. = 声明测试分组的类别
<run>
<include name="">. 表示包含的组别,执行testNg.xml测试会执行的组别
<exclude name=""> 表示不包含的组别
run>
group>
<class name="">. ==声明测试的类的全限定名
method在class里面
test>
suite>
在执行的测试方法、类前面写,表示可执行,在注解里面有一个属性
------分组测试
group({“”,“”}),表示可以分组,在testNg声明,还有标签并且执行后,会按照指定的组进行执行 -----分组测试
-----忽略测试
enable=“true”, 属性表示 这个用例是否要执行,表示忽略的效果,jUnit中的 @Ignore
有些时候用例只设计了一般可能还未设计好,我们在执行整个测试类的时候删掉又不合适,所以可以用忽略用例这种方法,把用例忽略掉即可。
-------异常测试
expectedExceptions= ArithmeticException.class ------预期异常测试,遇到异常不会终止,能够捕捉到,异常之后的语句不再执行
------超时测试
timeout=1000, 毫秒,常用于性能测试,如果超出时间范围那么用例失败。
表示每个方法用例在执行之前都会执行一下 setUp前置、tearDown后置方法,类似于 jUnit的 @BeforeEach、@AfterEach
@BeforeClass
@AfterClass
在一个测试类执行之前 会执行一下 前置、后置方法,类似于 jUnit 的 @BeforeAll、@AfterAll
在执行组的第一个方法执行之前运行,前置方法和后置方法
在标签之前会执行前置、后置方法
在标签之前会执行前置、后置方法
Assert类下的静态方法,属于硬断言,硬断言就是,运行到断言失败,后面不会执行
assertEquals(“实际值”,“预期值”,“提示信息”)
assertNotEquals ,判断不相等
assertNotNull,判断不为null
assertNull,判断为null
assertFalse,判断为 false
assertTrue,判断为 true
需要创建一个 SoftAssert 实例对象,再调用实例方法 assertEquals、assertTrue 这些断言方法,有以下特点:
1、即使一个断言失败,后续也会继续执行后面的语句和断言
2、一个用例里面有多个断言、失败了其中一个、也不影响其他
3、在用例中的最后一个断言方法之后一定需要加一个 assertAll方法
QA:为什么需要必须加 assertAll 方法呢?
这个原本我也不知道为什么,后来试了一下,这是框架对这个断言执行的一个规则。
如何给测试用例方法穿参呢?
在用例上面使用 @parameters 声明形参,方法里面写参数
@Test
@Parameters({"param1","param2"}) // 注解声明形参
public void testcase1(String param1,String param2){
}
<suite name="Suite" >
<test name="Test">
// <parameter> 标签传递实参
<parameter name="param1" value="1011111" />
<parameter name="param2" value="10" />
<classes>
<class name="com.demo.test.testng.TestCase1"/>
classes>
test>
suite>
@DataProvider注解,使用 Object[][] 接收返回值作为参数,方法上面使用 @Test 的 dataProvider进行接收即可
public class Test{
@DataProvider(name="provideNumbers")
public Object[][] provideData(){
return new Object[][]{
{10,20},{30,40},{2,3}
};
}
@Test(dataProvider="provideNumbers")
public void test(int num1,int num2){
Assert.assertEquals(num1,num2);
}
}
类似于jUnit的 @Paramerts 修饰方法,Collection类型接受传递列表参数Arrays.asList,构造方法接收参数
在jUnit中按照顺序执行用例有一个注解 @Order(1),按照标注的顺序从小到大执行
在testNg中,没有这样的注解,怎样控制顺序?
(1)在test标签里有一个 preserve-Order 属性, 可以控制 class 执行的顺序,class 标签我们按照顺序写就行了,但是class 里面的方法是没有顺序的
DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Preserve order test runs">
<test name="Regression 1" preserve-order="true">
<classes>
<class name="com.pack.preserve.ClassTwo"/>
<class name="com.pack.preserve.ClassThree"/>
<class name="com.pack.preserve.ClassOne"/>
classes>
test>
suite>
(2)如果想让方法有序,那么需要class里面 methods写上 ,这样方法会按照顺序执行
<suite name="Preserve order test runs">
<test name="Regression 1" preserve-order="true">
<classes>
<class name="com.pack.preserve.ClassOne">
<methods>
<include name="BTest" />
<include name="AMethod" />
methods>
class>
classes>
test>
suite>