[Postman]接口自动化测试入门

文章大多用作个人学习分享,如果大家觉得有不足或错漏的地方欢迎评论指出或补充

此文章将完整的走一遍一个web页面的接口测试流程

大致路径为:

创建集合->调用接口登录获取token->保存token->带着token去完成其他接口的自动化测试->断言->断言->保存测试结果

简单介绍

postman是用于软件测试调试接口的工具,通过模拟用户发出的http请求参数来验证响应是否与期望值相符合。

新建集合与请求

workplace中创建一个集合,以及在集合中创建请求

在集合中,可以将组织相关的API都整合到一起,且可以按照顺序一键运行,记录测试结果,生成测试报告

下面会以csdn中的搜索接口来走一遍这个流程

csdn页面中需要先进行登录,才可完成后续的操作

所以,我们第一步的是需要先获取登录接口中返回的认证信息。

postman中参数变量的存储

通常在调用了一个登录接口后,会相应的返回一个token或者是cookie。让客户端存储下来,好完成后续的身份验证。

如果我们想要对一些有身份验证要求的接口进行测试,就要在请求头上对应的加上一个token或者cookie(对应的身份验证方式就要看被测接口的开发设计了)

对于请求头或者请求体中的某些参数,我们可以使用环境变量或者全局变量去进行赋值。

首先,先调查csdn登录接口的设计与参数

下面是csdn的账密登录接口对应的参数,userIdentification是账号,pwdOrVerifyCode是密码

复制代码
{
    "userIdentification":"",
    "pwdOrVerifyCode":"",
    "loginType":"1",
    "webUmidToken":"",
    "uaToken":"",
    "agreedPrivacyPolicy":0
}

我们在对应的进行传参登录后,再查看respond,可以发现其返回的cookie格式是由多个set-cookie以键值对的方式返回的。

想要把这个respond里的cookie带到后续请求接口的header的参数中,方法可以有如下:

使用javascript对响应进行处理存储cookie到环境变量

大致的流程是:

  1. 首先对登录接口进行请求

2.使用postman中的test模块编写javascript,对响应中的cookie进行存储到环境变量当中

3.在后续的接口上,将cookie字段中的参数使用一个占位符进行替换

4.结果是,在进行请求时header就会带着cookie去访问了

新建一个环境与环境变量

并在请求中使用上对应的环境,这样在执行javascript的时候,才会赋值到对应的环境变量上 编写一个javascript脚本去存储响应头里的所有set-cookie并进行拼装处理

javascript 复制代码
//  拿header里面set-cookie
const cookies = pm.response.headers.filter(function (header){
    return header.key.toLowerCase() === 'set-cookie';
})

// 拼接起来
let cookieString = cookies.map(function (cookie){
    return cookie.value.split(';')[0];
}).join(';');

// 存储到环境变量中
pm.environment.set("cookie", cookieString);

// 打到控制台看一眼
console.log(pm.environment.get("cookie"));

在接口进行请求响应后,再去查看环境变量中的cookie变量。可以发现cookie已经存储起来了

在其他需要认证的接口上的请求头里加上cookie键,并将值用占位符代替。这样在请求的时候,就会将环境变量里的cookie值加到请求头上,完成身份验证。使用这个方法同理,也可以对其他响应体或者响应头中的参数进行存储或处理。

postman中的cookie管理

其实,在postman当中会自动识别响应当中是否包含有cookie,如果有的话会根据域名存储起来,下一次在对同一个域名的其他接口进行请求的时候,会自动给你加上域名对应的cookie

会自动的给你先拼接好这个请求头中的cookie

断言

如果想要知道一个接口的响应是否符合预期,那么可以写一个断言来对响应进行判断。

在postman中提供了一个pm API去方便编写一些脚本进行测试

pm.test是其中会用到进行断言或者测试的方法

pm.test()会接收两个参数,

第一个参数是,测试的名称

第二个参数是,测试函数,包含了测试的逻辑

状态码断言

如果我想要判断一个接口的状态码是否为200,则脚本可以编写为:

javascript 复制代码
pm.test("状态码为200", function(){
    pm.expect(pm.response).to.have.status(200);
})

响应体内容断言

想要判断返回的jsonData中的某个字段是否存在,以及对其value进行断言,可以进行下面的编写。

|-------------------|-------------------------------|
| 场景 | 方法 |
| 判断value是否为某一个特定值 | to.eql(value)/to.equal(value) |
| 判断value是否小于某个值 | to.below(value) |
| 判断value是否大于某个值 | to.above(value) |
| 判断value是否包含某个值 | to.include(value) |
| 判断对象是否包含某个键/字段/属性 | to.have.property(key) |

eg,判断message字段是否为success

javascript 复制代码
pm.test("检查message字段的value", function(){
    const jsonData = pm.response.json();
    pm.expect(jsonData.message).to.eql("success")
})

eg,判断score字段是否小于50

javascript 复制代码
pm.test("检查score字段的value是否小于50", function(){
    const jsonData = pm.response.json();
    const data = jsonData.data;
    const score = data.score;
    let scoreData = score.score;
    pm.expect(scoreData).to.below(50);  // 检查score字段的value是否小于50,是的话通过
})

eg中对应的响应体内容

javascript 复制代码
{
    "code": "0",
    "data": {
        "password": {
            "hasInfo": true,
            "expired": true
        },
        "email": {
            "hasInfo": false,
            "email": null
        },
        "score": {
            "score": 30
        },
        "loginLog": {
            "hasInfo": true,
            "logRisk": true
        },
        "showCancellation": true
    },
    "message": "success",
    "status": true
}

响应头断言

判断response的header中某一个字段是否为某一个值时

javascript 复制代码
pm.test("检查响应头中的content-type是否为application/json;charset=utf-8", function(){
    pm.expect(pm.response.headers.get('Content-Type')).to.equal("application/json;charset=utf-8")
})

响应时间断言

判断本次响应的时间是否在600ms之内

javascript 复制代码
pm.test("检查响应时间是否在600ms之内", function(){
    let time = pm.response.responseTime;
    pm.expect(time).to.below(600);
})

DDT数据驱动测试

DDT(Data-Driven Testing,数据驱动测试)是一种自动化测试方法,指通过使用外部数据文件(如 CSV、Excel、JSON 等)或数据源来驱动测试的输入。它的核心思想是将测试数据和测试逻辑分离,以便在不修改测试代码的情况下,用不同的数据集来重复执行同样的测试逻辑。

学会了接口身份认证登录的方式,以及断言的编写后,就来到了被测接口的设计了。

像是对csdn中的文章搜索接口进行测试,测试返回的内容是否包含搜索关键字

在network中找到的接口可以直接以bash形式复制下来,再导入到postman中,就可以带着参数以及其请求头的参数了

编写CSV文件

此处就简单的设计一下测试用例,不具有太多的参考性。

再将postman中搜索接口的关键字的value用占位符替换,注意占位符的命名要与csv文件中对应的参数名一致

响应的结果一般是这样滴

运行集合

写好搜索接口的断言

javascript 复制代码
pm.test("检查响应中是否有key值", function(){
    // 拿result_vos 这个对象是一个数组,一个元素就是一篇文章的信息
    let result_vos_data = pm.response.json().result_vos
    // 还要先判断是否存在result_vos
    // 如果result_vos为空,下面的forEach也不会执行,断言会通过
    pm.expect(result_vos_data).to.be.an('array').that.is.not.empty
    // 遍历result_vos_data中存储的元素,检查元素中的title字段是否包含有{{key}}参数
    // 动态的从csv中取参
    let key = pm.variables.get('key');
    console.log(key)
    result_vos_data.forEach((item, index) => {
        // 检查是否有title字段
        console.log(item)
        pm.expect(item).to.have.property('title');
        // 检查title字段是否为空
        let sign = item.title.toLowerCase().includes(key);
        console.log(sign)
        pm.test(`返回的下标为${index}的数据是否通过`, function(){
            pm.expect(sign).to.be.true;
        });
    })
})

打开菜单后,选择 Run collection

可以在上传附件中加入写好的csv文件

但是有一点需要注意的是,测试接口根据csv文件中的参数个数,需要进行循环n次。但这个循环次数是会将整个集合的接口都重新调用一遍。

像是一些获取前置条件的接口:登录接口之类的 ,不想且不需要被重复调用。

只能创建另一个集合去单独调用了

在点击之后对应的测试报告就会生成出来啦

相关推荐
To_OC4 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
vipbic4 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy5 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志5 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble6 小时前
c端系统,其实更像一个信息展示平台
前端
测试秃头怪7 小时前
如何评估自动化测试脚本的编写时间和维护工作量?
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
李姆斯7 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜8 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司8 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
kaiking_g8 小时前
vue项目中,静态导入 vs 动态导入 详解
前端·javascript·vue.js