Java+Testlink实现接口自动化测试-6-获取测试用例步骤

       这一篇,介绍如何获取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标记和&quot。数据清洗,我们大致步骤是这样的:

1)去除段落<p>和</p>,这个我们利用split函数就可以搞定

2)由于有多个地方有<br/>这个换行符,我们利用replace方法把换行符替换为“”空字符

3)利用方法把&quot能够正常显示为英文的双引号。

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

猜你喜欢

转载自blog.csdn.net/u011541946/article/details/80551770