单元测试框架-testNG
测试人员一般用TestNG来写自动化测试,开发人员一般用JUnit写单元测试
单元测试关注代码的实现逻辑,例如一个if 分支或一个for循环或者某个功能函数
主要问题
- 项目=src+库
- unable to launch:缺少main()方法
-
cannot be resolved to a type:没有导入相应的库
- 导入库:项目右键 -> Build Path -> Configure Build Path -> Libraries -> Add Library ->XXX-> apply and close
安装使用
- JDK,Eclipse--在eclipse中安装testNG--新建project-新建other(testaNG class)--按照注解进行运行,不用main()方法
注解-@
-
对程序元素(类,方法,变量等)进行说明,提供给框架使用
-
launch-发动;Suite-一套;Test-测试方法;Groups-组;Provider-供应者
-
分类
- Suite-在某个测试套件测试执行之前/之后执行
- Class-在某个类的所有方法执行之前/之后
- Test-在某个测试的所有测试方法运行之前/之后
- groups--某个组的所有测试方法执行之前/之后
- Method--在某个测试方法之前/之后--------执行完测试用例后要重置数据才能执行第二条用例时可用之前
- @test--标志一个类或者方法作为测试的一部分
- @parameters--介绍如何将参数传递给@Test方法
- @listeners--定义一个测试类的监听器
- @dateprovider--提供数据的一个测试方法,注解的方法必须返回一个Object[] []
-
@Test(groups="group1") //表示这个方法属于group1组 public void test1() { System.out.println("test1 from group1"); Assert.assertTrue(true); }
beforesuit-beforetest-beforeclass-beforegroups-beforemethod(按顺序一个方法之前)-运行一个方法-aftermethod;
{@BeforeMethod->@Test->@AfterMethod->....};有多少个测试方法就循环几次执行{};
{aftermethond-aftergroups}----afterclass-aftertest————aftersuit
@BeforeSuite、@BeforeTest、@AfterTest、@AfterSuite可以对不同的测试类生效,其他的注解的作用范围只在本类中生效。
基本步骤:
- 编写测试的业务逻辑代码,并在相应代码中插入TestNG的annotation。
- 将测试信息配置到testng.xml文件中
- 运行TestNG,测试报告位于 "test-output" 目录下
suite :代表一个测试套件,它可以包含一个或多个测试
test:代表一个测试,可以包含一个或多个TestNG测试类
class:代表一个类,至少一个TestNG的注解,也可以包含一个或多个测试方法
groups:用来表明测试用例的分组,有利于针对一类的测试用例进行专门的测试
如何执行测试
-
直接执行--Run As ->TestNG Test
-
textng.xml
-
- 在同包下新建xml文件,填入一些标签,其中class name=测试的包名.类名;
- 按顺序执行:test标签中preserve-order="true",method标签中的内容按顺序执行
- 12
-
异常测试:期望某些代码抛出异常,通过@Test(expectedExceptions=...)添加
忽略测试:用例没写好,修改注解为@Test(enabled=false),@Test不能改
超时测试:常用于性能测试,超过指定的毫秒数就标记为失败
分组测试:xml中使用<group>标签;class中是通过@test(groups={"group1","其它名字"})分组
1 <?xml version="1.0" encoding="UTF-8"?> 2 <suite name="Suite" parallel="false"> 3 <test name="Test"> 4 <groups> 5 <incloud name="组名1"></incloud>//先运行组名1,再运行group2 6 <incloud name="group2"></incloud> 7 </groups> 8 <classes> 9 <class name="包名.类名"/> 10 <class name="com.demo.test.testng.TestCase1"/> 11 </classes> 12 </test> 13 </suite>
<suite>标签是testng.xml的根标记,描述了一个测试套件,可以有几个<test>
verbose:日志描述级别,10最详细
依赖测试:以特定顺序调用测试用例中的方法,或者希望在方法之间共享一些数据和状态;添加注解@Test(dependsOnMethods={"依赖的方法名"});先运行被依赖的。
参数化测试:使用不同的值一次又一次地运行相同的测试
textng.xml传递参数:先在class中多添加个注解@Parameters({"参数1", "参数2"}) //使代码和测试数据分离,方便维护
再在 <parameter name="参数1" value="1011111" /> 赋值,运行xml
@DataProvider提供比较复杂的参数:
返回的必然是Object[][];
传参的类型,个数必须要一致
@DataProvider(name = "参数")
public Object[][] provideData() {
return new Object[][] { { 10, 20 }, { 100, 110 }, { 200, 210 } };
}
@Test(dataProvider = "参数")
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);
}
属性介绍
- name:必须有,体现在报告中
- verbose:报告的详细程度,从0开始到10,默认是1
- parallel:指代运行方式,默认是串行-单线程,为none
并行方式:
-
-
- methods:方法层级,若为此值,则该suite下所有的测试方法都将进行多线程
- tests:每个<test>标签都将处于一个单独的线程中
- classes:TestNG会将该suite下每个class都将在单独的线程中运行
- instances:实例级别,即TestNG同一实例中的所有方法将在同一线程中运行
-
- thread-count:用于指定线程数
- time-out:指定超时时间
- preserve-order:如果为true,则用例执行会按照在xml中的顺序执行,否则会乱序执行,不添加此属性的话默认是按顺序执行的;
- group-by-instances:默认是会将所有重载方法都跑完再运行被依赖方法,将此项设置为true可以先运行被依赖方法
<?xml version="1.0" encoding="UTF-8"?> <suite name="Suite" parallel="false"> <suite name="My suite" parallel="methods" thread-count="5"> <!--parallel 指代运行方式;thread-count指定线程数--> <test name="Test"> <parameter name="param1" value="1011111" /> <!--parameter指定参数名字和值 --> <packages> <package name = "whole.path.to.package.* /> <!-- 包名--> </packages>
<groups> <define name="functest"> <include name="windows"/> <include name="linux"/> </define> <run> <include name = "includedGroup" /> <!--包含一个包中的某些组 --> <exclude name = "excludedGroup" /> <!--排除一个包中的某些组 --> </run> </groups>
<classes> <!-- 一指定类中的全部测试脚本--> <class name="com.demo.test.testng.NewTest"/> <methods> <!-- methods指示一个类中的部分测试脚本--> <include name = "firstMethod" /> </methods> </class> </classes> </test> </suite> <!-- Suite-->