TestNG测试框架

part 1、认识单元测试框架TestNG

Java语言的单元测试框架
. JUnit4,要求JDK1.5及以上版本
. TestNG,同理
单元测试框架的作用
. 使测试代码和产品代码分离
. 简化测试代码的编写
. 灵活组织单元测试用例
. 方便与CI系统集成

TestNG的主要特点:
注解
1. TestNG使用Java和面向对象的功能
2. 支持综合类测试(单元测试、集成测试)
3. 灵活的运行时配置(testng.xml)
4. 支持依赖测试方法,并行测试,负载测试,局部故障
5. 支持多线程测试
6. 支持数据驱动的测试
7. 可扩展

TestNG使用基本步骤
1. 编写测试代码
2. 编写配置文件,testng.xml
3. 运行测试程序

TestNG注解:
这里写图片描述

TestNG中测试的级别
.Suite:最上层的元素
.Test:次一级的元素
.Class:测试类
.Method:测试类中的方法
上面的层次是包含关系,即:Suite可以包含多个Test,Test可以包含多个 Class
Method作用:排除某些测试用例;安排测试用例的执行顺序

import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; import org.testng.Assert;
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.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite" parallel="none">
<test name="Test">
<classes>
<class name="TestNGLearn1"/> <methods>
 <include name="TestNgLearn" /> </methods>
</classes>
 </test> <!-- Test --> </suite> <!-- Suite -->

TestNG运用实例:

运行单元测试用例
. 在Elipse中运行
1. “Run AS Testng Test”运行java测试类
2. “Run AS Testng Test”运行testng.xml文件
. 在命令行中运行
Java –cp …… org.testng.TestNG testng.xml

这里写图片描述
这里写图片描述

TestNG单元测试实例:

项目工程结构
这里写图片描述
业务逻辑代码

package Demo;
public class compute {
public int add(int x, int y) {
return (x+y);
}
}

测试用例代码

package UnitTest;
import Demo.compute;
import org.testng.annotations.AfterClass; import org.testng.annotations.AfterSuite; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeSuite; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import org.testng.Assert;
public class TestCompute { @BeforeSuite
public void setup() {
 //to do something before all testcase } @AfterSuite
public void tearDown() {
//to do something after all testcase }

@BeforeClass

public void doBeforeClass() {
 //to do something }
@AfterClass
public void doAfterClass() {
 //to do something }
@Test
public void testAdd() {
compute cp = new compute(); int result;
result = cp.add(2, 3);
Assert.assertEquals(5,result);
} }

TestNG常用功能:

一、按顺序执行用例:preserve-order=”true“

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite1">
<test name="test12" preserve-order="true">
<classes>
<class name="TankLearn2.Learn.TestNGLearn1">
<methods>
<include name="TestNgLearn3" /> <include name="TestNgLearn1" /> <include name="TestNgLearn2" />
 </methods> </class>
</classes> </test>
</suite>

二、异常测试:通过@Test(expectedExceptions) 来判断期待的异常, 并且判断Error Message

package TankLearn2.Learn;
import org.testng.annotations.Test;
public class ExceptionTest {
 @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp="NullPoint")
public void testException(){
throw new IllegalArgumentException("NullPoint");
}
}

三、测试用例分组:可以按组来执行测试用例

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"); }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<test name="test1">
<groups>
<run>
<include name="functiontest" />
</run>
</groups>
</test>
</suite>

四、参数化测试:给测试用例传递参数

4.1使用testng.xml传递参数,此处注意参数的使用范围

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
 <parameter name="test1" value="Tank" />  <parameter name="test2" value="Xiao" /> <test name="test12">
<classes>
 <class name="TankLearn2.Learn.ParameterizedTest1" /> </classes>
</test> </suite>
package TankLearn2.Learn;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class ParameterizedTest1 {
@Test
@Parameters("test1")
public void ParaTest(String test1){
System.out.println("This is " + test1);
}
}

4.2数据驱动的测试:为测试用例提供数据的不是配置文件参数,而是一段自己编写的程序,使用 @DataProvider注解,并且必须返回Object[][]或Iterator[]

public class InterfaceTest {
LogFile lf = new LogFile();
@DataProvider(name = "TestCases")
public Object[][] getTestCases() {
int len,i,j;
String tcfile,path;
TestCaseXML tcx;
List<TestCase> tcList = new ArrayList<TestCase>();
List<TestCase> tmpList = new ArrayList<TestCase>();
PublicVariable.init();
len = PublicVariable.testcaseFiles.size();
for (i = 0;i < len;i ++) {//get TestCases
tcfile = PublicVariable.testcaseFiles.get(i);
path = System.getProperty("user.dir") + "/" + PublicVariable.testcase_dir + "/" + tcfile;
tcx = new TestCaseXML(path);
tmpList = tcx.getTestCases();
if (tmpList != null) {
tcList.addAll(tmpList);
} }
Object[][] tcs = new Object[tcList.size()][];
for(j = 0;j < tcList.size();j++){
tcs[j] = new Object[]{tcList.get(j)};
}
return tcs;
}
@Test(dataProvider = "TestCases")
public void testHTTPInterface(TestCase tc) {
String result,message,response,status;
String enter = "\r\n";
try {
Thread.sleep(PublicVariable.sleepTime);//delay 5s cause of interface system
} catch (Exception e) {
e.printStackTrace();
}
System.out.print("Testing " + tc.getInterfaceName() + " ...... ");
TestCaseHandler tch = new TestCaseHandler(tc);
message = tc.getTestCaseInfoString();
response = tch.runTestCase();
result = "ResponseContent = " + response + enter;
if (tch.assertResults(response)) {
System.out.println("Pass");
status = "PASS";
} else {
System.out.println("Fail");
status = "FAIL";
lf.addFailContent(status + enter + message + result);
lf.printSeperatorLineFailContent("=");
}

五、依赖测试:如果在执行某个用例之前必须执行其它用例,dependsOnMethods

package TankLearn2.Learn;
import org.testng.annotations.Test; public class DependsTest {
@Test
public void setupEnv(){
System.out.println("this is setup Env"); }
@Test(dependsOnMethods = {"setupEnv"}) public void testMessage(){
System.out.println("this is test message"); }
}

六、忽略测试:不执行该测试用例,enable=false

package TankLearn2.Learn;
import org.testng.annotations.Test;
public class TesgNGIgnore {
@Test(enabled = false)
public void testIgnore(){
System.out.println("This test case will ignore");
}
}
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值