RestAssured接口自动化从入门到框架搭建-21-框架组装-TestBase类功能扩充和工具类TestUtils

接着前面的内容,这篇主要针对父类TestBase.java里面功能进行扩充,主要是Rest Assured的一些常见方法的封装,还有就是在Utils包下新建一个TestUtils.java类,里面主要是写一些和测试响应断言相关的方法。

1.TestUtils.java内容

直接来看代码,我就简单写了几个方法,大家可以提意见,最后补充到这个github项目中,完善这个框架。

package com.anthony.utils;

import java.util.HashMap;

import org.testng.Assert;

import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;

public class TestUtils {
	
	//断言状态码是不是200或者其他状态码,例如常见404等
    public void checkStatusCode (Response res, int statusCode) {
        Assert.assertEquals(res.getStatusCode(), statusCode, "状态码检查失败!");
    }
    
    //打印响应全部内容,debug中应该经常用到这个
    public void printAllResponseText(Response res) {
    	System.out.println(res.then().log().all());
    }
    
    //只打印响应正文
    public void printResponseBody(Response res) {
    	System.out.println(res.then().log().body());
    }
}

第一个方法就是每一个接口测试过程都需要进行的状态码的检查,大部分情况下都是200的检测,也有部分201 202 404的状态检测,所以我把200这个地方不能写死,直接我们调用该方法传入期待的响应状态码。

第二个方法和第三个方法,更多是在写接口自动化测试脚本调试过程中使用,避免在测试类中写System.out.print语句,很容易看懂,一个是全部打印响应内容,一个是打印响应正文,都是以字符串格式输出。

肯定还有其他工具方法可以封装到这里,具体看实际项目,本人手上没有实际接口自动化测试项目,所以见识少,欢迎大家一起讨论和完善这里。

 

2.TestBase.java内容

前面一篇,我们完成了一些,这次加入的方法都是一些Rest Assured全局设置或者变量之类的方法。

package com.anthony.base;

import java.util.ResourceBundle;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;

import com.anthony.utils.TestUtils;

import io.restassured.RestAssured;
import static io.restassured.RestAssured.get;
import static io.restassured.RestAssured.given;
import io.restassured.http.ContentType;
import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;

public class TestBase {
	
	public static RequestSpecification httpRequest;
	public static Response response;
	public Logger logger;
	
	public static String serverHost;
	public static String port;
	//Global Setup Variables
	public Response res = null; //Response
	public JsonPath jp = null; //JsonPath
    //测试用例中断言代码能用上这里的 testUtils对象
  	public static TestUtils testUtils = new TestUtils();
  	
	
	static {
		// 用于加载properties文件
		// 注意这里不需要文件扩展名.properties
		ResourceBundle rb = ResourceBundle.getBundle("config"); 
		serverHost = rb.getString("Host");
		port = rb.getString("Port");
	}
	
	@BeforeClass
	public void setup() {
		String className = this.getClass().getName();
		logger = Logger.getLogger(className);
		PropertyConfigurator.configure("log4j.properties");
		logger.setLevel(Level.DEBUG);
		setBaseURI(); //设置Base URI
		//设置Base Path,我这里是api(https://reqres.in/接口地址都是api开头,所以
                //这里basepath设置api这个字符串),看看具体你自己项目请求地址结构
                setBasePath("api"); 
                setContentType(ContentType.JSON); //设置Content Type
	}
	
	@AfterClass
	public void afterTest (){
	        //测试之后恢复一些值的设定
	        resetBaseURI();
	        resetBasePath();
	}
	
    //设置 base URI
    public static void setBaseURI (){
    	if("80".equals(port)) {
    		RestAssured.baseURI = serverHost;
    	}else {
    		RestAssured.baseURI = serverHost+":"+port;
    	}
        //System.out.println(RestAssured.baseURI);
    }

    //设置base path
    public static void setBasePath(String basePath){
        RestAssured.basePath = basePath;
    }

    //执行完测试后重置 Base URI
    public static void resetBaseURI (){
        RestAssured.baseURI = null;
    }

    //执行完测试后重置 base path
    public static void resetBasePath(){
        RestAssured.basePath = null;
    }

    //设置请求 ContentType
    public static void setContentType (ContentType Type){
        given().contentType(Type);
    }

    //返回指定请求path的 response内容
    public static Response getResponsebyPath(String path) {
        return get(path);
    }

    //返回响应内容
    public static Response getResponse() {
        return get();
    }

    //返回 JsonPath对象
    public static JsonPath getJsonPath (Response res) {
        String json = res.asString();
        //System.out.print("returned json: " + json +"\n");
        return new JsonPath(json);
    }
}

这几个方法,重点看看BeforeClass和AfterClass中的调用就明白什么意思,这个setBaseURI,具体看看你自己项目的接口的地址,做出对应改变就好。例如有些接口服务器中setBasePath(), 参数为空就好,这里为什么我写成api,我写了注释。

 

3.测试类

这里举例一个具体的get接口的例子,让我们封装的TestBase对象能够跑起来,这里就是通过一个成功跑起来的测试用例,证明我们前面两个类的代码没有问题。

package com.anthony.cases;

import org.testng.annotations.Test;

import com.anthony.base.TestBase;

public class ListUsersTest extends TestBase {
	
	// get https://reqres.in/api/users?page=2
	@Test
	public void test01_ListUsers() {
		res = getResponsebyPath("/users?page=2");
		jp = getJsonPath(res);
		testUtils.checkStatusCode(res, 200);
		testUtils.printAllResponseText(res);
	}

}

这样测试代码就可以少写很多代码和导入包语句,看起来很简洁。注意我上面提示完整的get接口请求地址和我调用getResponsbyPath()方法的写法,这里就写了一部分,因为前面设置了BasePath和baseURI, 所以每个接口用例就写后面一段就可以。

本篇内容很简单,封装的方法还是太少,欢迎大家来讨论,怎么封装更好。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值