本文共 4686 字,大约阅读时间需要 15 分钟。
接着前面的内容,这篇主要针对父类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, 所以每个接口用例就写后面一段就可以。
本篇内容很简单,封装的方法还是太少,欢迎大家来讨论,怎么封装更好。
转载地址:http://uqxws.baihongyu.com/