• 我的耳机进化史 🎧 at 2017年10月04日

    +1……

  • 已交智商税

  • 吃蝗虫挺好的嘛 不留着兼容?(手动滑稽

  • 这边实测的结果也是现在被人看好的 gatling 和 locust 真的没法跟被鄙视的 jmeter 比极限性能

    jmeter 从 2.x 开始每个小版本都在优化性能和采用更合理的默认配置,现在 3.2 版简单调下 JVM 参数,测部署在配置一般的服务器上的 hello world 或 nginx_stub,不比 ab/wrk 差多少

    我测的结果是 ab/wrk 34k 左右,jmeter 26k-29k,号称高性能的 gatling 14-22k,locust + zeromq + 8 个 slave 才 2-3k……

    但!是!jmeter 太旧了,诞生的时候 NIO 还没出来,收发请求是同步的,被测程序响应慢就会导致一堆线程堵塞,没有足够的压力到服务器,工具本身再快也没用。我们很少会去测静态页或从 redis 读数据直接返回的接口,多数时候它的表现都不能让人满意


    gatling 最近在用,本来想全面转向它的,越用越不对劲,before()after()里不支持 gatling 的 DSL,要用原生 scala,这会导致同一个接口在准备数据和跑测试时要以不同的方式写 2 次,复用起来也很麻烦

    被 requests 惯坏了的人看到 scala 里的各种 http 库的 api 就倒胃口,碰都不想碰,估计只有 java 程序员忍得了(逃

    它的分布式也相当简单粗暴:在不同机器开几个,跑完把 log 文件拼起来

    另外今天才发现它没法做到真的并行测多个接口,比如已知 4 个 RPS 差不多,互相无依赖的接口放进去,结果 A >> B >> C >> D,后面每个都只有前一个的一半左右,issue 在这:https://github.com/gatling/gatling/issues/2336

    最后就是我也不懂 scala,暂时弃坑╮(╯▽╰)╭


    locust,很恶心也很舒服……官方文档没多详细,例子极少,必须要看源码和踩过坑的人写的教程才能入门……

    它只有一个骨架,几乎什么都不提供要自己实现,好听点自由,不好听寒碜……

    但是 python + requests 顺手啊!╮(╯▽╰)╭

    开发效率实在高太多了,尤其像我这样主要测单个接口、单个模块/微服务而不是一长串乱七八糟的业务的,可以一堆不相关接口放一块运行,RPS 跟 gatling 测单个接口没什么区别,节省大量时间

    谁叫绝大多数程序的效率比测试工具低得多呢╮(╯▽╰)╭

    对于目标是在开发过程中尽早暴露问题而不是验收的人来说,locust 的缺点可以接受,之后基本就用它了

    期待有一天 ApiTestEngine 的热度超过 locust 本身 XD

  • 感谢各位前辈,刚好在坑中就看到了爬出坑的路
    希望以后有更多实用的分享,好人一生平安😆

  • 已报名😀

  • 是很丑,在代码里的注解更丑,之前我们用 apidocjs,但不方便返回实体类内容,转战 swagger 了

    还有什么好介绍没?


    我不懂 Java,以上全是我编的,我实在编不下去了……😆

  • 另一种解决方法:通过 JVM 参数传 CSP 配置

    如果是扔 Tomcat 下,修改bin/catalina.sh里的CATALINA_OPTS

    分享一个我的配置,对 nmonchart、jmeter、gatling 等生成的网页或者通常自己写的网页都基本够用了

    CATALINA_OPTS="-Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; style-src 'self' 'unsafe-inline' www.google.com ajax.googleapis.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' www.google.com; img-src 'self' data:; child-src 'self'\""
    

    如果直接用脚本启动:

    -Dhudson.model.DirectoryBrowserSupport.CSP="default-src 'self'; style-src 'self' 'unsafe-inline' www.google.com ajax.googleapis.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' www.google.com; img-src 'self' data:; child-src 'self'"
    

    想知道有没有应用成功,除了重新构建一下打开新的网页看看,可以在 Script Console 里这么看:

    System.getProperty("hudson.model.DirectoryBrowserSupport.CSP")
    
  • #41 楼 @butterfly5211314 就是同一文件夹下面,用这方法可以用名字指定你想要的接口执行,比如又回到前面跑过的再跑一次……目前也就这点可怜的流程控制功能了

    我的用法是在有些地方失败之后再来一次,例如随机的用户名注册,如果碰巧注册过了就重来。这种断言要稍微多处理点情况,比如几次重试用光之前不能算断言失败啊之类

  • #38 楼 @butterfly5211314 应该不行,这接口针对请求的,写死请求的名字调用

    目前想不同文件夹按顺序执行似乎只能靠名字排序了,比如 001_xxx, 002_xxx,但这样以后你想在中间插几个或调整顺序就要改名,挺麻烦

    如果在用 newman 的话干脆保存成不同集合文件,在 shell 脚本里自己控制测试顺序

    【2017-07-26 更新】最新版支持文件夹排序和多级文件夹了

  • #34 楼 @tangtest4 GUI 下直接就看到了,想在 newman 的报告里看用

    tests[`${responseBody}`] = true;
    

    responseBody 是个字符串

  • 你的头 3 个月已经顶我头 1 年半了,而且还这么年轻,加油

  • [思寒] 测试职业发展简谈 at 2016年12月30日

    @seveniruby 没必要把之前提到的工具编辑掉啊,可以作为附录给人参考嘛,最多去掉第 x 层的说法,改成序号,再加 1 句 “排列顺序不代表更难或更先进、各个工具都有自己的适用场景、将来可能过时、重要的是背后的思想” blahblahblah😀

    难得有大公司的老司机出来提几个名词,对大家选型肯定有帮助的。真的一个不漏查过资料的人是不怕被 “误导” 的,有这个视野有对比要找到适合自己项目的花不了太多时间,倒是完全不知道有更好的才很可能在不合适的技术上浪费时间,“在屎上雕出花来”

    都 2016 年了,很多童鞋不想一直做纯手工,但听说过的全是 n 年前的名词如 QTP、loadrunner、winrunner 之类……多数人这个阶段最需要的是知道去哪里找枪,不能一直拿小刀甚至空手,被人虐成渣

    至于拿了枪会不会开,打不打得准,以后人人动力甲了会不会去找新装备,那都是活过今天之后的事了

  • #13 楼 @yusufchang 要是真的有所有用例完全一样的代码块要改还好,sed 替换掉,就烦各种小地方有那么一丁点不一样的那些😟

  • #30 楼 @396266318 想从某个接口的返回数据里提取东西要在tests里写,先解析 json 字符串,拿到需要的属性再设为环境变量

    比如

    let json = JSON.parse(responseBody);
    postman.setEnvironmentVariable('token', json.data);
    

    之后就可以在下一个请求参数传{{token}}

    (我这里偷懒省了 try catch

    token 和 json 是随你取的变量名,data 是你返回值里的字段名,responseBody(字符串) 是 Postman 的全局变量

  • #1 楼 @faith 在 jenkins 的管理页面里看看 jvm 的默认编码是不是 gbk 之类,是的话把 jvm 启动参数改了重启试试

    -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8

  • #11 楼 @yusufchang exec 看起来像是我想要的,谢谢:)

    新版本不知道什么时候出具体会搞成怎样,之前给 newman 提 issue 的时候作者提到的,反正我是不抱希望……

    newman 缺的东西太多了

    postman 最大的优点就是易用,人手一个

    而 newman 就是个残废,连批量执行、跳过某些文件、外部脚本、标签、自动关联数据文件和拿到数据文件里的用例数这些东西都要你自己实现,代码重用和流程控制跟没有没什么分别……

    要不是 postman,我还不如连 http 请求都自己写,扔掉它算了……

    有 postman 在,谁定义了啥接口,他自己用来调试的用例可以导出到处发,方便联调

    要是适合做自动化,改一改加上断言就搞定

    甩锅也容易,到底是参数传错还是接口有问题一看就知道

    另外,让做手工测试的童鞋自己写业务相关的接口测试理论上效率比较高

    PS:图中接口的响应时间有点长啊……难怪跑这么久
    PS2:我基本都在测后端,很能理解你的感受,特别是那些薛定谔的 bug,天天在烦你,谁观测它它就消失了😆

  • #26 楼 @hw_ 它是同步发请求的,没有并发,服务器都是串行处理

    简单点可以用腾讯这网页测 http://wetest.qq.com/gaps/
    复杂点可以用 jmeter

  • #25 楼 @sunxia 在 postman 的主界面手动点发送 默认会保存环境变量

    但在 runner 和 newman 都是默认不保存,你指定集合 a/文件夹 a 运行,改了 environment 对象,下次指定集合 b/文件夹 b 运行是拿不到的

    像 uuid 这种没法写死在环境变量文件的值建议在同一个集合/文件夹里随设随用

  • #9 楼 @yusufchang 我也是 nodejs 包 newman,以前异步跑不到 20 秒(输出到控制台的 log 混一起是个大坑,暂时没想好是改同步还是写文件,在自己的框架成型前退回去用 shell 脚本同步跑了……)

    我的测试没你多,不到 300,很重要很稳定的才加入,不爽的踢走

    复用性真正要解决得等新版本,据说能在集合层面复用代码

    全局的复用我暂时是把公共函数压缩了塞 globals 里,eval() 加上复制粘贴勉强用着

    之前在 nodejs 里写好了从外部 js 文件读入内容,转义后找到 collection 文件里的某些标志替换掉

    例如 postman 里注释写//use:foo,node 脚本就会去读放在指定目录下的foo.js,替换掉这行注释

    用了一段时间,暂时跟 data file 一起扔掉了,以后再看情况捡起

    这方法只适合用于整个项目每个接口都必须做而且完全一样的断言,不适合 pre-request script 和提取变量,不然等于放弃了用界面发请求调试

  • #7 楼 @ike 最后的链接里的生成器也是这个,有生成器也省不掉查资料熟悉语法的时间,毕竟要删除替换和添加一些东西

    如果接口够稳定,比如是发布出去的 SDK,结构全都不能变,麻烦一次稳定运行几个月也还行

    如果是自己用的,天天改,只写几个关键的断言就算了

  • #21 楼 @tangtest4 在 pre-request 里就可以设环境变量的,方法一样

    比如 phone 是你的随机号码的变量,环境变量也起一样的名字,那就postman.setEnvironmentVariable('phone', phone);

    如果一定要在 test 里取请求参数里填的东西,像这里传 JSON 字符串就用JSON.parse(request.data).phone
    如果是 form 就用request.data.phone

    谢谢你的问题,我更新一下原帖,放在提取接口返回值下面一点:)

  • #18 楼 @tangtest4 你这个号码既然是写死的,可以搞成环境变量吧?

  • #3 楼 @Lihuazhang 当接盘侠😝

    接口这块不用全塞给我,跟业务相关的他们自己测,这就有更多时间忙别的事了

  • 深圳主场怎么没有😂