• todo: 年后给大家设计下如何普及这方面的知识。

  • 1、API自动化用例怎么应对项目中快速迭代?

    如果接口变化很快,需要反思下公司的接口设计。
    在接口稳定的情况下,用PO思想封装。

    2、在restassured的API框架基础上怎么做成平台页面化的?(做成页面化主要给让测试新手、产品、运营使用);

    • 不推荐搞平台,成本大,ROI不划算
    • 测试用例核心是保障业务正确。基于用例只是其中一种,还有一些是数据分析为主的。
    • 容易成为KPI项目,开发起来猛如虎,维护起来一地鸡毛
    • 投入太多会脱离测试核心,本质是一个xxx内部管理系统,开发平台的价值并不大,而且也不是核心。
    • 适合第三方来做

    如果做一个比较挫的平台

    • Vue做前端页面 bootstrap ant design vuetify
    • Django Flask SparkJava SpringBoot 完成后端构建 db+rest api
    • 用例的数据驱动 yaml json
    • 把yaml json的数据生成改成一个网页的form来生成并存储db
    • 运行时从db读取用例的数据,转成yaml或者json发给数据驱动引擎

    更推荐的办法

    • 数据驱动
    • jenkins持续集成
    • 持续交付
    • 结果反馈到devops的平台里
    • 用例维护、数据维护尽量是QA、Dev接手。
  • 请求到达接口A,接口A计算,然后写入数据库。
    另外一个接口读取数据库,可能有计算,返回

    req <--> a() <--> db

    res=a1.0(req)
    res=a1.1(req)

    测试方法

    • 基于黑盒需求用例
    • 基于白盒逻辑的用例
    • diff
    • 数据分析
  • 1、自动化测试脚本(ui,接口,性能)一般都在哪些环境上跑?

    ui、接口通常每个环境都跑,研发环境/联调环境、测试环境、预发布环境、线上环境
    性能测试通常只在专属性能环境
    全链路压测可以在线上环境

    2、有公司在生产环境跑自动化脚本吗?如果有的话,像支付场景怎么跑?用真实资金?

    生产环境一定要跑,一般称为线上巡检。
    在线上运行需要解决几个问题

    • 涉及到数据库的断言,没法放到线上,所以要区分开。
    • 普通的支付测试,需要用到mock,在非生产环境主测。线上环境中使用小额的订单进行测试。小额的支付测试是否自动化不是关键,因为线上和依赖服务都相对稳定。可以让公司出钱走报销流程搞个测试专用帐号。

    3、生产环境跑出来的测试数据怎么清理?怎么区分测试数据和真实用户数据?

    • 自动化测试锁定在特定的帐号就可以,这个帐号的数据可以定期让运营清理,不要完全自动化,不然QA就成了数据安全的风险点了。自动化测试也可以加入特定的header,不过很少有专门为了自动化区分流量的投入。
    • 性能测试如果放到线上是全链路压测,这个测试方法会在请求中加入一些特定的标记,比如某个header中加入标记。后端需要区分和过滤这部分的流量。

    4、在生产环境跑自动化脚本的目的和作用是什么?

    • 保证线上质量,有很多因素会导致线上出问题。跟发布流程关联不大,举个例子,没有上线,但是第三方依赖出问题,导致业务出问题。比如第三方的支付服务商、dns、各地的网络抖动之类的。
    • 不需要全部流程都在线上,核心流程在线上即可。

    以上问题设计是环境管理

    • 研发环境、联调环境。让研发去玩,自动化去保证
    • 测试环境:自动化测试、手工测试
    • 预发布环境1:线上环境的mini版本,百度内部就有一个叫做小百度。
    • 预发布环境2:接近于真实的环境,比如使用真实的支付流程。自动化测试、项目组验收测试
    • 预发布环境3:跟线上完全使用相同的数据库
    • 线上环境:测试核心业务、质量监控

    关于数据库

    • 不要直接操作数据库。因为你的脚本里会有密码。写一个service间接操作数据库。把密码隐藏,提供执行sql的接口即可。
    • 这是jackson的标准的yaml序列化的过程。一个类对应一个数据文件,类中的public字段代表了yaml中的某个key。
    • Thread.currentThread().getStackTrace() 这是JVM自带的功能,用于获得当前函数的调用栈。第0个是自身,第1个是调用getStackTrace的方法,第2个是更父类的调用方法,也就是调用了parseSteps()的调用者的名字。
    • TypeReference是一个代表特定数据类型的一个引用。是因为有些结构无法使用 XXX.class,所以采用这个写法来代替。
  • 在定时脚本里调用第三方的接口,可以mock第三方接口返回的数据吗

    mock有2个mock。

    • 基于api mock,可以直接修改定时脚本的逻辑,比如把访问baidu.com变成访问自己的ip。再用mock代替。
    • 基于协议的mock,比如moco、charles。让脚本走代理,在代理过程中加入我们自己的mock
  • @MethodSource 使用自定义方法读取外部数据,但这自定义方法与用例的耦合性太强,有什么办法可以封装吗。
    就是老师上课时写的 static Stream deleteByParamsFromYamlData() 方法,能否封装成通用的。

    测试用例的参数化,使用一个参数代替。比如 (String name, String userid, List departs)
    可以直接用一个类代替 (Data data)

    class Data {
    public String name;
    public String userid;
    public List<Integer> departs;

    }

    还有一个选择是HashMap代替Data类。

  • 接口实战ppt12页,使用继承规划用例执行顺序,怎么理解?可以演示一下吗?

    UserBaseTestCase: 解决产品内的用户身份,用什么用户,登录等操作
    DepartmentBaseTestCase: 可以继承自UserBaseTestCase,在用户自动登录的流程中,额外加入部门的一些数据初始化。

    一般是2层或者3层继承,让他们的BeforeAll可以叠加,获得一些默认的行为支持。比如自动登录、自动初始化数据等能力。

  • 1、通过模板解析生成Api对象的框架中,模板文件、数据文件应该以一个怎么样的结构进行管理?

    模板和数据文件可以放到相同的目录下,最好跟用例的类路径是一样的。这个是最好的,其他的比如单独的data template目录也是可以的。需要自己去定制框架,解决路径查找的便利性问题。

    2、在接口数和数据文件越来越多的情况下,应该如何组织管理项目结构?

    参考前面的小规模、中等规模、大规模用例的管理办法

  • 接口可选参数在建模的时候怎么考虑?请老师结合企业微信,标签,增加标签成员,其中userlist 和partylist不能同时空,是不是说就需要特殊处理?我建模的时候写了两个方法,一个方法同时传,一个方法,增加传入参数名带入。感觉不太好。希望听见老师的看法

    直接传HashMap来代表字段可有可无的这种结构。不用刻意封装参数,使用HashMap更通用。

一个爱好测试的工程师