Postman接口自动化测试实例:从调试到Jenkins集成

最近使用postman做简单的接口自动化测试,感觉很方便很好用,趁有空,在这里分享下整个过程,主要包含postman的使用方法和优缺点两方面。

  使用方法

  1、浏览器f12,选中接口,复制curl命令 

  2、在postman导入

  3、其实前面两步都是最简单不过了

,很多开发调试接口也会用,重要的是导入后的二次编辑,如果单个一个简单的http接口,那基本上到此为止,工作量就完了,但我的需求是要承前启后,要加密,要自己生成一些东西,所以现在预请求脚本和测试脚本就很重要。

  3.1、随机生成一些字段,比如trace_id之类的,我的方法是:

  一些规定字符串+Math.random().toString(36).substr(2,10),比如我设置的:

 

base_id = "8878a2b8-4476-408d-9278-" + Math.random().toString(36).substr(2,10)

  3.2、请求体加密

比如我们的业务需要把请求头和请求体里的部分字段拼接起来,加上appSecret,一起加密。

 

 const appSecret = "wVpJFq42DfRzfhseL";

  //  以下大括号的里的变量名都是我从请求头或者请求体中获取的,所以通过变量引用的方式,如果是写死的,就可以直接把${}换成对应的字段值。 

 var dataToSign=`businessId=${business_Id}&queryText=${queryText}&queryType=${queryType}&deviceId=${device_Id}&traceId=${trace_Id}`;

  var CryptoJS = require("crypto-js");

  //  使用CryptoJS库生成HMAC-SHA256签名

  var signature = CryptoJS.HmacSHA256(dataToSign, CryptoJS.enc.Utf8.parse(appSecret));

  // 将签名转换为Base64编码的字符串

  var signStr = CryptoJS.enc.Base64.stringify(signature);

  在以上的预请求脚本中,要特别注意,单引号和反引号的区别!!!我就是踩了坑,导致总是加密结果不正确。如果不确定拼接出来 的结果对不对,可以通过console.log()打印出来看看。

  3.3、判断执行接口的条件

因为在我的业务场景中,有一种情况,就是上个接口响应里有XX字段才执行某个接口,所以我就需要在预请求接口里做判断.

  PS:如果报错TypeError: Aresp .include is not a function,请将include改成includes(include 是一个旧的 API,现代 JavaScript 使用 includes(注意是复数)。确保你使用的是 includes。) 

 // 获取A接口的响应  上个接口结束后,把它存在了环境变量

  var Aresp = pm.environment.get("Aresp");// 第一层判断:检查event接口的响应是否存在

  if (Aresp) {

    // 第二层判断:检查previousResponse中是否包含特定的字段

    if (Aresp.includes('你期待的XX字段')) {

      // 第三层判断:检查字段值是否符合预期

      pm.environment.set("shouldExecuteCurrentRequest", true);}

       else {

      // 没有找到特定的字段

      pm.environment.set("shouldExecuteCurrentRequest", false);

    }} else {

    // eventresp不存在

    pm.environment.set("shouldExecuteCurrentRequest", false);}

  if (pm.environment.get("shouldExecuteCurrentRequest") === false) {

      // pm.skipToNextRequest();

      // 如果用pm.会报错   在评估预请求脚本时出现错误:TypeError: pm.skipToNextRequest is not a function 

      postman.setNextRequest();

      // pm.execution.skipRequest()}

  3.4 简单的断言  

pm.test("Status code is 200", function () {

      pm.response.to.have.status(200);

  pm.test("Response code is 0", function () {

      var jsonData = pm.response.json();

      pm.expect(jsonData.code).to.eql(0);});

  pm.test("响应里不包含'error'", function () {

      var response = pm.response.text();

      pm.expect(response).not.to.include("error");});// 断言响应中是否包含指定字符串

  pm.test("响应中包含特定字符串", function () {

      pm.expect(pm.response.text()).to.include(":true");

      pm.expect(pm.response.text()).to.include("succeed");

      pm.expect(jsonData.data).to.haveOwnProperty("idList");

  });

  3.5 参数提取

  从环境变量提取参数:

  // 假设环境变量中有一个名为"apiToken"的变量 

 var token = pm.environment.get("apiToken");

  pm.request.headers.add({key:"Authorization", value:"Bearer " + token});

  从响应里提取参数

  // 假设上一个请求的响应体中有一个名为"id"的字段

  var response = pm.response.json();

  var userId = response.id;

  pm.environment.set("userId", userId);

  从URL中提取参数

  // 假设当前请求的URL包含一个名为"userId"的查询参数

  var url = pm.request.url;

  var userId = url.match(/userId=([^&]+)/)[1];

  pm.environment.set("userId", userId);

  复杂点的参数提取,比如我们的业务场景是流式包,我想从流式包的最后一个包里提取sessionid字段,作为后续请求体的一个参数 

 pm.test("从最后一个包提取sessionid", function () {

      // 获取响应文本

      var responseText = pm.response.text();

      // 由于流式接口可能发送多个数据包,我们需要找到最后一个包

      // 假设每个包都是以"data:"开头,我们可以通过正则表达式来匹配最后一个包

      var pattern = /data:(\{.*?\})\n?$/gm;

      var match;

      var lastPackage = "";

      while ((match = pattern.exec(responseText)) !== null) {

          lastPackage = match[1]; // 提取最后一个匹配的包

      }

     

      // 解析最后一个包为JSON对象

      var lastPackageJson;

      try {

          lastPackageJson = JSON.parse(lastPackage);

      } catch (e) {

          console.error("Failed to parse last package as JSON:", e);

          return;

      }

     

      // 提取sessionId字段

      var sessionId = lastPackageJson.data.sessionId;

      

      // 打印sessionId或进行其他操作

      console.log('第一轮事件流后生成的sessionId是:', sessionId);

      // 将sessionId保存为环境变量

      pm.globals.set("sessionId", sessionId);

  });

  集成到jenkins上

  其实这个比较简单,就是需要安装步骤比较繁琐,你找一篇靠谱的文章,照着做一般没问题。

  1. 安装 Newman:

     Newman 是 Postman 的命令行工具,可以通过命令行执行 Postman 的脚本(Collection)。首先需要安装 Node.js 和 npm,然后通过 npm 安装 Newman:  

   bash

     npm install -g newman

     安装完成后,可以使用 `newman -v` 命令检查是否安装成功。

  2. 准备测试脚本:

     在 Postman 中编写好接口测试用例,并导出为 JSON 格式的集合文件(Collection)。同时,如果测试用例中使用了环境变量,也需要从 Postman 中导出环境变量文件(Environment)。

  3. 安装 HTML 报告工具:

     为了方便查看测试用例执行结果,可以安装 Newman 的 HTML 报告插件:   

 bash

     npm install -g newman-reporter-html

     这样在执行 Newman 时可以生成 HTML 格式的报告。

  4. 配置 Jenkins:

     - 安装 Jenkins:可以通过 Docker 安装或直接运行 war 包的方式安装 Jenkins。

     - 安装必要的插件:确保 Jenkins 安装了 Pipeline 插件,以便创建流水线项目。

  5. 创建 Jenkins 项目:

     在 Jenkins 中创建一个新的流水线项目(Pipeline),配置源代码管理,以便能够获取到 Postman 集合文件和环境变量文件。

  6. 配置构建步骤:

     在 Jenkins 项目的构建配置中,添加执行 Newman 的命令。例如:   

 bash

     newman run <path_to_collection.json> -e <path_to_environment.json> -r html --reporter-html-export <path_to_report.html>

     这个命令会运行 Postman 集合,并生成 HTML 报告。

  7. 执行项目:

     保存配置后,可以执行 Jenkins 任务。Jenkins 将会调用 Newman 运行指定的 Postman 集合,并将测试结果输出到 Jenkins 控制台和构建状态中。

  8. 邮件通知:

     如果需要,可以在 Jenkins 中配置邮件通知,以便在构建完成后发送邮件通知构建结果。

  postman优点

  1、使用方便

  真的调试接口的同时,就把接口用例写了,不用付出太多额外精力去做。

  2、参考资料齐全 

  在网上你几乎可以搜索到任何问题的答案,不会说遇到问题无从下手,自己搞半天找不到答案(这点我最欣赏)

  3、界面简单清晰,操作成本低

  也许是这个页面用了很多年,感觉不用刻意去找功能,而是一看就知道哪个菜单式是干嘛的,因为开发也有用,分享也很方便,用来调试也方便。

  4、被Apifox完全兼容,几乎导出来,一键导进去就可以用(哈哈 我现在习惯用postman写脚本,然后导入apifox里面执行)

  缺点:

  1、监视器收费

  这点是我最不能忍受的,收费也太高

  2、报告不够好看

  报告太简陋,要是再融入些插件美化下就好了

  3、对数据库容不够完美

  操作数据库不够方便,针对断言里需要操作数据库的业务需求,这个满足起来就很复杂。

  可以试试Apifox,功能确实很强大,可能因为我一开始没用惯,它的功能我用着不熟悉,但它真的是postman的升级版,不但继承了postman的所有功能,还额外有很多功能,甚至连性能测试都免费开放,后续有空打算研究下 。

文末了:可以到我的个人号:atstudy-js,

这里有一起解决工作中棘手的项目问题,一起交流行业热点和offer机会,

可加入↓↓↓↓↓↓

自动化测试学习交流群,内含直播课+实战+面试各种丰富的资料助你快速进阶测试开发技术,稳住当前职位同时走向高薪之路。

### 软件测试接口自动化测试相关面试题整理 #### 基础概念类 1. **什么是自动化测试?** 自动化测试是指通过编写脚本来代替人工操作,从而实现重复性和复杂性的测试工作。其核心在于减少人为干预并提高效率[^1]。 2. **为什么需要进行接口自动化测试?** 接口自动化测试能够快速验证前后端交互逻辑是否正常运行,尤其是在频繁迭代的情况下,能显著降低回归测试的时间成本和人力投入[^2]。 3. **如何设计一个好的测试用例?** 设计良好的测试用例应覆盖尽可能多的功能路径以及边界条件,同时保持简洁明了,便于维护更新。这通常涉及需求分析、风险评估和技术可行性研究等多个方面[^3]。 #### 技术细节类 4. **请描述一下你所熟悉的几种主流的自动化工具及其优缺点是什么?** 主流工具有Selenium用于Web UI层面上的操作模拟;Postman适合API级别的调试与文档生成;JMeter则专注于性能压测等领域。每种都有各自适用范围及局限性需权衡选用。 5. **谈谈你在实际项目中是如何做数据驱动或者关键字驱动方式实施自动化方案的具体案例吧?** 数据驱动允许我们将输入参数外部存储起来,在不同场景下灵活调取使用; 关键字驱动则是定义一系列通用动作命令集合供组合构建新的流程步骤, 这两者都能极大增强框架扩展能力适应变化的需求环境. 6. **解释下Python中的协程机制对于提升大规模并发请求处理有何帮助之处呢 ? 并举例说明应用场景 .** 协程相比传统多线程模型具备更低资源消耗优势 , 它们之间无需依赖OS层面切换控制而是交由开发者自行管理协作完成任务分配 。 当面对高频率网络IO等待型作业比如爬虫抓取网页内容时候非常适合采用这种方式来优化整体吞吐表现效果 [^4]. 7. ```python import asyncio async def fetch_data(): await asyncio.sleep(2) # Simulate an async operation like fetching data from a server. return {"key": "value"} async def main(): result = await fetch_data() print(result) if __name__ == "__main__": asyncio.run(main()) ``` 8. **如果让你搭建一套完整的持续集成/部署(CI/CD)pipeline体系结构图应该考虑哪些要素构成呢 ? 又怎样衡量它的成功与否标准有哪些指标可参考么 ?** CI部分主要围绕版本控制系统 (Git), 构建服务器(Jenkins,Bamboo etc.),单元&集成测试环节展开 ; CD侧重于制品库(Artifact Repository Manager),容器编排平台(Kubernetes,Docker Swarm etc.)等方面配置衔接紧密配合运作形成闭环反馈链路 。 成功度评判可以从平均修复时间(MTTR), 发布周期长度(Frequency Of Releases), 缺陷逃逸率(Bug Escape Rate)等维度综合考量得出结论 . 9. **针对RESTful API服务端响应状态码分类解读意义所在并且列举几个典型例子加以阐述清楚含义区别好吗 ?** HTTP协议规定了一系列标准化的状态编码用来表示客户端发起请求后的结果情形 , 大致分为五组区间分别代表不同类型的信息告知接收方当前状况以便采取相应措施继续下一步行动方向指引作用明显突出重要地位不可忽视如下表所示 : | Code Range | Description | |------------|---------------------------------------------------------------------------| | 1xx | Informational responses – the request was received, continuing process | | 2xx | Successful responses – the action was successfully received, understood, and accepted | | 3xx | Redirection messages – further action needs to be taken | | 4xx | Client error responses – the request contains bad syntax or cannot be fulfilled | | 5xx | Server error responses – the server failed to fulfill an apparently valid request | 例如 : `HTTP 200 OK` 表明一切正常返回预期的数据实体对象实例给查询者访问获取利用价值最大化体现出来 . ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值