定向班第二期_接口问题答疑列表帖_20200109

接口问题列表

当用例的规模越来越大,用例的数据和请求该如何管理,还是通过yaml文件吗?

  • 小规模的简单的业务场景,纯代码+参数化维护。
  • 中等规模的用例,代码+数据驱动+少部分的用例自动生成
  • 大规模的用例。用例自动生成+测试数据自动生成+监控
  • code-less的用例,tcpcopy+diffy,真实的流量复制+diff算法去校验

Websocket与soap 这几种接口除了用jmeter或者soapui这种测试工具测试外,还有其他的方式来测试吗?

  • jmeter和soapui本质是封装了ws、soap的一些调用库,你可以绕开他们,直接使用 ws soap的调用库,结合junit或者testng就可以了。这样会更简单,更直接,更灵活。

做接口测试持续集成时,还可以用到postman+Jenkins,这种做法老师推荐吗?感觉可维护性不是很方便!

  • postman不推荐,他是一个好的接口调试工具,但是不是一个好的接口测试框架。postman有个newman框架,也支持数据驱动,但是他本身是基于nodejs的,这就意味着qa很难去改进和定制。简单用是可以的,复杂的深度使用它是不胜任的。

接口的 items[0].data 字段是 json数据转义成 String类型的数据。该如果处理,可以方便的从里面拿到或者修改自己期望的一个字段值/多个字段值?比如相对里面的 tagPk 操作,有什么好的方法呢?

model = mapper.readValue(xxxx) 这里最后得到的数据,是如何填充到ApiObjectMethodModel的HashMap里的?

  • 这是jackson的标准的yaml序列化的过程。一个类对应一个数据文件,类中的public字段代表了yaml中的某个key。

String method = Thread.currentThread().getStackTrace()[2].getMethodName(); 怎么理解getStackTrace方法?

  • Thread.currentThread().getStackTrace() 这是JVM自带的功能,用于获得当前函数的调用栈。第0个是自身,第1个是调用getStackTrace的方法,第2个是更父类的调用方法,也就是调用了parseSteps()的调用者的名字。

TypeReference>> typeRef = new TypeReference>>(){}; 如何理解TypeReference?

  • TypeReference是一个代表特定数据类型的一个引用。是因为有些结构无法使用 XXX.class,所以采用这个写法来代替。

接口返回内容较多时,怎么进行高效的校验,可能还要校验数据类型。

  • json schema, 他可以断言数据的结构、类型、格式。
  • 跟老版本对比 diff
  • 机器学习预测(目前很少,多数是上面两个)

当接口传入参数较多,且含有较多可选参数时,如果对每种组合进行封装,会比较低效,有没有其他好的办法。

  • 用数据驱动去驱动测试数据。正交、笛卡尔积等各种算法去生成。sql的join
  • 使用真实数据自动生成样本就可以。如果没有历史数据,只能使用第一个办法

上次课开始的时候是复用之前appium的po进行改造但没有成功,是否需要使用抽象类或接口,最好能有一个示例

  • 这个话题是设计模式的话题。两个PO, ApiObject,PageObject他们两个数据是不一样的,但是具备公共的方法。可以使用工厂模式。下次课的时候,我们可以试试。

如何有效的维护用例?(用例与脚本关联)

  • allure2里可以标记某个自动化用例,是与你的jira系统里的那个文字用例是对应的 。如果想更好的维护,需要独立的系统。
    想更好的管理,需要对已有的系统做扩展。管理好如下数据
  • 自动化测试用例
  • 业务手工用例
  • bug
  • 精准化测试/代码覆盖,可以根据研发代码变动反溯要回归的用例

mock的几种做法

  • 支付宝、微信支付���测试环境可以使用。可以接入。这个需要第三方配合。
  • 在调动支付宝的sdk的时候,使用fakeSDK去模拟。基于api的mock
  • 协议层mock,自己公司的服务多数都是可以的,但是第三方的有加密,这个方法是很难行得通的。可以用上面2个办法。
  • 使用fakeSDK,基于api的mock,实现日常的各种流程测试。
  • 验收测试的时候,还是要使用第一条,进行真实的流程校验。

JsonSchema断言返回数据类型,像String这种默认值是null,如果后端返回null的话JsonSchema就会断言为失败

  • json schema应该是支持期望类型可以为null的,你加进去就可以了。

接口测试由不同的测试开发人员编写代码,不同人用的用户不一样(用户的权限,账号信息不一样),怎么把所有人的代码合并到一起不会受不同用户的影响;

  • 如果业务本身需要多账户,这种做法是可以的。
  • 如果一个用户就可以完成所有的测试场景,涉及用户的地方,使用变量或者配置代替,运行时由配置文件动态决定使用哪个用户,不要写死。

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

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

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

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

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

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

使用继承规划用例执行顺序,怎么理解?可以演示一下吗?

  • UserBaseTestCase: 解决产品内的用户身份,用什么用户,登录等操作
  • DepartmentBaseTestCase: 可以继承自UserBaseTestCase,在用户自动登录的流程中,额外加入部门的一些数据初始化。
  • 一般是2层或者3层继承,让他们的BeforeAll可以叠加,获得一些默认的行为支持。比如自动登录、自动初始化数据等能力。

@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类。

在定时脚本里调用第三方的接口,可以mock第三方接口返回的数据吗

  • mock有2个mock。
  • 基于api mock,可以直接修改定时脚本的逻辑,比如把访问baidu.com变成访问自己的ip。再用mock代替。
  • 基于协议的mock,比如moco、charles。让脚本走代理,在代理过程中加入我们自己的mock
关闭