前面一篇我们学习了如何拿到testlink中测试用例的步骤,这篇我们介绍如何拿到测试用例步骤对应的期待结果。从步骤或者期待结果去解析数据,这个是我们的重点。不管步骤还是期待结果,都是我们设定好的Json格式字符串。我们需要拿到接口的一些请求方式和请求地址,或者post方法一般都有json的传参,以及请求完之后,我们需要拿到期待结果的响应状态码,进行测试断言,这个是一个接口测试的基本过程。
不知道你们注意到没有,前面我把project 名称“API_Automation”一直是使用硬编码的方式,这个是不灵活的方式,我这里暂时不去提取到配置文件,等我们写用例运行入口的代码再去优化这个问题。我们的思想就是,我连接你的testlink环境,你只需要提供project名称,我就默认去遍历这个项目下的测试套件,然后嵌套遍历测试用例,再次嵌套遍历测试步骤,一次性运行完全部的接口测试用例。
1.获取步骤对应的期待结果
按照前面一篇获取步骤的思路,我们去获取用例下步骤的期待结果。在com.testlink.tests包下,新建一个GetExpectedResult.java文件。注意下面我的获取用例的方式,然后这里也需要进行数据清洗操作。
package com.testlink.tests;
import java.util.List;
import org.apache.commons.lang3.StringEscapeUtils;
import org.testng.annotations.Test;
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;
public class GetExpectedResult {
TestLinkAPI api = TestlinkUtil.connect();
@Test
public void getExpectedResult() {
//我这里直接根据external id去拿到单个测试用例,方便测试,就不像前面那样全部获取所有用例
TestCase tc = api.getTestCaseByExternalId("at-1", null);
//得到单个用例的测试步骤集合
List<TestCaseStep> steps = tc.getSteps();
//遍历步骤,但是实际上我们在testlink只写了一个测试步骤,集合只有一个元素
for (TestCaseStep testCaseStep : steps) {
String expectResult = testCaseStep.getExpectedResults();
System.out.println(expectResult);
//数据清洗
//去除最外层的<p> </p>
String s1 = expectResult.split("<p>")[1].split("</p>")[0];
//把全部br换行符替换成空字符
String s2 = s1.replaceAll("<br />", "");
//为了双引号在控制台正常显示
String result = StringEscapeUtils.unescapeHtml4(s2);
System.out.println(result);
}
}
}
先来解释下什么是ExternalId,请看下图
上面是根据这个红圈id来得到这个用例,从而得到这个用例下所有信息。
运行测试结果:
[RemoteTestNG] detected TestNG version 6.14.3
2018-06-03 11:11:52 848 INFO TestBase:28 - 正在读取配置文件...
Hello!
<p>{"code":"200"}</p>
{"code":"200"}
PASSED: getExpectedResult
再看代码,只要你给我提供一个TestCase对象,我就给你返回期待结果字符串,至于你如何找到TestCase不是这个方法关系的问题,我们抽象方法如下,为了节约代码篇幅,我没有贴TestlinkUtil.java全部代码,下面这段代码放最后就行。
public static String getResult(TestLinkAPI api,TestCase tCase) {
TestCase tc = api.getTestCaseByExternalId(tCase.getFullExternalId(), null);
List<TestCaseStep> tcs = tc.getSteps();
String result = null;
//遍历steps集合
for (TestCaseStep testCaseStep : tcs) {
String expectResult = testCaseStep.getExpectedResults();
//System.out.println(expectResult);
//数据清洗
//去除最外层的<p> </p>
String s1 = expectResult.split("<p>")[1].split("</p>")[0];
//把全部br换行符替换成空字符
String s2 = s1.replaceAll("<br />", "");
//为了双引号在控制台正常显示
result = StringEscapeUtils.unescapeHtml4(s2);
}
return result;
}
下面写一个测试类,来测试我们抽取到TestlinkUtil.java中的getResult方法好不好用。
package com.testlink.tests;
import org.testng.annotations.Test;
import com.qa.util.TestlinkUtil;
import br.eti.kinoshita.testlinkjavaapi.TestLinkAPI;
import br.eti.kinoshita.testlinkjavaapi.model.TestCase;
public class GetResultTest {
TestLinkAPI api = TestlinkUtil.connect();
@Test
public void getResult() {
String ExternalID = "au-1";
TestCase tc = api.getTestCaseByExternalId("at-1", null);
String result = TestlinkUtil.getResult(api, tc);
System.out.println(result);
}
}
运行结果:
[RemoteTestNG] detected TestNG version 6.14.3
2018-06-03 11:56:09 555 INFO TestBase:28 - 正在读取配置文件...
Hello!
{"code":"200"}
PASSED: getResult
2.获取请求方式
目前,我们拿到了测试用例的步骤和期待结果。接下来就是对JSON字符串进行解析操作,得到对应json对象的值。这里,我们先介绍得到请求方式。因为这个最重要,一旦拿到请求方式,就可以决定调用get还是post(其他方法暂不考虑)方法去进行接口测试。
在com.testlink.tests包新建一个GetRequestType.java文件
package com.testlink.tests;
import org.testng.annotations.Test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.qa.util.TestUtil;
import com.qa.util.TestlinkUtil;
import br.eti.kinoshita.testlinkjavaapi.TestLinkAPI;
import br.eti.kinoshita.testlinkjavaapi.model.TestCase;
public class GetRequestType {
TestLinkAPI api = TestlinkUtil.connect();
@Test
public void getRequestMethod_get() {
String ExternalID = "at-1";
TestCase tc = api.getTestCaseByExternalId(ExternalID, null);
String action = TestlinkUtil.getTestCaseAction(api, tc);
//把字符串转换成json对象
JSONObject actionJson = JSON.parseObject(action);
//下面开始解析得到名称为method的json对象的值
String method = TestUtil.getValueByJPath(actionJson, "method");
System.out.println(method);
}
@Test
public void getRequestMethod_post() {
String ExternalID = "at-2";
TestCase tc = api.getTestCaseByExternalId(ExternalID, null);
String action = TestlinkUtil.getTestCaseAction(api, tc);
//把字符串转换成json对象
JSONObject actionJson = JSON.parseObject(action);
//下面开始解析得到名称为method的json对象的值
String method = TestUtil.getValueByJPath(actionJson, "method");
System.out.println(method);
}
}
运行测试结果:
[RemoteTestNG] detected TestNG version 6.14.3
2018-06-03 12:49:15 098 INFO TestBase:28 - 正在读取配置文件...
Hello!
get
post
PASSED: getRequestMethod_get
PASSED: getRequestMethod_post
下面来对获取请求方法进行封装,同样只贴出这个方法,不贴出全部TestlinkUtil.java代码。
public static String getRequestType(String stepAction) {
//先把string转换成json对象
JSONObject actionJson = JSON.parseObject(stepAction);
//注意这里method是硬编码,和你testlink步骤中要求一致
String requestType = TestUtil.getValueByJPath(actionJson, "method");
return requestType;
}
再次写一个单元测试来测试封装的方法。
package com.testlink.tests;
import org.testng.annotations.Test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.qa.util.TestUtil;
import com.qa.util.TestlinkUtil;
import br.eti.kinoshita.testlinkjavaapi.TestLinkAPI;
import br.eti.kinoshita.testlinkjavaapi.model.TestCase;
public class GetRequestTypeTest {
TestLinkAPI api = TestlinkUtil.connect();
@Test
public void getRequestMethod_get() {
String ExternalID = "at-1";
TestCase tc = api.getTestCaseByExternalId(ExternalID, null);
String action = TestlinkUtil.getTestCaseAction(api, tc);
String request = TestlinkUtil.getRequestType(action);
System.out.println(request);
}
@Test
public void getRequestMethod_post() {
String ExternalID = "at-2";
TestCase tc = api.getTestCaseByExternalId(ExternalID, null);
String action = TestlinkUtil.getTestCaseAction(api, tc);
String request = TestlinkUtil.getRequestType(action);
System.out.println(request);
}
}
运行结果:
[RemoteTestNG] detected TestNG version 6.14.3
2018-06-03 13:08:47 121 INFO TestBase:28 - 正在读取配置文件...
Hello!
get
post
PASSED: getRequestMethod_get
PASSED: getRequestMethod_post
本篇学完之后,可以得到用例步骤中的具体测试步骤描述文字和json中的请求类型。这个请求类型,将来在我们测试执行入门模块会进行调用去判断,从而决定去调用RestClient.java中的哪个一个封装好的接口请求方法。下一篇继续介绍json解析,拿到接口url和json参数以及期待结果中的状态码。