这一篇,介绍如何获取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参数内容,以及测试期待结果如何获取。