接口测试:在MeterSphere 中实现单向认证经验分享
我们测试的多个被测系统都是单向认证的,最近在用MeterSphere做接口测试时,发现无论用Python脚本和beanshell脚本实现关闭SSL认证完成登录,有些系统是可以的,有些系统一直提示SSL认证错误。尝试很多方式后发现:使用JavaScript脚本完成登录,登录每个单向认识的系统都没有问题。如果大家在测试中也有这样的问题,可以试试用JavaScript完成单向认证系统的登录。
下面分享Python、beanshell关闭ssl登录脚本,以及JavaScript脚本完成单向认证系统登录脚本。
1.Python脚本关闭ssl实现登录
1.1 代码
import sys
import requests
import json
sys.path.append("/opt/metersphere/data/python/lib/python2.7/site-packages")
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 发起请求时忽略证书验证警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
#创建Session实例对象,然后保持状态
s = requests.session()
#设置请求头格式
headsers = {"Content-Type":"application/json"}
#设置登录接口请求参数
payload = { "username": "登录用户名",
"password": "登录密码"
}
res = s.post("https://你测试的环境地址",data=json.dumps(payload),verify=False,headers=headsers)
log.info(res.text)
1.2 MeterSphere前置Python脚本执行测试
注意事项
在 MeterSphere 前后置脚本中引用 Python 第三方库相关配置请查看下面官方手册:https://kb.fit2cloud.com/?p=105
2.Beanshell脚本关闭ssl实现登录
2.1 使用MeterSphere自动生成代码能力
在前置脚本中,选择“导入API”,直接导入登录接口,然后根据需求修改如何提取响应体即可。我这里使用的是:项目管理>>自定义代码片段:来测试的。
2.2 手动添加关闭代码
如果第一个方法执行不行,还是提示ssl错误,需要在代码中手动关闭。代码查考如下(不唯一,实现方式很多种)
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
// 创建HttpClient实例
HttpClient httpClient = HttpClients.createDefault();
log.info("创建HttpClient实例");
// 创建HttpPost请求
HttpPost httpPost = new HttpPost("https://被测地址");
log.info("创建HttpPost请求");
// 关闭SSL认证
HttpClientBuilder builder = HttpClientBuilder.create();
builder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE);
builder.setSSLContext(SSLContexts.custom().loadTrustMaterial(new TrustSelfSignedStrategy()).build());
httpClient = builder.build();
log.info("关闭SSL认证");
// 设置请求参数
httpPost.setEntity("{\n \"password\": \"密码\",\n \"authenticate\": \"变量值\",\n \"username\": \"用户名\"\n}");
log.info("设置请求参数");
// 发送请求并获取响应
HttpResponse response = httpClient.execute(httpPost);
log.info("发送请求并获取响应 == "+response.getStatusLine().getStatusCode());
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
//String content = EntityUtils.toString(response.getEntity(), "UTF-8");
// 读取响应内容
HttpEntity entity = response.getEntity();
String responseBody = EntityUtils.toString(entity, "UTF-8");
log.info("登录响应体 字符串 == "+content);
}
2.3MeterSphere前置Beanshell脚本执行测试
注意事项
需要在MeterSphere的文件管理地方上传依赖包
3.JavaScript脚本实现单向认证系统登录
3.1 代码
var urlStr = "https://你的测试地址"; // 请求地址
var requestMethod = "GET"; // 请求类型
var parameterData = ""; // 请求参数
var url = new java.net.URL(urlStr);
var conn = url.openConnection();
conn.setRequestMethod(requestMethod);
conn.setDoOutput(true);
conn.connect();
var res = "";
var rspCode = conn.getResponseCode();
if (rspCode == 200) {
var ipt = conn.getInputStream();
var reader = new java.io.BufferedReader(new java.io.InputStreamReader(ipt, "UTF-8"));
var lines;
while((lines = reader.readLine()) !== null) {
res += lines;
}
}
log.info(res);
var json=JSON.parse(res);
// var obj = json.data;
// log.info(obj)
3.2MeterSphere前置JavaScript脚本执行测试
总结
1、beanshell和Python脚本在关闭ssl单向认证时,都需要上传额外的依赖包,并且对有些环境测试会提示ssl没有关闭
2、根据测试结果,如果出现上述情况,建议都使用JavaScript脚本来实现