接着前面的内容,这篇主要针对父类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, 所以每个接口用例就写后面一段就可以。
本篇内容很简单,封装的方法还是太少,欢迎大家来讨论,怎么封装更好。