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");
}
}
————————————————
版权声明:本文为CSDN博主「zljain」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zljain/article/details/81483012
                    
                
                
            
        
浙公网安备 33010602011771号