Postman:Postman高级功能:预请求脚本与测试脚本编写
预请求脚本基础
预请求脚本的作用与应用场景
预请求脚本允许在发送请求之前执行自定义的JavaScript代码。这在以下场景中特别有用:
- 动态设置请求参数:根据不同的测试条件或环境动态生成请求参数。
- 执行API调用:在发送主请求前,先调用另一个API获取必要的数据。
- 环境变量与全局变量设置:预请求脚本可以设置或更新环境变量和全局变量,用于后续请求或测试中使用。
编写预请求脚本的步骤
- 打开Postman:确保你已经安装并打开了Postman应用。
- 选择请求类型:在Postman中创建一个新的请求,选择GET、POST或其他HTTP方法。
- 启用预请求脚本:在请求的设置中,找到“Pre-request Script”选项卡并启用它。
- 编写脚本:在预请求脚本编辑器中,使用JavaScript编写你的脚本。确保脚本逻辑清晰,变量命名规范。
使用pm.sendRequest进行API调用
在预请求脚本中,
pm.sendRequest
函数可以用来调用另一个API。下面是一个示例脚本,它调用一个外部API来获取当前的天气信息,并将结果存储在环境变量中。
// 调用外部API获取天气信息const url ="https://api.openweathermap.org/data/2.5/weather";const params ={q:"New York",appid:"YOUR_API_KEY"};const options ={url: url +'?'+ Object.keys(params).map(key=> key +'='+ params[key]).join('&'),method:"GET"};
pm.sendRequest(options,function(err, res){if(err){
console.error("Error occurred: "+ err);}else{const weatherData = res.json();// 将天气数据存储在环境变量中
pm.environment.set("weatherData",JSON.stringify(weatherData));}});
代码解释
- API调用:使用
pm.sendRequest
函数,传入请求的URL和方法。 - 参数设置:通过
params
对象动态构建查询字符串。 - 错误处理:检查API调用是否成功,如果失败,输出错误信息。
- 结果存储:将API返回的天气数据存储为环境变量,以便在后续请求中使用。
设置环境变量与全局变量
预请求脚本中,可以使用
pm.environment.set
和
pm.globals.set
来设置环境变量和全局变量。下面的示例展示了如何在预请求脚本中设置一个环境变量。
// 设置环境变量
pm.environment.set("exampleVariable","Hello, World!");// 设置全局变量
pm.globals.set("globalVariable","This is a global variable.");
代码解释
- 环境变量设置:
pm.environment.set
用于设置环境变量,这些变量在当前会话中可用。 - 全局变量设置:
pm.globals.set
用于设置全局变量,这些变量在所有会话中都可用。
通过预请求脚本,你可以灵活地控制请求的发送前的准备工作,包括动态参数设置、API调用和变量管理,从而提高测试的效率和准确性。
测试脚本进阶
测试脚本的编写与执行
在Postman中,测试脚本允许你自动化测试流程,确保API响应符合预期。这通过
pm.test
函数实现,该函数可以包含各种断言来检查响应数据。
示例代码
// 使用pm.test进行响应状态码的检查
pm.test("Status code is 200",function(){
pm.response.to.have.status(200);});// 检查响应头
pm.test("Content-Type is application/json",function(){
pm.response.to.have.header("Content-Type","application/json");});// 检查响应体中特定字段的值
pm.test("Body contains correct userId",function(){var jsonData = pm.response.json();
pm.expect(jsonData.userId).to.eql(1);});
解释
- 第一个测试检查响应状态码是否为200。
- 第二个测试确保响应头的
Content-Type
为application/json
。 - 第三个测试验证响应体中
userId
字段的值是否为1。
断言与响应校验
断言是测试脚本的核心,用于验证API响应的各个方面,如状态码、响应头、响应体等。
示例代码
// 检查响应体中是否存在特定的JSON键
pm.test("Body contains 'name' key",function(){
pm.response.to.have.jsonBody("name");});// 检查响应体中特定键的值是否匹配正则表达式
pm.test("Body 'email' matches pattern",function(){var jsonData = pm.response.json();
pm.expect(jsonData.email).to.match(/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/);});
解释
- 第一个测试确保响应体中包含
name
键。 - 第二个测试使用正则表达式来验证
email
字段的格式是否正确。
使用pm.test进行测试脚本编写
pm.test
函数是Postman测试脚本的主要入口点,用于定义测试用例。
示例代码
// 测试响应时间是否小于200ms
pm.test("Response time is less than 200ms",function(){
pm.expect(pm.response.responseTime).to.be.below(200);});// 测试响应体中特定键的值是否为true
pm.test("Body 'isActive' is true",function(){var jsonData = pm.response.json();
pm.expect(jsonData.isActive).to.be.true;});
解释
- 第一个测试检查响应时间是否低于200毫秒。
- 第二个测试验证
isActive
字段的值是否为布尔值true
。
测试集合与迭代执行
测试集合允许你将多个测试用例组合在一起,以确保API在不同场景下的行为。你可以设置测试集合来迭代执行,以测试API的稳定性和性能。
示例代码
// 创建一个测试集合
pm.test("User details test suite",function(){// 测试状态码
pm.test("Status code is 200",function(){
pm.response.to.have.status(200);});// 测试响应头
pm.test("Content-Type is application/json",function(){
pm.response.to.have.header("Content-Type","application/json");});// 测试响应体
pm.test("Body contains correct userId",function(){var jsonData = pm.response.json();
pm.expect(jsonData.userId).to.eql(1);});});
解释
- 这个测试集合包含了三个测试用例:状态码检查、响应头检查和响应体中
userId
字段的值检查。
测试失败时的处理与调试
当测试失败时,Postman会提供详细的错误信息,帮助你定位问题。你也可以在测试脚本中添加日志语句,以更好地理解API的响应。
示例代码
// 在测试失败时记录响应体
pm.test("Body contains correct userId",function(){var jsonData = pm.response.json();
pm.expect(jsonData.userId).to.eql(1);if(jsonData.userId !==1){
console.log("Response body: ", jsonData);}});
解释
- 如果
userId
字段的值不等于1,脚本将输出响应体的完整内容,帮助调试。
通过上述示例,你可以看到Postman的测试脚本功能如何帮助你自动化API测试,确保API的稳定性和正确性。使用
pm.test
函数和断言,你可以编写复杂的测试用例,检查API响应的各个方面。测试集合则允许你将多个测试用例组合在一起,进行更全面的测试。最后,当测试失败时,通过日志和错误信息,你可以快速定位问题,进行调试和修复。
预请求与测试脚本实战
结合预请求脚本与测试脚本的案例分析
在Postman中,预请求脚本和测试脚本是两个强大的功能,它们可以让你在发送请求前执行一些代码,以及在响应后进行自动化测试。下面,我们将通过一个具体的案例来分析如何结合使用这两个功能。
案例背景
假设我们正在开发一个用户认证系统,需要在每次请求前生成一个基于用户信息的JWT(JSON Web Token)。同时,我们希望在响应后测试JWT是否正确生成,并验证其有效性。
预请求脚本
预请求脚本可以用来生成JWT。我们将使用
pm
对象和
crypto
模块来实现这一功能。
// 预请求脚本
pm.sendRequest({url: pm.environment.get("authUrl"),method:"POST",header:{"Content-Type":"application/json"},body:JSON.stringify({username: pm.environment.get("username"),password: pm.environment.get("password")})},function(err, res){if(!err && res.code ===200){var token = res.json().token;
pm.environment.set("jwtToken", token);}else{
console.error("Failed to get JWT token.");}});
测试脚本
测试脚本用于验证JWT是否正确生成,并检查其有效性。
// 测试脚本
pm.test("JWT token is present in response",function(){var jsonData = pm.response.json();
pm.expect(jsonData.token).to.not.be.null;});
pm.test("JWT token is valid",function(){var jwt =require("jsonwebtoken");var token = pm.environment.get("jwtToken");
jwt.verify(token, pm.environment.get("secretKey"),function(err, decoded){if(err){
pm.test.fail("JWT token is invalid.");}else{
pm.test.pass("JWT token is valid.");}});});
自动化测试流程设计
自动化测试流程设计是确保API稳定性和功能完整性的关键。在Postman中,你可以通过创建测试集合,使用预请求脚本和测试脚本来自动化这一过程。
测试集合设计
- 环境设置:定义环境变量,如
authUrl
、username
、password
和secretKey
。 - 预请求脚本:在请求前执行,用于生成JWT。
- 请求发送:使用生成的JWT进行认证。
- 测试脚本:在响应后执行,验证JWT的有效性。
实现步骤
- 创建环境:在Postman中创建一个环境,设置必要的变量。
- 编写预请求脚本:在请求的“Pre-request Script”部分编写脚本。
- 编写测试脚本:在请求的“Tests”部分编写脚本。
- 运行测试:通过Postman的Runner或Collection Runner来运行整个测试集合。
错误处理与异常捕获
在预请求脚本和测试脚本中,错误处理和异常捕获是必不可少的,以确保测试的健壮性和准确性。
预请求脚本中的错误处理
// 预请求脚本错误处理
pm.sendRequest({// 请求配置},function(err, res){if(err){
console.error("Request failed:", err);// 可以在此处添加失败时的处理逻辑}elseif(res.code !==200){
console.error("Unexpected response code:", res.code);}else{// 成功处理逻辑}});
测试脚本中的异常捕获
// 测试脚本异常捕获
pm.test("JWT token is valid",function(){var jwt =require("jsonwebtoken");var token = pm.environment.get("jwtToken");try{var decoded = jwt.verify(token, pm.environment.get("secretKey"));
pm.test.pass("JWT token is valid.");}catch(e){
pm.test.fail("JWT token is invalid.");}});
性能测试与预请求脚本的优化
性能测试是评估API在高负载下表现的重要手段。预请求脚本的优化可以减少请求的准备时间,从而提高性能测试的效率。
优化预请求脚本
- 减少网络调用:尽量避免在预请求脚本中进行额外的网络请求,如数据查询或外部API调用。
- 缓存结果:如果预请求脚本的结果可以复用,考虑将其缓存到环境变量中,避免重复计算。
- 代码优化:使用高效的算法和数据结构,减少不必要的循环和条件判断。
示例:缓存JWT
// 预请求脚本if(!pm.environment.get("jwtToken")){
pm.sendRequest({// 请求配置},function(err, res){if(!err && res.code ===200){var token = res.json().token;
pm.environment.set("jwtToken", token);}else{
console.error("Failed to get JWT token.");}});}
测试报告的生成与分析
Postman允许你生成详细的测试报告,这对于跟踪测试结果和分析API性能至关重要。
生成测试报告
- 使用Collection Runner:选择一个测试集合,使用Collection Runner来运行测试,并选择“Export”来生成报告。
- Newman工具:Newman是一个Postman的命令行集合运行器,可以用于CI/CD流程中,生成测试报告。
分析测试报告
测试报告通常包含以下信息:
- 测试结果:每个测试的通过或失败状态。
- 响应时间:每个请求的响应时间。
- 错误信息:测试失败时的详细错误信息。
通过分析这些信息,你可以识别API中的性能瓶颈,以及测试中出现的任何问题,从而进行相应的优化和修复。
通过上述案例分析、流程设计、错误处理、性能优化和测试报告的生成与分析,你可以在Postman中有效地使用预请求脚本和测试脚本来自动化API测试,确保API的稳定性和功能完整性。
版权归原作者 kkchenjj 所有, 如有侵权,请联系我们删除。