测试开发之接口篇-使用K6完成接口自动化测试

K6是一个优秀的开源性能测试工具,它提供了简洁又丰富的API,灵活和易用的描述性语法。以下列出K6中的几个概念:

  • Metrics:测试度量的指标。如请求响应时间、执行耗时、检查点通过率、失败次数等;
  • Thresholds:定义了指标度量的成功、失败标准。如请求失败率小于5%,迭代执行耗时平均小于3秒;
  • Checks:测试用例的检查点。如响应状态码等于200,响应内容包括文本关键字等;
  • Tags:可作用于请求、指标、阀值和检查点的标签,便于分类进行统计;
  • Groups:以函数的形式对脚本进行逻辑划分,以方便进行分类统计分析;
  • Scenarios:用于控制性能测试中的加压方式和过程,如虚拟用户数量和加载、并发集合点、迭代模式等。

如果对软件测试、接口、自动化、性能测试、测试开发、面试经验交流。感兴趣可以加裙485187702,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。

本文针对接口测试的目标,需要我们在脚本中实现以下的控制处理,这里不涉及更多的性能测试的有关内容。

  1. 控制并发用户数和接口调用次数;
  2. 验证指定编号用例的请求响应时间平均值小于6秒;
  3. 验证某个分组中请求的响应时间90%小于6秒;
  4. 验证某个分组整体脚本执行时间平均值小于6秒;
  5. 使用多级分组模拟测试套件及其子套件;
  6. 支持在检查点配置测试用例编号和名称;
  7. 输出JSON格式的测试结果摘要和日志文件。

下面我们看一下示例的脚本,完整的脚本文件请访问GitHub

import http from 'k6/http';
import exec from 'k6/execution';

import { check, sleep, group } from "k6";

export const options = {
    // 设置并发用户数及其加载方式
    stages: [
        { duration: "2s", target: 3 }, // 2秒内,加载3个虚拟用户
        { duration: "1s", target: 0 }, // 1秒内,销毁所有虚拟用户
    ],

    // 设置性能有关指标的阀值,形如{id:1}标签的指标会影响指定用例的成败。
    thresholds: {
        // 验证编号为1的用例的响应时间,平均值小于1000毫秒
        'http_req_duration{id:1}': ['avg < 1'],

        // '用户登录'分组中所有请求的响应时间,90%小于6000毫秒
        'http_req_duration{group:::登录请求}': ['p(90) < 6000'],

        // '用户登录'分组的整体执行时间,平均值小于6000毫秒
        'group_duration{group:::登录请求}': ['avg < 6000'],
    },
};

export default function () {
    // 单元测试套件
    group('用户登录', function () {
        let resp = http.get('https://httpbin.org/get?p1=1', {
            tags: { id: '1' }, // 标记用例编号为1,用于上述阀值统计
        });

        // 期待响应状态码
        let expectRespStatus = 200

        // 通过设置错误的期待结果,模拟三分之一的迭代失败
        // if (+`${exec.vu.idInTest}` % 3 === 0) {
        //     expectRespStatus = 222
        // }
        // console.log(`in iteration ${exec.vu.idInTest}, expectRespStatus=${expectRespStatus}`)

        // 验证器方法,可以验证响应的状态码、耗时、内容等
        const validator = (r) => resp.status == expectRespStatus

        // 注意:此处的检查点和前面定义的阀值'http_req_duration{id:1}'均会影响用例的成败
        // 断言方法(用例ID, 用例名称,验证点名称,被验证数据,验证器)
        assert(1, '微信扫码登录', '验证跳转到个人仪表盘', resp, validator);

        // 子套件'用户登录-登录次数限制'及其下用例代码
        group('失败次数限制', function () {
            assert(0, '登录失败连续3次,账号锁定', '显示账号已被锁定', resp, (r) => true);
            assert(0, '登录非连续性失败累计达到3次,账号不锁定', '可成功登录', resp, (r) => true);
            assert(0, '锁定账号15分钟后自动解禁', '解禁后可成功登录', resp, (r) => true);
        });

        // 当前套件'用户登录'下的另一个用例
        group('CASE', function () {
            assert(0, '邮箱登录', '验证到达首页', resp, (r) => resp.status == 200);
        });

        sleep(1);
    });

    group('用户管理', function () { // 单元测试套件
        const resp = http.post('https://httpbin.org/post', JSON.stringify({
            foo: 'abc',
            bar: '123',
        }), {
            tags: { foo: 'bar' },
            headers: {
                'Content-Type': 'application/json',
            },
        });

        // 验证器
        const validator = (data) => {
            const status = data.status
            const dur = data.timings.duration
            // console.log('===', status, dur)

            // 验证状态码和响应时间
            const pass = status == 200 && dur < 6000

            return pass
        }

        // 断言:用例ID, 用例名称,验证点名称,被验证数据,验证器
        assert(0, '重置密码', '验证用户收到密码重置右键', resp, validator);

        sleep(1);
    });
}

export function setup() {
    console.log('--- setup')
}

export function teardown(data) {
    console.log('--- teardown')
}
// 配置ZTF执行时请保留该函数,否则thresholds阀值结果不会影响用例结果
// export function handleSummary(data) {
//     return {
//         'results/summary.json': JSON.stringify(data), //the default data object
//     };
// }

function assert (caseId, caseName, checkpoint, data, validator) {
    const name = `${caseId} - ${caseName}`
    const tags = { id: caseId, name: caseName, checkpoint: checkpoint}

    check(data, { [name]: validator }, tags);
}

在命令行执行以下命令:

k6 run main.js

得到下列控制台输出:

running (05.0s), 0/3 VUs, 3 complete and 0 interrupted iterations
default ✓ [======================================] 0/3 VUs  3s

     █ setup
     █ 用户登录
       ✓ 1 - 微信扫码登录
       █ 失败次数限制
         ✓ 0 - 登录失败连续3次,账号锁定
         ✓ 0 - 登录非连续性失败累计达到3次,账号不锁定
         ✓ 0 - 锁定账号15分钟后自动解禁
       █ CASE
         ✓ 0 - 邮箱登录
     █ 用户管理
       ✓ 0 - 重置密码
     █ teardown

     checks.........................: 100.00% ✓ 18       ✗ 0  
     data_received..................: 20 kB   4.0 kB/s
     data_sent......................: 2.2 kB  443 B/s
     group_duration.................: avg=857.26ms min=25.43µs  med=604.99ms max=2.02s    p(90)=1.84s    p(95)=1.92s   
     ✓ { group:::登录请求 }.............: avg=0s       min=0s       med=0s       max=0s       p(90)=0s       p(95)=0s      
     http_req_blocked...............: avg=320.83ms min=0s       med=307.26ms max=668.21ms p(90)=655.24ms p(95)=661.73ms
     http_req_connecting............: avg=107.18ms min=0s       med=101.03ms max=238.79ms p(90)=220.52ms p(95)=229.66ms
     http_req_duration..............: avg=392.41ms min=205.38ms med=283.97ms max=702.8ms  p(90)=686.37ms p(95)=694.58ms
       { expected_response:true }...: avg=392.41ms min=205.38ms med=283.97ms max=702.8ms  p(90)=686.37ms p(95)=694.58ms
     ✓ { group:::登录请求 }.............: avg=0s       min=0s       med=0s       max=0s       p(90)=0s       p(95)=0s      
     ✓ { id:1 }.....................: avg=257.77ms min=205.38ms med=209.42ms max=358.51ms p(90)=328.69ms p(95)=343.6ms 
     http_req_failed................: 0.00%   ✓ 0        ✗ 6  
     http_req_receiving.............: avg=92.33µs  min=60µs     med=98µs     max=125µs    p(90)=115.49µs p(95)=120.25µs
     http_req_sending...............: avg=348.5µs  min=206µs    med=306µs    max=565µs    p(90)=499µs    p(95)=531.99µs
     http_req_tls_handshaking.......: avg=211.06ms min=0s       med=206.07ms max=429.09ms p(90)=427.12ms p(95)=428.1ms 
     http_req_waiting...............: avg=391.97ms min=204.69ms med=283.6ms  max=702.28ms p(90)=685.91ms p(95)=694.09ms
     http_reqs......................: 6       1.19129/s
     iteration_duration.............: avg=2.05s    min=51.71µs  med=3.03s    max=3.69s    p(90)=3.64s    p(95)=3.66s   
     iterations.....................: 3       0.595645/s
     vus............................: 1       min=1      max=3
     vus_max........................: 3       min=3      max=3

脚本执行结束后,K6会以他默认的形式来展示测试日志和结果。

最后:下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!【100%无套路免费领取】

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

8小时传疯!大厂面试真题全被大佬整理在这个小程序上了!【软件测试,建议收藏】

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础 

  全套资料获取方式:点击下方小卡片自行领取即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码小怡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值