欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-18 12:15:52
...

        前面一篇我们学习了如何拿到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,请看下图

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

上面是根据这个红圈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参数以及期待结果中的状态码。