0


Postman:Postman API测试:Postman预请求脚本编写

Postman:Postman API测试:Postman预请求脚本编写

在这里插入图片描述

Postman基础介绍

Postman软件概述

Postman是一款强大的API开发工具,它允许开发者构建、测试、修改和发布API。Postman不仅简化了API测试的过程,还提供了丰富的功能,如环境变量、集合、预请求脚本和测试脚本,使得API的开发和维护变得更加高效和便捷。

主要功能

  • 构建请求:Postman支持多种HTTP请求方法,包括GET、POST、PUT、DELETE等,用户可以轻松构建复杂的HTTP请求。
  • 测试API:内置的测试功能可以自动验证API响应,确保API按预期工作。
  • 预请求脚本:在发送请求前执行的脚本,可以动态修改请求参数,如生成随机数、设置请求头等。
  • 环境变量:允许用户在不同环境中(如开发、测试、生产)使用相同的集合,通过切换环境变量来调整请求参数。
  • 集合:用于组织和管理多个相关请求,方便进行批量测试或分享给团队成员。
  • 监控和集成:Postman可以与各种工具和服务集成,如GitHub、Jenkins等,支持持续集成和监控API性能。

API测试的重要性

API(Application Programming Interface)测试是软件测试中的一种类型,主要针对API的功能、性能、安全性和兼容性进行验证。API测试的重要性在于:

  • 确保功能正确性:API测试可以验证API是否按预期返回正确的数据和状态码。
  • 提高测试效率:与UI测试相比,API测试通常更快,因为它直接与后端交互,不需要等待页面加载。
  • 易于自动化:API测试易于自动化,可以频繁运行,确保每次代码更改后API仍然正常工作。
  • 早期发现缺陷:API测试可以在UI开发之前进行,帮助早期发现和修复缺陷,减少后期修复成本。
  • 支持集成测试:API测试可以作为集成测试的一部分,验证不同系统或服务之间的交互是否正常。

Postman在API测试中的角色

Postman在API测试中扮演着至关重要的角色,它不仅提供了构建和发送HTTP请求的工具,还集成了测试脚本、环境管理、数据生成等功能,使得API测试变得更加全面和高效。

预请求脚本编写

预请求脚本是在发送API请求前执行的JavaScript代码,可以用来动态修改请求参数、设置环境变量、生成随机数据等。下面是一个简单的预请求脚本示例,用于在发送请求前生成一个随机的用户ID:

// 生成一个随机的用户IDvar randomUserId = Math.floor(Math.random()*1000)+1;
pm.environment.set("userId", randomUserId);

在这个示例中,我们使用了JavaScript的

Math.random()

函数来生成一个0到1之间的随机数,然后将其乘以1000并向下取整,得到一个0到999之间的整数。最后,我们通过

pm.environment.set()

函数将这个随机数设置为环境变量

userId

,这样在发送请求时,就可以使用这个动态生成的用户ID了。

测试脚本

测试脚本是在收到API响应后执行的JavaScript代码,用于验证API的响应是否符合预期。下面是一个测试脚本示例,用于检查API响应的状态码是否为200,并验证响应体中是否包含特定的字符串:

// 检查响应状态码
pm.test("Status code is 200",function(){
    pm.response.to.have.status(200);});// 验证响应体中是否包含特定字符串
pm.test("Response contains 'Hello, World!'",function(){
    pm.response.to.have.body("Hello, World!");});

在这个示例中,我们使用了Postman内置的

pm.test()

函数来定义测试用例。第一个测试用例检查响应状态码是否为200,第二个测试用例则验证响应体中是否包含字符串“Hello, World!”。通过这些测试脚本,可以确保API的响应符合预期,从而提高API测试的准确性和可靠性。

环境变量

环境变量是Postman中用于存储和管理变量的一种机制,可以用来区分不同的测试环境,如开发环境、测试环境和生产环境。下面是一个环境变量的使用示例,用于在不同的环境中切换API的URL:

// 根据环境变量设置API URLvar url = pm.environment.get("apiUrl");
pm.sendRequest(url,function(err, res){// 处理响应});

在这个示例中,我们使用

pm.environment.get()

函数来获取环境变量

apiUrl

的值,然后将其设置为API的URL。这样,在不同的环境中,只需要修改环境变量

apiUrl

的值,就可以自动切换API的URL,而无需修改请求本身,大大提高了API测试的灵活性和效率。

集合

集合是Postman中用于组织和管理多个相关请求的一种方式,可以方便地进行批量测试或分享给团队成员。下面是一个集合的使用示例,用于组织和管理一个用户登录和获取用户信息的API测试:

- **登录API测试**
  - 请求方法:POST
  - 请求URL:https://api.example.com/login
  - 请求参数:username, password
  - 预请求脚本:设置环境变量`token`为登录后返回的token
  - 测试脚本:验证状态码为200,响应体中包含`token`

- **获取用户信息API测试**
  - 请求方法:GET
  - 请求URL:https://api.example.com/user
  - 请求头:Authorization: Bearer {{token}}
  - 测试脚本:验证状态码为200,响应体中包含`username`和`email`

在这个示例中,我们创建了一个包含两个请求的集合,第一个请求用于用户登录,第二个请求用于获取用户信息。在登录请求中,我们使用预请求脚本来设置环境变量

token

,这样在获取用户信息的请求中,就可以使用这个

token

来设置请求头,实现API的鉴权。通过这种方式,可以将多个相关请求组织在一起,形成一个完整的API测试流程,提高API测试的效率和准确性。

总结

Postman是一款功能强大的API开发和测试工具,它提供了预请求脚本、测试脚本、环境变量和集合等功能,使得API测试变得更加全面和高效。通过合理使用这些功能,可以构建出灵活、可重复和自动化的API测试流程,从而提高API的开发和维护效率,确保API的稳定性和可靠性。

预请求脚本概念与作用

什么是预请求脚本

预请求脚本是Postman提供的一种功能,允许在发送请求之前执行JavaScript代码。这使得测试人员和开发人员能够在请求发送到服务器之前,动态地修改请求的任何部分,包括URL、headers、body等。预请求脚本的使用极大地增强了Postman的灵活性和功能,特别是在处理复杂的API测试场景时。

预请求脚本的用途

预请求脚本可以用于多种场景,包括但不限于:

  • 动态生成请求参数:例如,使用当前时间戳作为请求的一部分,或者基于其他请求的结果生成参数。
  • 设置请求头:可以动态设置或修改请求头,如添加认证信息或设置Content-Type。
  • 修改请求体:在发送请求前,根据需要修改请求体中的数据。
  • 执行HTTP请求:预请求脚本中可以执行额外的HTTP请求,例如获取API密钥或刷新令牌。

预请求脚本与测试流程的结合

预请求脚本在API测试流程中扮演着关键角色,它可以在测试执行的早期阶段进行数据准备或环境设置,确保每个请求在正确的上下文中被发送。例如,如果API需要一个特定的认证令牌,预请求脚本可以负责在每次测试运行前刷新这个令牌,从而避免了手动更新或硬编码令牌的需要。

示例:动态生成请求参数

假设我们正在测试一个API,该API需要一个时间戳作为查询参数。我们可以使用预请求脚本来动态生成这个时间戳。

// 生成当前时间戳var timestamp =newDate().getTime();// 将时间戳添加到请求的URL中
pm.request.url.addQueryParams({"timestamp": timestamp });

示例:设置请求头

如果API需要一个特定的认证头,例如一个JWT令牌,我们可以使用预请求脚本来设置这个头。

// 假设我们已经有一个JWT令牌存储在Postman的环境变量中var jwtToken = pm.environment.get("JWT_TOKEN");// 设置请求头
pm.request.headers.add({key:"Authorization",value:"Bearer "+ jwtToken,type:"text"});

示例:修改请求体

在某些情况下,我们可能需要在发送请求前修改请求体中的数据。例如,如果请求体是一个JSON对象,我们可能需要在每次测试运行时更新其中的某个字段。

// 假设请求体是一个JSON对象,存储在pm.request.body中var requestBody = pm.request.body;// 将请求体转换为JSON对象var requestBodyJson =JSON.parse(requestBody);// 修改JSON对象中的某个字段
requestBodyJson.user.id =12345;// 将修改后的JSON对象转换回字符串,并设置为请求体
pm.request.body =JSON.stringify(requestBodyJson);

示例:执行HTTP请求

预请求脚本中也可以执行HTTP请求,例如,我们可能需要在发送主请求前,先从另一个API获取一些数据。

// 执行一个HTTP GET请求var myRequest ={method:'GET',url:'https://api.example.com/data',headers:{'Content-Type':'application/json'}};

pm.sendRequest(myRequest,function(err, res){if(err){
        console.error(err);}else{// 假设响应中包含一个我们需要的字段var data = res.json();
        pm.environment.set("myData", data.myField);// 将获取的数据添加到请求的URL中
        pm.request.url.addQueryParams({"data": pm.environment.get("myData")});}});

通过这些示例,我们可以看到预请求脚本如何增强Postman的功能,使其能够处理更复杂的API测试需求。预请求脚本的编写和使用,是API测试中一个重要的技能,能够显著提高测试的效率和准确性。

编写预请求脚本

使用Postman内置函数

在Postman中,预请求脚本是在发送请求之前运行的脚本,用于设置请求的环境,如生成动态数据、修改请求头或URL参数。Postman提供了丰富的内置函数,可以帮助你更高效地编写预请求脚本。

生成动态数据

// 使用内置函数生成随机数,用于动态数据const randomId = pm.random.text(10);
pm.environment.set("dynamicId", randomId);

这段脚本使用

pm.random.text(10)

生成一个10位的随机字符串,并将其设置为环境变量

dynamicId

。在请求的URL或参数中,你可以使用

{{dynamicId}}

来引用这个变量,从而实现动态数据的请求。

修改请求头

// 修改请求头
pm.request.headers.add({key:'Authorization',value:'Bearer {{accessToken}}',enabled:true});

这里,我们使用

pm.request.headers.add

函数添加了一个名为

Authorization

的请求头,其值为

Bearer {{accessToken}}

{{accessToken}}

是一个全局变量或环境变量,它在请求发送前被替换为实际的访问令牌。

JavaScript语法基础

预请求脚本是用JavaScript编写的,因此了解一些基本的JavaScript语法是必要的。

变量声明

// 声明变量let message ="Hello, World!";
console.log(message);

在JavaScript中,你可以使用

let

const

var

来声明变量。

let

const

是ES6引入的,

let

用于声明可重新赋值的变量,而

const

用于声明常量。

函数定义

// 定义函数functiongreet(name){
  console.log("Hello, "+ name +"!");}// 调用函数greet("Postman");

函数是JavaScript中的重要组成部分,可以使用

function

关键字来定义函数。函数可以接受参数,并在函数体中使用这些参数执行特定的操作。

设置环境变量和全局变量

环境变量和全局变量在Postman中用于存储和重用数据,预请求脚本可以用来设置这些变量。

环境变量

// 设置环境变量
pm.environment.set("myVariable","myValue");// 使用环境变量
console.log(pm.environment.get("myVariable"));

环境变量是特定于会话的,每次会话开始时,你可以使用

pm.environment.set

来设置环境变量。在脚本中,你可以使用

pm.environment.get

来获取环境变量的值。

全局变量

// 设置全局变量
pm.globals.set("myGlobalVariable","myGlobalValue");// 使用全局变量
console.log(pm.globals.get("myGlobalVariable"));

全局变量则在整个Postman应用程序中都是可用的,它们可以在任何地方被设置和访问。使用

pm.globals.set

pm.globals.get

来操作全局变量。

示例:使用环境变量和全局变量进行预请求处理

假设你正在测试一个需要用户ID和访问令牌的API,你可以使用预请求脚本来动态设置这些值。

// 从全局变量中获取访问令牌const accessToken = pm.globals.get("accessToken");// 设置环境变量中的用户ID
pm.environment.set("userId","12345");// 修改请求头,使用访问令牌
pm.request.headers.add({key:'Authorization',value:'Bearer '+ accessToken,enabled:true});// 修改请求URL,使用用户ID
pm.request.url.query.add({key:'userId',value: pm.environment.get("userId")});

在这个例子中,我们首先从全局变量中获取访问令牌,然后设置环境变量中的用户ID。接着,我们修改请求头,将访问令牌添加到

Authorization

头中。最后,我们修改请求URL,添加一个

userId

参数,其值为环境变量中的用户ID。

通过这种方式,预请求脚本可以确保每次测试时都使用正确的动态数据,提高API测试的效率和准确性。

预请求脚本示例

发送预请求

在Postman中,预请求脚本是在主请求发送之前执行的脚本,主要用于设置请求的环境、执行一些计算或发送预请求以获取必要的数据。下面是一个使用

pm.sendRequest

函数发送预请求的示例:

// 发送预请求获取token
pm.sendRequest({url:'https://example.com/api/token',method:'POST',header:{'Content-Type':'application/json',},body:{mode:'raw',raw:JSON.stringify({username: pm.environment.get("username"),password: pm.environment.get("password")})}},function(err, res){if(err){
        console.error("预请求错误: ", err);}else{const token = res.json().token;
        pm.environment.set("token", token);
        pm.request.headers.add({key:"Authorization",value:`Bearer ${token}`});}});

解释

  1. **pm.sendRequest**:此函数用于发送预请求。它接受一个对象参数,其中包含URL、方法、头和体等请求配置。
  2. 请求配置:在这个例子中,我们向https://example.com/api/token发送一个POST请求,请求体包含用户名和密码,这些值从Postman环境变量中获取。
  3. 处理响应:预请求的响应通过回调函数处理。如果请求成功,从响应中提取token并存储到环境变量中,然后将其添加到主请求的Authorization头中。

处理响应数据

预请求脚本也可以用来处理预请求的响应数据,例如,解析JSON响应并使用其结果来构建后续请求。下面是一个示例:

// 处理预请求的JSON响应
pm.sendRequest({url:'https://example.com/api/data',method:'GET'},function(err, res){if(err){
        console.error("预请求错误: ", err);}else{const data = res.json();// 假设响应数据包含一个名为'userId'的字段
        pm.environment.set("userId", data.userId);// 使用userId来构建主请求的URL
        pm.request.url = pm.request.url.replace(/{{userId}}/, data.userId);}});

解释

  1. **pm.sendRequest**:发送一个GET请求到https://example.com/api/data
  2. 处理响应:如果请求成功,解析JSON响应并从其中提取userId,然后将其存储到环境变量中。
  3. 动态URL构建:使用提取的userId替换主请求URL中的占位符{{userId}},从而构建一个包含实际用户ID的请求URL。

错误处理与调试

预请求脚本中的错误处理和调试是确保API测试顺利进行的关键。下面是一个示例,展示了如何在预请求脚本中处理错误,并使用

console.log

进行调试:

// 错误处理与调试
pm.sendRequest({url:'https://example.com/api/error',method:'GET'},function(err, res){if(err){
        console.error("预请求错误: ", err);// 在发生错误时,可以设置一个环境变量来标记错误状态
        pm.environment.set("errorOccurred",true);}else{const data = res.json();
        console.log("预请求响应数据: ", data);// 检查响应状态码,如果非200,则标记错误if(res.code !==200){
            console.error("预请求响应状态码非200: ", res.code);
            pm.environment.set("errorOccurred",true);}}});

解释

  1. 错误处理:如果预请求遇到错误,使用console.error打印错误信息,并设置环境变量errorOccurredtrue,以标记错误状态。
  2. 响应状态检查:即使预请求没有抛出错误,也应检查响应状态码。如果状态码不是200,同样设置errorOccurredtrue,并打印错误信息。
  3. 调试信息:使用console.log打印预请求的响应数据,这对于调试和理解预请求的结果非常有帮助。

通过以上示例,我们可以看到预请求脚本在Postman中的强大功能,它不仅可以帮助我们发送预请求、处理响应数据,还可以进行错误处理和调试,从而确保API测试的准确性和效率。

高级预请求脚本技巧

循环与条件语句的使用

在Postman预请求脚本中,循环和条件语句是强大的工具,用于在发送请求前执行复杂的逻辑。这可以包括动态生成请求参数、基于某些条件修改请求头,或者执行一系列的请求来获取必要的数据。

循环语句

for

循环

for

循环允许你多次执行一段代码,通常用于处理数组或集合中的元素。

// 假设我们有一个用户列表,需要为每个用户生成一个唯一的tokenconst users =[{id:1,name:"Alice"},{id:2,name:"Bob"},{id:3,name:"Charlie"}];for(let i =0; i < users.length; i++){const user = users[i];const token = pm.generateToken(user.id);
  pm.environment.set(`user${user.id}Token`, token);}

在这个例子中,我们遍历

users

数组,为每个用户生成一个token,并将其存储在Postman的环境变量中。

while

循环

while

循环在给定的条件为真时重复执行代码块。

// 假设我们需要从一个API获取所有分页的数据let page =1;let hasMoreData =true;while(hasMoreData){const response = pm.sendRequest(`https://api.example.com/data?page=${page}`);const data = response.json();
  data.forEach(item=>{// 处理每个item});
  hasMoreData = data.length >0;
  page++;}

这里,我们使用

while

循环来处理分页数据,直到没有更多数据为止。

条件语句

if

语句

if

语句允许你根据条件执行不同的代码块。

// 假设我们需要根据用户角色发送不同的请求const userRole = pm.environment.get("userRole");if(userRole ==="admin"){
  pm.sendRequest("https://api.example.com/admin");}elseif(userRole ==="user"){
  pm.sendRequest("https://api.example.com/user");}else{
  console.log("未知角色");}

在这个例子中,我们根据用户角色发送不同的请求。

函数的定义与调用

在预请求脚本中定义函数可以提高代码的可读性和可重用性。

函数定义

// 定义一个函数来生成随机数functiongenerateRandomNumber(min, max){return Math.floor(Math.random()*(max - min +1))+ min;}

函数调用

// 调用函数来生成一个随机数,并将其作为请求参数const randomNumber =generateRandomNumber(1,100);
pm.sendRequest(`https://api.example.com/data?random=${randomNumber}`);

通过定义和调用函数,我们可以避免重复代码,使脚本更加模块化和易于维护。

异步请求处理

在预请求脚本中处理异步请求是必要的,尤其是在需要从另一个API获取数据来构建请求时。

使用

async/await
// 异步获取数据并设置请求参数asyncfunctionfetchAndSetData(){const response =await pm.sendRequest("https://api.example.com/data");const data = response.json();
  pm.environment.set("dataId", data.id);}fetchAndSetData();

在这个例子中,我们使用

async/await

来异步获取数据,并将其存储在环境变量中,以便在后续的请求中使用。

使用Promise

// 使用Promise处理异步请求
pm.sendRequest("https://api.example.com/data").then(response=>{const data = response.json();
    pm.environment.set("dataId", data.id);}).catch(error=>{
    console.error("请求失败:", error);});

通过使用Promise,我们可以处理异步操作的错误,并确保在数据可用时再执行后续操作。

总结

通过使用循环、条件语句、函数定义和异步请求处理,你可以在Postman预请求脚本中实现更复杂和动态的测试场景。这不仅可以提高测试的效率,还可以确保测试的准确性和可靠性。在实际应用中,根据你的测试需求灵活运用这些技巧,可以大大提升API测试的质量和覆盖范围。

预请求脚本最佳实践

代码复用与模块化

原理

预请求脚本在Postman中用于在发送请求之前执行自定义操作。通过代码复用和模块化,可以提高脚本的可维护性和效率,避免重复编写相同的代码逻辑。在Postman中,可以利用

pm.globals

pm.environment

来存储全局变量,以及使用

require

来引入外部模块,实现代码的复用和模块化。

内容

代码复用

在预请求脚本中,如果有一些通用的函数或设置,可以将其存储为全局变量或函数,以便在多个请求中重复使用。例如,可以创建一个函数来生成随机数,用于测试API的输入参数。

// 生成随机数的函数functiongenerateRandomNumber(min, max){return Math.floor(Math.random()*(max - min +1)+ min);}// 将函数存储为全局变量
pm.globals.set("generateRandomNumber", generateRandomNumber);

在其他预请求脚本中,可以通过

pm.globals.get

来访问这个函数:

// 使用全局函数生成随机数const randomNumber = pm.globals.get("generateRandomNumber")(1,100);
console.log(randomNumber);
模块化

通过模块化,可以将预请求脚本拆分成多个独立的文件,每个文件负责一个特定的功能。例如,可以创建一个模块来处理日期和时间的格式化。

// dateUtils.js
module.exports ={formatDateTime:function(date){return date.toLocaleString();}};

然后在预请求脚本中引入这个模块:

// 引入dateUtils模块const dateUtils =require('./dateUtils');// 使用模块中的函数const formattedDate = dateUtils.formatDateTime(newDate());
console.log(formattedDate);

示例

假设我们正在测试一个需要用户ID和当前时间戳作为参数的API。我们可以创建一个模块来处理这些通用逻辑,然后在预请求脚本中使用。

// userUtils.js
module.exports ={generateUserID:function(){return Math.floor(Math.random()*10000);},getCurrentTimestamp:function(){return Date.now();}};

在预请求脚本中:

// 引入userUtils模块const userUtils =require('./userUtils');// 生成用户ID和时间戳const userID = userUtils.generateUserID();const timestamp = userUtils.getCurrentTimestamp();// 设置请求参数
pm.request.url.query.add({key:"userID",value: userID });
pm.request.url.query.add({key:"timestamp",value: timestamp });

性能优化

原理

性能优化是预请求脚本编写中的关键环节,它涉及到减少不必要的计算,避免阻塞操作,以及合理使用异步处理。优化预请求脚本可以确保API测试的快速执行,避免因脚本执行时间过长而影响整体测试效率。

内容

减少不必要的计算

在预请求脚本中,应避免重复计算或处理相同的数据。例如,如果一个请求需要使用到另一个请求的结果,可以将结果存储为全局变量,而不是在每个请求中重新计算。

// 存储请求结果
pm.response.json().then(data=>{
    pm.globals.set("lastRequestResult", data);});
避免阻塞操作

预请求脚本应尽量避免使用阻塞的I/O操作,如文件读写。如果必须使用,应考虑使用异步方法,如

fs.promises

合理使用异步处理

预请求脚本可以使用异步处理来提高性能。例如,使用

Promise

async/await

来处理异步操作,确保脚本的执行不会阻塞Postman的主线程。

// 异步获取数据asyncfunctionfetchData(){const response =awaitfetch('https://api.example.com/data');const data =await response.json();return data;}// 在预请求脚本中使用异步函数fetchData().then(data=>{
    pm.request.body.json = data;});

示例

假设我们需要从一个外部API获取数据,然后将这些数据作为参数发送到另一个API进行测试。我们可以使用异步处理来优化这个过程。

// 异步获取外部API数据asyncfunctionfetchExternalData(){const response =awaitfetch('https://api.example.com/external');const data =await response.json();return data;}// 在预请求脚本中使用异步函数fetchExternalData().then(data=>{
    pm.request.body.json = data;});

安全性考虑

原理

在编写预请求脚本时,安全性是一个不可忽视的方面。这包括处理敏感数据,如API密钥或用户凭据,以及确保脚本不会执行恶意操作,如修改Postman的配置或发送未授权的请求。

内容

处理敏感数据

应避免在预请求脚本中硬编码敏感数据。可以使用Postman的环境变量或全局变量来存储这些数据,然后在脚本中通过

pm.environment.get

pm.globals.get

来访问。

// 从环境变量中获取API密钥const apiKey = pm.environment.get("API_KEY");
pm.request.headers.add({key:"Authorization",value:`Bearer ${apiKey}`});
避免执行恶意操作

预请求脚本应仅用于准备请求,不应执行任何可能对系统或数据造成损害的操作。例如,不应使用脚本来修改Postman的配置或发送额外的请求。

示例

假设我们正在测试一个需要API密钥进行身份验证的API。我们可以将API密钥存储在Postman的环境变量中,然后在预请求脚本中安全地访问它。

// 从环境变量中获取API密钥const apiKey = pm.environment.get("API_KEY");// 设置请求头
pm.request.headers.add({key:"Authorization",value:`Bearer ${apiKey}`});

通过遵循这些最佳实践,可以编写出高效、安全且易于维护的预请求脚本,从而提高API测试的质量和效率。

预请求脚本与测试自动化

集成CI/CD流程

在现代软件开发中,持续集成(CI)和持续部署(CD)已成为确保代码质量和快速迭代的关键实践。Postman预请求脚本可以在此流程中发挥重要作用,通过在API请求前执行特定任务,如设置环境变量、生成随机数据或清理数据库,来自动化测试过程,提高测试效率和准确性。

示例:设置环境变量

假设我们正在开发一个API,需要根据环境(如开发、测试或生产)来调整请求的URL。我们可以使用预请求脚本动态设置这些变量,以确保在不同的CI/CD环境中使用正确的URL。

// 设置环境变量
pm.environment.set("API_URL","https://api.example.com");// 根据当前环境调整URLif(pm.environment.get("ENV")==="test"){
    pm.environment.set("API_URL","https://test-api.example.com");}elseif(pm.environment.get("ENV")==="prod"){
    pm.environment.set("API_URL","https://prod-api.example.com");}

示例:生成随机数据

在测试API时,我们可能需要发送随机数据以确保API能够正确处理各种输入。预请求脚本可以生成这些数据,例如,创建一个随机的用户ID。

// 生成随机用户IDvar randomUserID = Math.floor(Math.random()*10000)+1;
pm.environment.set("randomUserID", randomUserID);

批量执行预请求脚本

在Postman中,预请求脚本不仅可以应用于单个请求,还可以在集合级别上执行,这意味着在运行整个集合时,这些脚本将自动执行,为每个请求提供一致的预处理。

示例:集合级别的预请求脚本

假设我们有一个API集合,其中包含多个请求,每个请求都需要使用相同的认证令牌。我们可以在集合的预请求脚本中设置这个令牌,确保每个请求都能正确地进行认证。

// 集合级别的预请求脚本// 获取认证令牌var token ="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...";
pm.environment.set("authToken", token);

自动化测试报告生成

Postman预请求脚本不仅可以帮助我们自动化测试过程,还可以在测试结束后生成详细的测试报告,这对于跟踪测试结果和问题非常有用。通过使用Postman的测试脚本,我们可以收集测试结果,并在测试结束后生成报告。

示例:使用测试脚本收集结果

在每个请求的测试脚本中,我们可以记录API的响应时间、状态码等信息,然后在集合运行结束后生成报告。

// 测试脚本示例// 检查响应状态码
pm.test("Status code is 200",function(){
    pm.response.to.have.status(200);});// 记录响应时间
pm.test("Response time is less than 200ms",function(){
    pm.expect(pm.response.responseTime).to.be.below(200);});

示例:生成测试报告

Postman允许我们通过命令行接口(CLI)运行集合,并将结果输出到文件中,这样我们就可以生成自动化测试报告。

# 使用Postman CLI运行集合并生成报告
newman run <collection-id>-e<environment-id>--reporters cli,html --reporter-html-export test-report.html

在这个命令中,

<collection-id>

<environment-id>

分别是你在Postman中创建的集合和环境的ID。

--reporters

参数指定了报告的类型,

cli

表示命令行输出,

html

表示HTML格式的报告。

--reporter-html-export

参数指定了报告的输出文件。

通过这种方式,我们可以轻松地将Postman集成到CI/CD流程中,自动化API测试,并生成详细的测试报告,从而提高开发效率和代码质量。

故障排除与常见问题

预请求脚本执行失败的常见原因

预请求脚本在Postman中用于在发送请求之前执行自定义操作,如设置动态请求头、修改请求体或执行一些数据预处理。当预请求脚本执行失败时,通常有以下几种常见原因:

  1. 语法错误:JavaScript语法错误是最常见的问题,如括号不匹配、拼写错误或使用了不支持的语法。
  2. 函数调用错误:错误地调用Postman提供的函数,如pm.environment.set的参数错误。
  3. 依赖未加载:预请求脚本中使用了未正确加载的外部库或模块。
  4. 异步代码问题:预请求脚本中使用了异步代码,但没有正确处理回调或Promise。
  5. 资源访问限制:如跨域问题,预请求脚本尝试访问的资源可能受到浏览器的同源策略限制。

示例:解决语法错误

假设预请求脚本如下,尝试设置一个环境变量,但存在语法错误:

// 错误的预请求脚本
pm.environment.set("API_KEY","my-api-key")

正确的脚本应该使用括号包裹参数:

// 正确的预请求脚本
pm.environment.set("API_KEY","my-api-key");

示例:处理异步代码

预请求脚本中使用异步代码时,需要确保所有异步操作在请求发送前完成。例如,从一个API获取动态数据:

// 异步预请求脚本const fetch =require('node-fetch');fetch('https://api.example.com/data').then(response=> response.json()).then(data=>{
    pm.environment.set("dynamicData", data);}).catch(error=>{
    console.error("Failed to fetch data:", error);});

日志记录与分析

日志记录是调试预请求脚本的重要工具。通过在脚本中添加

console.log

语句,可以输出变量的值或函数的执行情况,帮助定位问题。

示例:使用日志记录

假设预请求脚本中需要检查一个变量的值:

// 使用日志记录的预请求脚本const apiKey ="my-api-key";
console.log("API Key:", apiKey);
pm.environment.set("API_KEY", apiKey);

在Postman的“Console”标签中,可以看到输出的API Key值,从而验证变量是否正确设置。

社区资源与支持

Postman社区是一个宝贵的资源,提供了大量的文档、教程和论坛支持,帮助解决预请求脚本中的问题。以下是一些推荐的资源:

  • Postman官方文档:详细解释了预请求脚本的语法和功能。
  • Postman论坛:可以提问和查找其他用户遇到的类似问题。
  • GitHub上的Postman示例:提供了各种预请求脚本的示例,可以作为参考。

示例:利用社区资源

当遇到预请求脚本中不理解的函数或概念时,可以访问Postman官方文档或在论坛中提问。例如,对于

pm.environment.set

的使用,可以在官方文档中找到详细的解释和示例。


以上内容详细介绍了预请求脚本执行失败的常见原因、如何使用日志记录进行调试,以及如何利用社区资源解决问题。通过这些方法,可以有效地诊断和解决预请求脚本中的各种问题,确保API测试的顺利进行。


本文转载自: https://blog.csdn.net/weixin_42749425/article/details/142322422
版权归原作者 kkchenjj 所有, 如有侵权,请联系我们删除。

“Postman:Postman API测试:Postman预请求脚本编写”的评论:

还没有评论