Java+Testlink实现接口自动化测试-9-测试引擎类-执行全部用例

          终于来到了第三个模块的编写,那就是如何让整个框架跑起来并执行全部的接口测试用例。前面我们重点介绍了Testlink操作相关方法的封装过程。这篇,跟着我的思路一步一步走,看看如何能让这个框架执行完全部接口测试用例。

1.把项目名称给提取到配置文件

       我们前面练习了这么多的testlink获取信息操作,都是依赖的项目名称,所以,这里把这个硬编码给提取出来放配置文件。在src/test/java,新建一个main名称的包,然后创建一个RunAllCase的带main方法类。第一步,我们读取配置文件中接口服务器地址host信息和项目名称信息。

package main;

import com.qa.base.TestBase;

public class RunAllCase {

	public static void main(String[] args) {
		
	    //1.得到配置文件内容
	    TestBase base = new TestBase();
		
	    String url = base.prop.getProperty("TestLinkUrl").trim();
	    String devKey = base.prop.getProperty("DEVKEY").trim();
	    String API_Host = base.prop.getProperty("HOST").trim();
	    String projectName = base.prop.getProperty("ProjectName").trim();
	    
	    System.out.println(url);
	    System.out.println(devKey);
	    System.out.println(API_Host);
	    System.out.println(projectName);
			
	}

}

运行测试:

2018-06-03 16:26:02 222 INFO  TestBase:28 - 正在读取配置文件...
http://localhost/testlink/lib/api/xmlrpc/v1/xmlrpc.php
e078360962c574959d0c1022ac461a27
https://reqres.in
API_Automation

       这个打印结果,还是需要和你配置文件里的值去检查下是否匹配。由于main方法我们写了得到testlink api url和devKey,所以,我们之前的在TestlinkUtil.java中的connect()方法需要修改以下。

public static TestLinkAPI connect(String url, String devKey) {
		
	    TestLinkAPI api = null;
	     
	    URL testlinkURL = null;
	     
	    try {
	            testlinkURL = new URL(url);
	    } catch ( MalformedURLException mue )   {
	            mue.printStackTrace( System.err );
	            System.exit(-1);
	    }
	     
	    try {
	    	
	           api = new TestLinkAPI(testlinkURL, devKey);
	           
	    } catch( Exception te) {
	            te.printStackTrace( System.err );
	            System.exit(-1);
	    }
	     
	    System.out.println(api.ping());
		return api;
}
      由于更改了这个连接方法的参数,之前在com.testlink.tests下创建的那些测试用例,在第一个步骤连接的时候都需要提供以上两个参数。为了不报错,你可以把url和devkey直接字符串的方式在这些测试文件中使用connect方法传参。

2.连接testlink环境

在调用连接方法之前,我这里把上面获取的配置文件的变量改成final修饰的。

package main;

import com.qa.base.TestBase;
import com.qa.util.TestlinkUtil;

import br.eti.kinoshita.testlinkjavaapi.TestLinkAPI;

public class RunAllCase {

	public static void main(String[] args) {
		
	    //1.得到配置文件内容
	    final TestBase base = new TestBase();
		
	    final String url = base.prop.getProperty("TestLinkUrl").trim();
	    final String devKey = base.prop.getProperty("DEVKEY").trim();
	    final String API_Host = base.prop.getProperty("HOST").trim();
	    final String projectName = base.prop.getProperty("ProjectName").trim();
	    
	    //System.out.println(url);
	    //System.out.println(devKey);
	    //System.out.println(API_Host);
	    //System.out.println(projectName);
		
	    //2.连接testlink
	    final TestLinkAPI api = TestlinkUtil.connect(url, devKey);
	      
	}

}

运行输出hello说明连接testlink没有问题。

3.根据项目名称获取测试套件

这里我们测试套件,只有一层文件夹结构

package main;

import com.qa.base.TestBase;
import com.qa.util.TestlinkUtil;

import br.eti.kinoshita.testlinkjavaapi.TestLinkAPI;
import br.eti.kinoshita.testlinkjavaapi.model.TestSuite;

public class RunAllCase {

	public static void main(String[] args) {
		
	    //1.得到配置文件内容
	    final TestBase base = new TestBase();
		
	    final String url = base.prop.getProperty("TestLinkUrl").trim();
	    final String devKey = base.prop.getProperty("DEVKEY").trim();
	    final String API_Host = base.prop.getProperty("HOST").trim();
            final String projectName = base.prop.getProperty("ProjectName").trim();
	    
	    //System.out.println(url);
	    //System.out.println(devKey);
	    //System.out.println(API_Host);
	    //System.out.println(projectName);
		
	    //2.连接testlink
	    final TestLinkAPI api = TestlinkUtil.connect(url, devKey);
	    
	    //3.获取测试套件
	    TestSuite[] tSuite = TestlinkUtil.getFirstLeverTestSuite(api, projectName);
	    
	    //遍历测试套件数组
	    for (TestSuite testSuite : tSuite) {
			System.out.println(testSuite.getName());
		}
	}

}

运行结果如果打印出“Test_Suite1”,说明代码没有问题。

4.获取测试用例

     在写根据测试套件获取测试用例数组的时候,发现我之前写的方法TestlinkUtil.getTestCasesForSuite(api, projectName),看参数,发现有问题。这个参数应该是测试套件的名称,而不是项目名称,所以,我需要调节这个封装代码,否则,当前我们不好根据testsuite去循环获取测试用例。

4.1 调整之后的TestlinkUtil.getTestCasesForSuite代码

public static TestCase[] getTestCasesForSuite(TestLinkAPI api, TestSuite tSuite) {
		
		TestCase[] cases = api.getTestCasesForTestSuite(tSuite.getId(), true, null);
		return cases;
	}

4.2 主方法中的获取测试用例

      我添加了log输出记录,注意是使用log4j的logger导入包,我又一次默认是TestNG的Logger模块导包,结果没有任何输出,查了一会代码才发现问题。

package main;

import org.apache.log4j.Logger;

import com.qa.base.TestBase;
import com.qa.util.TestlinkUtil;

import br.eti.kinoshita.testlinkjavaapi.TestLinkAPI;
import br.eti.kinoshita.testlinkjavaapi.model.TestCase;
import br.eti.kinoshita.testlinkjavaapi.model.TestSuite;

public class RunAllCase {
	
	final static Logger log = Logger.getLogger(RunAllCase.class);
	
	public static void main(String[] args) {
		
		//1.得到配置文件内容
	    final TestBase base = new TestBase();
		
	    final String url = base.prop.getProperty("TestLinkUrl").trim();
	    final String devKey = base.prop.getProperty("DEVKEY").trim();
	    final String API_Host = base.prop.getProperty("HOST").trim();
	    log.info("当前接口测试服务器地址为:"+ API_Host);
	    final String projectName = base.prop.getProperty("ProjectName").trim();
	    log.info("当前Testlink中接口测试项目的名称为:"+ projectName);
	    //System.out.println(url);
	    //System.out.println(devKey);
	    //System.out.println(API_Host);
	    //System.out.println(projectName);
		
	    //2.连接testlink
	    log.info("开始连接testlink环境...");
	    final TestLinkAPI api = TestlinkUtil.connect(url, devKey);
	    log.info("连接Testlink环境成功!");
	    //3.获取测试套件
	    log.info("开始获取项目下所有测试套件...");
	    TestSuite[] tSuite = TestlinkUtil.getFirstLeverTestSuite(api, projectName);
	    
	    //遍历测试套件数组
	    for (TestSuite testSuite : tSuite) {
	    	//System.out.println(testSuite.getName());
			log.info("当前测试套件名称为:"+ testSuite.getName()+ "开始遍历这个测试套件下用例。");
			//4.获取测试套件下测试用例
			TestCase[] tCase = TestlinkUtil.getTestCasesForSuite(api, testSuite);
			log.info("已经拿到测试套件 "+ testSuite.getName() + "测试用例数组对象。");
			
		}
	}

}

运行结果:

2018-06-03 19:14:37 124 INFO  TestBase:28 - 正在读取配置文件...
2018-06-03 19:14:37 127 INFO  RunAllCase:24 - 当前接口测试服务器地址为:https://reqres.in
2018-06-03 19:14:37 127 INFO  RunAllCase:26 - 当前Testlink中接口测试项目的名称为:API_Automation
2018-06-03 19:14:37 127 INFO  RunAllCase:33 - 开始连接testlink环境...
Hello!
2018-06-03 19:14:37 873 INFO  RunAllCase:35 - 连接Testlink环境成功!
2018-06-03 19:14:37 874 INFO  RunAllCase:37 - 开始获取项目下所有测试套件...
2018-06-03 19:14:38 422 INFO  RunAllCase:43 - 当前测试套件名称为:Test_Suite1开始遍历这个测试套件下用例。
2018-06-03 19:14:38 728 INFO  RunAllCase:46 - 已经拿到测试套件 Test_Suite1测试用例数组对象。

5.获取测试步骤和actions

      下面步骤5和步骤6,现在嵌套循环层次太多,代码不好阅读,这个就是为什么我这篇文章分这么多小节来一步一步分析和分享代码出来。

package main;

import java.util.List;

import org.apache.log4j.Logger;

import com.qa.base.TestBase;
import com.qa.util.TestlinkUtil;

import br.eti.kinoshita.testlinkjavaapi.TestLinkAPI;
import br.eti.kinoshita.testlinkjavaapi.model.TestCase;
import br.eti.kinoshita.testlinkjavaapi.model.TestCaseStep;
import br.eti.kinoshita.testlinkjavaapi.model.TestSuite;

public class RunAllCase {
	
	final static Logger log = Logger.getLogger(RunAllCase.class);
	
	public static void main(String[] args) {
		
	    //1.得到配置文件内容
	    final TestBase base = new TestBase();
		
	    final String url = base.prop.getProperty("TestLinkUrl").trim();
	    final String devKey = base.prop.getProperty("DEVKEY").trim();
	    final String API_Host = base.prop.getProperty("HOST").trim();
	    log.info("当前接口测试服务器地址为:"+ API_Host);
	    final String projectName = base.prop.getProperty("ProjectName").trim();
	    log.info("当前Testlink中接口测试项目的名称为:"+ projectName);
	    //System.out.println(url);
	    //System.out.println(devKey);
	    //System.out.println(API_Host);
	    //System.out.println(projectName);
		
	    //2.连接testlink
		log.info("开始连接testlink环境...");
	    final TestLinkAPI api = TestlinkUtil.connect(url, devKey);
	    log.info("连接Testlink环境成功!");
	    //3.获取测试套件
	    log.info("开始获取项目下所有测试套件...");
	    TestSuite[] tSuite = TestlinkUtil.getFirstLeverTestSuite(api, projectName);
	    
	    //遍历测试套件数组
	    for (TestSuite testSuite : tSuite) {
	    	//System.out.println(testSuite.getName());
			log.info("当前测试套件名称为:"+ testSuite.getName()+ "开始遍历这个测试套件下用例。");
			//4.获取测试套件下测试用例
			TestCase[] tCase = TestlinkUtil.getTestCasesForSuite(api, testSuite);
			log.info("已经拿到测试套件 "+ testSuite.getName() + "测试用例数组对象。");
			
			//遍历TestCase
			for (TestCase testCase : tCase) {
				
				// 这个方法很重要,如果不使用重新获取TestCase,光靠集合是拿不到测试步骤
				log.info("根据External id查找测试用例对象");
				TestCase tc = api.getTestCaseByExternalId(testCase.getFullExternalId(), null);
				//5.拿到测试步骤
				List<TestCaseStep> tcs = tc.getSteps();
				log.info("得到测试步骤集合。");
				for (TestCaseStep testCaseStep : tcs) {
					//6.获取步骤actions
					String action = testCaseStep.getActions();
					log.info("得到测试用例步骤中的actions");
					
				}
			}
		}
	}

}

6.拿到action中请求类型

       这个对应下面步骤7代码,通过获取测试用例的http请求类型,从而决定调用什么接口测试方法去执行接口请求。

package main;

import java.io.IOException;
import java.util.List;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.log4j.Logger;

import com.qa.base.TestBase;
import com.qa.restclient.RestClient;
import com.qa.util.TestlinkUtil;

import br.eti.kinoshita.testlinkjavaapi.TestLinkAPI;
import br.eti.kinoshita.testlinkjavaapi.model.TestCase;
import br.eti.kinoshita.testlinkjavaapi.model.TestCaseStep;
import br.eti.kinoshita.testlinkjavaapi.model.TestSuite;

public class RunAllCase {
	
	final static Logger log = Logger.getLogger(RunAllCase.class);
	
	public static void main(String[] args) throws ClientProtocolException, IOException {
		
		//1.得到配置文件内容
		final TestBase base = new TestBase();
		
		final String url = base.prop.getProperty("TestLinkUrl").trim();
		final String devKey = base.prop.getProperty("DEVKEY").trim();
		final String API_Host = base.prop.getProperty("HOST").trim();
		log.info("当前接口测试服务器地址为:"+ API_Host);
		final String projectName = base.prop.getProperty("ProjectName").trim();
		log.info("当前Testlink中接口测试项目的名称为:"+ projectName);
	    //System.out.println(url);
	    //System.out.println(devKey);
	    //System.out.println(API_Host);
	    //System.out.println(projectName);
		
	    //2.连接testlink
		log.info("开始连接testlink环境...");
	    final TestLinkAPI api = TestlinkUtil.connect(url, devKey);
	    log.info("连接Testlink环境成功!");
	    //3.获取测试套件
	    log.info("开始获取项目下所有测试套件...");
	    TestSuite[] tSuite = TestlinkUtil.getFirstLeverTestSuite(api, projectName);
	    
	    //遍历测试套件数组
	    for (TestSuite testSuite : tSuite) {
	    	//System.out.println(testSuite.getName());
			log.info("当前测试套件名称为:"+ testSuite.getName()+ "开始遍历这个测试套件下用例。");
			//4.获取测试套件下测试用例
			TestCase[] tCase = TestlinkUtil.getTestCasesForSuite(api, testSuite);
			log.info("已经拿到测试套件 "+ testSuite.getName() + "测试用例数组对象。");
			
			//遍历TestCase
			for (TestCase testCase : tCase) {
				
				// 这个方法很重要,如果不使用重新获取TestCase,光靠集合是拿不到测试步骤
				log.info("根据External id查找测试用例对象");
				TestCase tc = api.getTestCaseByExternalId(testCase.getFullExternalId(), null);
				//5.拿到测试步骤
				List<TestCaseStep> tcs = tc.getSteps();
				log.info("得到测试步骤集合。");
				for (TestCaseStep testCaseStep : tcs) {
					//6.获取步骤actions
					//String action = testCaseStep.getActions();
					String action = TestlinkUtil.getTestCaseAction(api, tc);
					log.info("得到测试用例步骤中的actions");
					// 获取测试期待结果字符串
					String result = TestlinkUtil.getResult(api, tc);
					log.info("得到测试用例步骤期待结果字符串");
					//7.获取用例接口请求方式,一般是get或者post
					String requestType = TestlinkUtil.getRequestType(action);
					log.info("已经拿到接口用例的请求方式。");
					
					if("get".equalsIgnoreCase(requestType)) {
						//执行 get请求
						log.info("该接口用例请求方式是 get");
						
						//接下里,确定了是执行get接口请求,下面我们就需要组装好接口信息
						//拿到接口url
						String fullUrl = API_Host + TestlinkUtil.getApiUrl(action);
						log.info("当前接口完整url为:" + fullUrl);
						
						//拿到期待结果,方便接下来进行测试断言
						String code = TestlinkUtil.getStatusCode(result);
						log.info("解析出testlink期待结果中响应状态码是:" + code);
						
						//调用get请求方法,这里用的不带请求头的get方法
						log.info("测试用例 " + tc.getName() + "开始执行get请求。");
						
						// 调用之前基于httpclient封装的接口请求方法
						RestClient rc = new RestClient();
						CloseableHttpResponse response =  rc.get(fullUrl);
						log.info("get请求发送成功,得到响应");
						
						int responseCode = rc.getStatusCode(response);
						log.info("实际的http响应状态码为:" + responseCode);
						//判断实际响应状态码是不是和testlink获取的一致
						if((String.valueOf(responseCode)).equalsIgnoreCase(code)) {
							log.info("断言成功,测试通过。");
						}else {
							log.error("实际响应状态码和testlink中不一致!!");
						}
						
					}else if("post".equalsIgnoreCase(requestType)) {
						//执行post请求
						log.info("该接口用例请求方式是 post");
						
					}else {
						//这里我没有写put ,delete等其他请求方法,如有必要,自己添加就好
						log.error("测试用例接口请求方式不是get,也不是post,请检查");
					}
				}
			}
		}
	}

}

       代码嵌套太多,上面只写了get请求分支,post请求分支写下一个小节里,方便你们阅读。需要从本文开头,一步一步屡清楚思路。我承认这个思想很笨,多层嵌套遍历循环操作。

运行结果:

2018-06-03 20:33:16 903 INFO  TestBase:28 - 正在读取配置文件...
2018-06-03 20:33:16 906 INFO  RunAllCase:31 - 当前接口测试服务器地址为:https://reqres.in
2018-06-03 20:33:16 907 INFO  RunAllCase:33 - 当前Testlink中接口测试项目的名称为:API_Automation
2018-06-03 20:33:16 907 INFO  RunAllCase:40 - 开始连接testlink环境...
Hello!
2018-06-03 20:33:17 676 INFO  RunAllCase:42 - 连接Testlink环境成功!
2018-06-03 20:33:17 676 INFO  RunAllCase:44 - 开始获取项目下所有测试套件...
2018-06-03 20:33:18 211 INFO  RunAllCase:50 - 当前测试套件名称为:Test_Suite1开始遍历这个测试套件下用例。
2018-06-03 20:33:18 513 INFO  RunAllCase:53 - 已经拿到测试套件 Test_Suite1测试用例数组对象。
2018-06-03 20:33:18 516 INFO  RunAllCase:59 - 根据External id查找测试用例对象
2018-06-03 20:33:18 967 INFO  RunAllCase:63 - 得到测试步骤集合。
2018-06-03 20:33:19 483 INFO  RunAllCase:68 - 得到测试用例步骤中的actions
2018-06-03 20:33:19 900 INFO  RunAllCase:71 - 得到测试用例步骤期待结果字符串
2018-06-03 20:33:19 991 INFO  RunAllCase:74 - 已经拿到接口用例的请求方式。
2018-06-03 20:33:19 991 INFO  RunAllCase:78 - 该接口用例请求方式是 get
2018-06-03 20:33:19 991 INFO  RunAllCase:83 - 当前接口完整url为:https://reqres.in/api/users?page=2
2018-06-03 20:33:19 992 INFO  RunAllCase:87 - 解析出testlink期待结果中响应状态码是:200
2018-06-03 20:33:19 993 INFO  RunAllCase:90 - 测试用例 Test_Case1开始执行get请求。
2018-06-03 20:33:20 994 INFO  RestClient:41 - 开始发送get请求...
2018-06-03 20:33:22 321 INFO  RestClient:43 - 发送请求成功!开始得到响应对象。
2018-06-03 20:33:22 321 INFO  RunAllCase:95 - get请求发送成功,得到响应
2018-06-03 20:33:22 322 INFO  RestClient:146 - 解析,得到响应状态码:200
2018-06-03 20:33:22 322 INFO  RunAllCase:98 - 实际的http响应状态码为:200
2018-06-03 20:33:22 322 INFO  RunAllCase:101 - 断言成功,测试通过。
2018-06-03 20:33:22 322 INFO  RunAllCase:59 - 根据External id查找测试用例对象
2018-06-03 20:33:22 800 INFO  RunAllCase:63 - 得到测试步骤集合。
2018-06-03 20:33:23 236 INFO  RunAllCase:68 - 得到测试用例步骤中的actions
2018-06-03 20:33:23 721 INFO  RunAllCase:71 - 得到测试用例步骤期待结果字符串
2018-06-03 20:33:23 725 INFO  RunAllCase:74 - 已经拿到接口用例的请求方式。
2018-06-03 20:33:23 726 INFO  RunAllCase:108 - 该接口用例请求方式是 post

7.post请求过程

下面是post请求封装数据和执行过程。

package main;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.log4j.Logger;

import com.qa.base.TestBase;
import com.qa.restclient.RestClient;
import com.qa.util.TestlinkUtil;

import br.eti.kinoshita.testlinkjavaapi.TestLinkAPI;
import br.eti.kinoshita.testlinkjavaapi.model.TestCase;
import br.eti.kinoshita.testlinkjavaapi.model.TestCaseStep;
import br.eti.kinoshita.testlinkjavaapi.model.TestSuite;

public class RunAllCase {
	
	final static Logger log = Logger.getLogger(RunAllCase.class);
	static RestClient rc = new RestClient();
	
	public static void main(String[] args) throws ClientProtocolException, IOException {
		
		//1.得到配置文件内容
		final TestBase base = new TestBase();
		
		final String url = base.prop.getProperty("TestLinkUrl").trim();
		final String devKey = base.prop.getProperty("DEVKEY").trim();
		final String API_Host = base.prop.getProperty("HOST").trim();
		log.info("当前接口测试服务器地址为:"+ API_Host);
		final String projectName = base.prop.getProperty("ProjectName").trim();
		log.info("当前Testlink中接口测试项目的名称为:"+ projectName);
	    //System.out.println(url);
	    //System.out.println(devKey);
	    //System.out.println(API_Host);
	    //System.out.println(projectName);
		
	    //2.连接testlink
		log.info("开始连接testlink环境...");
	    final TestLinkAPI api = TestlinkUtil.connect(url, devKey);
	    log.info("连接Testlink环境成功!");
	    //3.获取测试套件
	    log.info("开始获取项目下所有测试套件...");
	    TestSuite[] tSuite = TestlinkUtil.getFirstLeverTestSuite(api, projectName);
	    
	    //遍历测试套件数组
	    for (TestSuite testSuite : tSuite) {
	    	//System.out.println(testSuite.getName());
			log.info("当前测试套件名称为:"+ testSuite.getName()+ "开始遍历这个测试套件下用例。");
			//4.获取测试套件下测试用例
			TestCase[] tCase = TestlinkUtil.getTestCasesForSuite(api, testSuite);
			log.info("已经拿到测试套件 "+ testSuite.getName() + "测试用例数组对象。");
			
			//遍历TestCase
			for (TestCase testCase : tCase) {
				
				// 这个方法很重要,如果不使用重新获取TestCase,光靠集合是拿不到测试步骤
				log.info("根据External id查找测试用例对象");
				TestCase tc = api.getTestCaseByExternalId(testCase.getFullExternalId(), null);
				//5.拿到测试步骤
				List<TestCaseStep> tcs = tc.getSteps();
				log.info("得到测试步骤集合。");
				for (TestCaseStep testCaseStep : tcs) {
					//6.获取步骤actions
					//String action = testCaseStep.getActions();
					String action = TestlinkUtil.getTestCaseAction(api, tc);
					log.info("得到测试用例步骤中的actions");
					// 获取测试期待结果字符串
					String result = TestlinkUtil.getResult(api, tc);
					log.info("得到测试用例步骤期待结果字符串");
					//7.获取用例接口请求方式,一般是get或者post
					String requestType = TestlinkUtil.getRequestType(action);
					log.info("已经拿到接口用例的请求方式。");
					
					if("get".equalsIgnoreCase(requestType)) {
						//执行 get请求
						log.info("该接口用例请求方式是 get");
						
						//接下里,确定了是执行get接口请求,下面我们就需要组装好接口信息
						//拿到接口url
						String fullUrl = API_Host + TestlinkUtil.getApiUrl(action);
						log.info("当前接口完整url为:" + fullUrl);
						
						//拿到期待结果,方便接下来进行测试断言
						String code = TestlinkUtil.getStatusCode(result);
						log.info("解析出testlink期待结果中响应状态码是:" + code);
						
						//调用get请求方法,这里用的不带请求头的get方法
						log.info("测试用例 " + tc.getName() + "开始执行get请求。");
						
						// 调用之前基于httpclient封装的接口请求方法
						//RestClient rc = new RestClient();
						CloseableHttpResponse response =  rc.get(fullUrl);
						log.info("get请求发送成功,得到响应");
						
						int responseCode = rc.getStatusCode(response);
						log.info("实际的http响应状态码为:" + responseCode);
						//判断实际响应状态码是不是和testlink获取的一致
						log.info("开始进行测试断言");
						if((String.valueOf(responseCode)).equalsIgnoreCase(code)) {
							log.info("断言成功,测试通过,当前测试运行结束。");
						}else {
							log.error("实际响应状态码和testlink中不一致!!");
						}
						
					}else if("post".equalsIgnoreCase(requestType)) {
						//执行post请求
						log.info("该接口用例请求方式是 post");
                   
						//接下里,确定了是执行post接口请求,下面我们就需要组装好接口信息
						//拿到接口url
						String fullUrl = API_Host + TestlinkUtil.getApiUrl(action);
						log.info("当前接口完整url为:" + fullUrl);
						
						//拿到期待结果,方便接下来进行测试断言
						String code = TestlinkUtil.getStatusCode(result);
						log.info("解析出testlink期待结果中响应状态码是:" + code);
						
						//拿到json参数
						String jsonParam = TestlinkUtil.getJsonParam(action);
						log.info("解析json,拿到post请求的json参数");
						
						//封装post请求的头信息
						HashMap<String,String> headermap = new HashMap<String,String>();
						headermap.put("Content-Type", "application/json"); 
						log.info("请求头信息构造成功。");
						
						log.info("开始执行post请求...");
						CloseableHttpResponse response = rc.post(fullUrl, jsonParam, headermap);
						log.info("成功发送post请求,得到http响应");
						
						int responseCode = rc.getStatusCode(response);
						log.info("实际的响应状态码为:"+ responseCode);
						log.info("开始进行测试断言");
						if((String.valueOf(responseCode)).equalsIgnoreCase(code)) {
							log.info("断言成功,测试通过,当前测试运行结束。");
						}else {
							log.error("实际响应状态码和testlink中不一致!!");
						}
						
					}else {
						//这里我没有写put ,delete等其他请求方法,如有必要,自己添加就好
						log.error("测试用例接口请求方式不是get,也不是post,请检查");
					}
				}
			}
		}
	}

}

运行结果:

2018-06-03 20:50:32 331 INFO  TestBase:28 - 正在读取配置文件...
2018-06-03 20:50:32 334 INFO  RunAllCase:33 - 当前接口测试服务器地址为:https://reqres.in
2018-06-03 20:50:32 334 INFO  RunAllCase:35 - 当前Testlink中接口测试项目的名称为:API_Automation
2018-06-03 20:50:32 335 INFO  RunAllCase:42 - 开始连接testlink环境...
Hello!
2018-06-03 20:50:33 077 INFO  RunAllCase:44 - 连接Testlink环境成功!
2018-06-03 20:50:33 077 INFO  RunAllCase:46 - 开始获取项目下所有测试套件...
2018-06-03 20:50:33 611 INFO  RunAllCase:52 - 当前测试套件名称为:Test_Suite1开始遍历这个测试套件下用例。
2018-06-03 20:50:33 919 INFO  RunAllCase:55 - 已经拿到测试套件 Test_Suite1测试用例数组对象。
2018-06-03 20:50:33 921 INFO  RunAllCase:61 - 根据External id查找测试用例对象
2018-06-03 20:50:34 350 INFO  RunAllCase:65 - 得到测试步骤集合。
2018-06-03 20:50:34 845 INFO  RunAllCase:70 - 得到测试用例步骤中的actions
2018-06-03 20:50:35 281 INFO  RunAllCase:73 - 得到测试用例步骤期待结果字符串
2018-06-03 20:50:35 392 INFO  RunAllCase:76 - 已经拿到接口用例的请求方式。
2018-06-03 20:50:35 393 INFO  RunAllCase:80 - 该接口用例请求方式是 get
2018-06-03 20:50:35 393 INFO  RunAllCase:85 - 当前接口完整url为:https://reqres.in/api/users?page=2
2018-06-03 20:50:35 394 INFO  RunAllCase:89 - 解析出testlink期待结果中响应状态码是:200
2018-06-03 20:50:35 396 INFO  RunAllCase:92 - 测试用例 Test_Case1开始执行get请求。
2018-06-03 20:50:36 110 INFO  RestClient:41 - 开始发送get请求...
2018-06-03 20:50:37 134 INFO  RestClient:43 - 发送请求成功!开始得到响应对象。
2018-06-03 20:50:37 137 INFO  RunAllCase:97 - get请求发送成功,得到响应
2018-06-03 20:50:37 138 INFO  RestClient:146 - 解析,得到响应状态码:200
2018-06-03 20:50:37 138 INFO  RunAllCase:100 - 实际的http响应状态码为:200
2018-06-03 20:50:37 138 INFO  RunAllCase:102 - 开始进行测试断言
2018-06-03 20:50:37 139 INFO  RunAllCase:104 - 断言成功,测试通过,当前测试运行结束。
2018-06-03 20:50:37 139 INFO  RunAllCase:61 - 根据External id查找测试用例对象
2018-06-03 20:50:37 713 INFO  RunAllCase:65 - 得到测试步骤集合。
2018-06-03 20:50:38 126 INFO  RunAllCase:70 - 得到测试用例步骤中的actions
2018-06-03 20:50:38 587 INFO  RunAllCase:73 - 得到测试用例步骤期待结果字符串
2018-06-03 20:50:38 588 INFO  RunAllCase:76 - 已经拿到接口用例的请求方式。
2018-06-03 20:50:38 588 INFO  RunAllCase:111 - 该接口用例请求方式是 post
2018-06-03 20:50:38 589 INFO  RunAllCase:116 - 当前接口完整url为:https://reqres.in/api/users
2018-06-03 20:50:38 589 INFO  RunAllCase:120 - 解析出testlink期待结果中响应状态码是:201
2018-06-03 20:50:38 605 INFO  RunAllCase:124 - 解析json,拿到post请求的json参数
2018-06-03 20:50:38 605 INFO  RunAllCase:129 - 请求头信息构造成功。
2018-06-03 20:50:38 606 INFO  RunAllCase:131 - 开始执行post请求...
2018-06-03 20:50:39 184 INFO  RestClient:94 - 开始发送post请求
2018-06-03 20:50:39 184 INFO  RunAllCase:133 - 成功发送post请求,得到http响应
2018-06-03 20:50:39 184 INFO  RestClient:146 - 解析,得到响应状态码:201
2018-06-03 20:50:39 184 INFO  RunAllCase:136 - 实际的响应状态码为:201
2018-06-03 20:50:39 184 INFO  RunAllCase:137 - 开始进行测试断言
2018-06-03 20:50:39 185 INFO  RunAllCase:139 - 断言成功,测试通过,当前测试运行结束。
      目前,看日志记录,我们顺利执行完testlink环境的所有接口测试用例,当然,我环境只有2条,但是这个代码和思路是没有问题的。到这里,框架设计部分完全结束,相关源码,点击这里。下一篇主要是总结和相关缺陷分析。


猜你喜欢

转载自blog.csdn.net/u011541946/article/details/80557519