这一篇,介绍如何获取testlink下的用例的步骤。一个测试用例有多个子步骤,一个步骤有动作描述(actions)和期待结果。在TestLinkAPI中有获取测试步骤的方法,返回的是一个数组对象。
1.Testlink中接口用例步骤设计
这里设计到解析测试用例的步骤,由于本系列是接口自动化测试。所有我们,需要制定好步骤的样式和模板,这里我们采用json的写法,存储接口测试用例数据信息。这些信息包含接口请求类型和接口url和参数以及接口响应期待结果数据。
get测试用例模板
post请求模板
主要是步骤动作和期望结果这两个地方填写需要小心,因为由于一些格式问题,可能造成解析json失败,所以这个模板很重要。这个模本的规则和样式,根据实际情况增加相应字段和字段值。在期望结果,我只写了一个响应状态码的,没有写任何业务数据。这个就是一个测试结果断言粒度的问题,写得详细可能容易出错。写的简单又感觉没有测试什么,这个自己把握。
PS:再次强调上面json内容写法要谨慎,标点符号一定要英文。
2.获取用例步骤
在com.testlink.tests包新建一个GetSteps.java文件,代码如下。
package com.testlink.tests;
import java.util.Arrays;
import java.util.List;
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 GetSteps {
//创建一个testlinkapi对象
TestLinkAPI api;
@Test
public void getSetps() {
api = TestlinkUtil.connect();
TestCase[] cases = TestlinkUtil.getTestCasesForSuite(api, "API_Automation");
List<TestCase> list = Arrays.asList(cases);
List<TestCaseStep> steps = null;
for (TestCase testCase : list) {
//拿到单个测试用例对象,如果不用这个方法,我暂时不知道其他方法可以获取用例下的步骤和期待结果
TestCase tc = api.getTestCaseByExternalId(testCase.getFullExternalId(), null);
steps = tc.getSteps();
//遍历测试action步骤
for (TestCaseStep testCaseStep : steps) {
System.out.println(testCaseStep.getActions());
}
}
}
}
运行结果:
看运行结果,是不是有点激动,终于从testlink中拿到了测试步骤。虽然上面的打印出来的步骤有很多垃圾字符。这个不是问题,我们需要借助一些方法进行数据清洗就可以。
3.步骤数据进行清洗
我们发现上面获取的步骤有很多html标记和"。数据清洗,我们大致步骤是这样的:
1)去除段落<p>和</p>,这个我们利用split函数就可以搞定
2)由于有多个地方有<br/>这个换行符,我们利用replace方法把换行符替换为“”空字符
3)利用方法把"能够正常显示为英文的双引号。
package com.testlink.tests;
import java.util.Arrays;
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 GetSteps {
//创建一个testlinkapi对象
TestLinkAPI api;
@Test
public void getSetps() {
api = TestlinkUtil.connect();
TestCase[] cases = TestlinkUtil.getTestCasesForSuite(api, "API_Automation");
List<TestCase> list = Arrays.asList(cases);
List<TestCaseStep> steps = null;
for (TestCase testCase : list) {
//拿到单个测试用例对象,如果不用这个方法,我暂时不知道其他方法可以获取用例下的步骤和期待结果
TestCase tc = api.getTestCaseByExternalId(testCase.getFullExternalId(), null);
steps = tc.getSteps();
//遍历测试action步骤
for (TestCaseStep testCaseStep : steps) {
//System.out.println(testCaseStep.getActions());
String originalStr = testCaseStep.getActions();
//先切除<p>和</p>标记
String s1 = originalStr.split("<p>")[1].split("</p>")[0];
//System.out.println(s1); //debug用打印
//然后把<br />全部替换为空
String s2 = s1.replaceAll("<br />", "");
//System.out.println(s2); //debug用打印
//把&quto改成正常显示双引号
String s3 = StringEscapeUtils.unescapeHtml4(s2);
System.out.println(s3); //debug用打印
}
}
}
}
运行结果:
这些看起来很舒服对不对。完全和testlink里面显示的数据一样。下面,我们把获取测试步骤的方法给封装起来,这次注意我封装参数的TestCase对象,并不是之前的project name参数,直接看最后一个方法。
package com.qa.util;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import org.apache.commons.lang3.StringEscapeUtils;
import com.qa.base.TestBase;
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.TestPlan;
import br.eti.kinoshita.testlinkjavaapi.model.TestProject;
import br.eti.kinoshita.testlinkjavaapi.model.TestSuite;
public class TestlinkUtil {
/**
* 连接testlink方法
*/
public static TestLinkAPI connect() {
TestBase base = new TestBase();
String url = base.prop.getProperty("TestLinkUrl");
String devKey = base.prop.getProperty("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;
}
/**
* 根据项目名称字符串得到项目id,方便下一个方法(得到项目测试计划)调用
* @param api,连接对象,几乎这个类大部分方法都需要这个对象
* @param projectName
* @return, 返回项目ID号
*/
public static int getProjectIdByName(TestLinkAPI api, String projectName) {
//根据项目名称得到这个项目
TestProject project = api.getTestProjectByName(projectName);
int projectId = project.getId();
return projectId;
}
/**
* 根据项目id得到项目下所有的测试计划
* @param api
* @param ProjectId
* @return,测试计划数组对象
*/
public static TestPlan[] getAllPlanUnderProject(TestLinkAPI api, int ProjectId) {
TestPlan[] plans = api.getProjectTestPlans(ProjectId);
return plans;
}
/**
* 根据项目名称获取项目下顶层的测试套件数组对象
* @param api
* @param projectName
* @return
*/
public static TestSuite[] getFirstLeverTestSuite(TestLinkAPI api, String projectName) {
int projectId = TestlinkUtil.getProjectIdByName(api, projectName);
TestSuite[] suites = api.getFirstLevelTestSuitesForTestProject(projectId);
return suites;
}
/**
* 得到测试用例集合
* @param api
* @param projectName
* @return
*/
public static TestCase[] getTestCasesForSuite(TestLinkAPI api, String projectName) {
TestSuite[] suites = TestlinkUtil.getFirstLeverTestSuite(api, projectName);
TestCase[] cases = null;
//遍历数组,拿到每个测试套件下测试用例
for (TestSuite testSuite : suites) {
//获取测试用例数组,注意参数写法
cases = api.getTestCasesForTestSuite(testSuite.getId(), true, null);
}
return cases;
}
/**
* 根据测试用例对象,得到测试步骤中的action
* @param api
* @param tCase
* @return
*/
public static String getTestCaseAction(TestLinkAPI api,TestCase tCase) {
TestCase tc = api.getTestCaseByExternalId(tCase.getFullExternalId(), null);
List<TestCaseStep> tcs = tc.getSteps();
String action = null;
//遍历steps集合
for (TestCaseStep testCaseStep : tcs) {
//开始数据清洗
String originalStr = testCaseStep.getActions();
//先切除<p>和</p>标记
String s1 = originalStr.split("<p>")[1].split("</p>")[0];
//System.out.println(s1); //debug用打印
//然后把<br />全部替换为空
String s2 = s1.replaceAll("<br />", "");
//System.out.println(s2); //debug用打印
//把&quto改成正常显示双引号
action = StringEscapeUtils.unescapeHtml4(s2);
}
return action;
}
}
写一个类来测试这个方法。类名称请看下面代码和类放什么包下。
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 GetAction {
//创建一个testlinkapi对象
TestLinkAPI api;
@Test
public void getActionString() {
api = TestlinkUtil.connect();
TestCase[] tCases = TestlinkUtil.getTestCasesForSuite(api, "API_Automation");
for (TestCase testCase : tCases) {
String action = TestlinkUtil.getTestCaseAction(api, testCase);
System.out.println(action);
}
}
}
运行结果:
[RemoteTestNG] detected TestNG version 6.14.3
2018-06-02 23:14:26 189 INFO TestBase:28 - 正在读取配置文件...
Hello!
{
"method":"get",
"url":"/api/users?page=2"
}
{
"method":"post",
"param":[{"name":"morpheus","job":"leader"}],
"url":"/api/users"
}
PASSED: getActionString
下一篇继续介绍围绕得到的测试步骤中的action如何进行获取接口请求方法和接口请求url和json参数内容,以及测试期待结果如何获取。