Java+Testlink实现接口自动化测试-7-获取用例期待结果和步骤中的Json信息

        前面一篇我们学习了如何拿到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参数以及期待结果中的状态码。





猜你喜欢

转载自blog.csdn.net/u011541946/article/details/80554663
今日推荐