一.实例背景 

  在实际业务中,经常会出现让用户输入用户密码进行验证的场景。而为了安全,一般都会先请求后台服务器获取一个随机数做为盐值,然后将盐值和用户输入的密码通过前端的加密算法生成加密后串传给后台服务器,后台服务器接到到请求后,先获取校验原来的随机数是否有效合法,如合法后,再做解密,并根据约定的规则把随机数盐值剔除等后续处理。

  也就是说先有一个获取随机数的接口请求,然后有一个验证密码的请求。

二.基于Postman来自动化这种场景的测试

  获取随机数的接口每次请求返回的随机数是不一样的,那么这种情况下,要实现接口的自动化,就要用到postman中设置环境变量这个功能。

1.脚本编写

  在这里,为了防止别人用工具对接口发起请求,除做了token校验外,还简单对请求时间做了校验,即服务器会校验客户端的请求时间前后不能相差1分钟,如超过,说明是有问题的请求,将直接拒绝。

  脚本要能自动运行,就必须在Postman上实现一个获取当前时间的功能,每次请求前获得当前时间。在Postman中是在Pre-request Script中编写,获得后台约定的日期格式,然后通过

postman.setEnvironmentVariable将其设置到环境变量中,如下所示:

  完整代码如下:

var currentTime = new Date();

function PrefixInteger(num, length) {
return (Array(length).join('0') + num).slice(-length);
}
Date.prototype.toMyDateStr = function() {
return this.getFullYear() + "-" + PrefixInteger((this.getMonth() + 1),2) + "-" + PrefixInteger(this.getDate(),2) + " " + PrefixInteger(this.getHours(),2) + ":" + PrefixInteger(this.getMinutes(),2) + ":" + PrefixInteger(this.getSeconds(),2);
}; postman.setEnvironmentVariable("reqTime", currentTime.toMyDateStr());

  这样就可以在请求体中通过{{}}方式进行引用。

  注意的是,我这时的请求是application/json格式,且是UTF-8编码格式的,所以在Headers中还有如下配置。

  接下来就是最重要的一块了,就是对请求响应的判断(判断是否成功)及成功后根据返回的随机数用加密算法对密码进行加密处理。

  接下来在验证密码的接口中,就可以通过{{radomNumCode}}、{{pwdSM2}}方式进行变量的引用。

  在这个验密请求中,Pre-request Script和Headers中的配置和上面的获取随机因子的配置是一样的,下面我们再来看一看Tests中的内容。

  Tests中其实也是对http请求的返回码和响应体的返回码、返回消息进行判断。

2.运行效果

  先运行获取随机因子的请求,在Test Results中看到都是和预期值一致的,也就是全是PASS的。

  再运行第二个真正验证密码的请求,如下所示,发现所有响应都符合预期,都是PASS。

  这时,我们来简单修改其中一个预期值,让其不通过,执行效果如下。

三.postman常用方法集合

1.设置环境变量

postman.setEnvironmentVariable("key", "value");
pm.environment.get("key", "value");//postman 5.0以上版本设置环境变量的方法

2.设置全局变量

postman.setGlobalVariable("key", "value");
pm.globals.set("variable_key", "variable_value");//postman 5.0以上版本设置全局变量方法

3.检查response body中是否包含某个string

tests["Body matches string"] = responseBody.has("string_you_want_to_search");

pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});//5.0以上版本方法

4.检测JSON中的某个值是否等于预期的值

var data = JSON.parse(responseBody);
tests["Your test name"] = data.value === 100;

  JSON.parse()方法,把json字符串转化为对象。parse()会进行json格式的检查是一个安全的函数。

  如:检查json中某个数组元素的个数(这里检测programs的长度)

var data = JSON.parse(responseBody);
tests["program's lenght"] = data.programs.length === 5;

5.转换XML body为JSON对象

var jsonObject = xml2Json(responseBody);

tests["Body is correct"] = responseBody === "response_body_string";

6.检查response body是否与某个string相等

7.测试response Headers中的某个元素是否存在(如:Content-Type)

//getResponseHeader()方法会返回header的值,如果该值存在
tests["Content-Type is present"] = postman.getResponseHeader("Content-Type"); tests["Content-Type is present"] = responseHeaders.hasOwnProperty("Content-Type");

  上面的方法,不区分大小写。下面的方法,要区分大小写。

8.验证Status code的值

tests["Status code is 200"] = responseCode.code === 200;

pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});//5.0以上版本方法

9.验证Response time是否小于某个值

tests["Response time is less than 200ms"] = responseTime < 200;

//5.0以上版本方法
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});

10.name是否包含某个值

tests["Status code name has string"] = responseCode.name.has("Created");

//5.0以上版本方法
pm.test("Status code name has string", function () {
pm.response.to.have.status("Created");
});

11.POST 请求的状态响应码是否是某个值

tests["Successful POST request"] = responseCode.code === 201 || responseCode.code === 202;

//5.0以上版本方法
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201,202]);
});

12.很小的JSON数据验证器

var schema = {
"items": {
"type": "boolean"
}
};
var data1 = [true, false];
var data2 = [true, 123];
console.log(tv4.error);
tests["Valid Data1"] = tv4.validate(data1, schema);
tests["Valid Data2"] = tv4.validate(data2, schema);
13.获取request值:
var Json = JSON.parse(request.data); 
  • data {object}:
    this is a dictionary of form data for the request. (request.data["key"]=="value")

  • headers {object}:
    this is a dictionary of headers for the request (request.headers["key"]=="value")

  • method {string}:
    GET/POST/PUT etc.

  • url {string}:
    the url for the request.

  假设requestBody中有"version":"1.0";这个值,如果想获取到version的value值,代码如下
var Json = JSON.parse(request.data);
var version = Json["version"];

14.JSON.parse()和JSON.stringify()

JSON.parse()【从一个字符串中解析出json对象】--把string转对象
JSON.stringify()【从一个对象中解析出字符串,主要针对[object object]类型数据的转换】--把对象转String var data={name:'goatling'}

JSON.parse(data)
结果是: '{"name":"goatling"}' JSON.stringify(data)
结果是:name:"goatling"

15.判断字段值是否为空typeof()

var Jsondata = JSON.parse(responseBody);
if( typeof(Jsondata.data) != "undefined" )

参考文章:https://www.cnblogs.com/JHblogs/p/6418802.html

学习文章:https://www.cnblogs.com/nancyzhu/p/8029994.html

Postman接口自动化测试实例的更多相关文章

  1. Postman接口自动化测试实例二

    在<Postman接口自动化测试实例>一文中,我是在获取随机因子的接口的Tests中对用户的密码进行加密处理的.其实正常做法应该是在请求验证接口前,即在Pre-request Script ...

  2. Postman接口自动化测试实例用到的完整的SM2前端加密算法代码

    var __g__ = {}; !function(t,e){"object"==typeof exports?module.exports=exports=e():"f ...

  3. 【Python+postman接口自动化测试】(5)抓包工具Fiddler简介

    Fiddler简介 Fiddler 4.6 下载 http://www.downza.cn/soft/234727.html 为什么使用Fiddler? 可以抓到请求数据,查看Raw格式/表单格式/J ...

  4. 【Python+postman接口自动化测试】(7)Postman 的使用教程

    Postman v6的使用 Postman: 简单方便的接口调试工具,便于分享和协作.具有接口调试,接口集管理,环境配置,参数化,断言,批量执行,录制接口,Mock Server, 接口文档,接口监控 ...

  5. 【Python+postman接口自动化测试】(3)什么是接口测试?

    什么是接口测试? 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换.传递和控制管理过程,以及系统间的相互逻辑依 ...

  6. JMeter接口自动化测试实例—JMeter引用javaScript

    Jmeter提供了JSR223 PreProcessor前置处理器,通过该工具融合了Java 8 Nashorn 脚本引擎,可以执行js脚本以便对脚本进行前置处理.其中比较典型的应用就是通过执行js脚 ...

  7. 【Python+postman接口自动化测试】(8)以青云客机聊天器人和图灵聊天机器人接口示范python发送get和post

    以青云客机器人和图灵机器人接口示范python发送get和post 发送请求,我们这里主要使用Python的一个第三方包(需要先安装):requests. Python3自带的http.client和 ...

  8. 【Python+postman接口自动化测试】(4)HTTP 协议

    前言 HTTP:超文本传输协议,是用于从WWW服务器传输超文本到本地浏览器的传输协议. HTTP协议是一种无状态协议,主要包含请求和相应两大部分. 请求(Request) get请求示范: GET h ...

  9. 【Python+postman接口自动化测试】(2)什么是接口?

    接口的概念 接口又称API(Application Programming Interface,应用程序编程接口),是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的 ...

随机推荐

  1. mysql的配置说明

    查询最高内存占用 使用以下命令可以知道mysql的配置使用多少 RAM SELECT ( @@key_buffer_size + @@query_cache_size + @@innodb_buffe ...

  2. ISP PIPLINE (六) AWB

    What is WB(white balance)? 人的视觉和神经系统在看到白色物体的时候,基本不受环境的变化而出现严重的错觉.比如阴天,晴天,室内,室外,日光灯,白炽灯等的环境下,人依然会将白纸视 ...

  3. PHPstorm远程连接侧边栏怎么打开,远程数据库侧边栏怎么打开

  4. 2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)

    A. Assignment Algorithm 按题意模拟即可. #include<stdio.h> #include<iostream> #include<string ...

  5. linux 文件属性(转)

    1.  文件类型 - 普通文件 d 目录文件 l 链接文件 b 块设备文件 c 字符型设备文件 s socket文件 p 管道类型文件 块设备文件主要是指慢速设备,比如hd硬盘,数据主要是分块存储,所 ...

  6. react路由

    针对多个列表导航公用一个组建,然后 有两种路由方式 1.import {HashRouter as Router,Route,Link} from 'react-router-dom' 不过这个路由中 ...

  7. Java程序生成一个Access文件

    package access; import java.io.File;import java.io.IOException;import java.sql.SQLException;import j ...

  8. SSIS获得Excel行号(转自http://blog.csdn.net/zplume/article/details/19113911)

    问题描述: 首先个人并不推荐将Excel作为数据源,因为Excel单元格式会引起特别多的数据转换问题,例如:单元格里明明是2.89,但SSIS抽取到数据库里面之后却变成了2.88999999之类的数据 ...

  9. UIAlertController中TextField的用法

    这时候可以添加如下代码: [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { // 可以 ...

  10. rbac权限控制,基于无线分类

    2018年9月18日11:21:28 数据库结构 CREATE TABLE `admin` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `c ...