使用Pandaria编写API自动化测试进阶用法

发表于:2018-11-06 10:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:51testing采编

分享:
  Pandaria 是一款基于Cucumber JVM的API自动化测试工具,上一篇文章介绍了它的基本功能,包括基本的HTTP操作和数据库操作。本文将介绍使用Pandaria编写自动化测试的一些高级用法。
  快速开始
  安装
  Pandaria本身以Java库的形式发布到Maven Central中,使用Pandaria本身只需要在构建工具中添加依赖即可,本身没有额外的安装操作。工欲善其事必先利其器,IDE能够使我们编写自动化测试事半功倍,此处推荐IntelliJ IDEA, 当然你可以选择其他你喜欢的用于开发Java的IDE。
  创建工程
  安装好IntelliJ IDEA后,我们可以创建一个标准的Maven工程。
   
  添加依赖
  在build.gradle或者pom.xml中添加Pandaria依赖。
  build.gradle
  apply plugin: 'java'
  dependencies {
  testCompile(
  "io.cucumber:cucumber-junit:4.0.0",
  'com.github.jakimli.pandaria:pandaria-core:0.2.3',
  'com.github.jakimli.pandaria:pandaria-db:0.2.3',
  'com.github.jakimli.pandaria:pandaria-mongo:0.2.3'
  )
  }
  pom.xml
  <dependencies>
  <dependency>
  <groupId>com.github.jakimli.pandaria</groupId>
  <artifactId>pandaria-core</artifactId>
  <version>0.2.3</version>
  <scope>test</scope>
  </dependency>
  <dependency>
  <groupId>com.github.jakimli.pandaria</groupId>
  <artifactId>pandaria-db</artifactId>
  <version>0.2.3</version>
  <scope>test</scope>
  </dependency>
  <dependency>
  <groupId>com.github.jakimli.pandaria</groupId>
  <artifactId>pandaria-mongo</artifactId>
  <version>0.2.3</version>
  <scope>test</scope>
  </dependency>
  </dependencies>
  这里除了pandaria-core以外,还包含了pandaria-db和pandaria-mongo两个模块,如果你的项目不需要验证数据库,或者不需要验证mongo db,你可以不添加这两个模块。
  本文使用JUnit, 依赖中也添加了cucumber-junit模块。
  创建Cucumber Junit入口
  在工程下面创建一个RunCucumberTest.java,这个文件使用Cucumber的Junit Runner,用于运行feature文件,使用Pandaria其实就是使用Cucumber,所有Cucumber本身的功能依然适用。
  RunCucumberTest.java
  package com.github.jakimli.pandaria_sample;
  import cucumber.api.CucumberOptions;
  import cucumber.api.junit.Cucumber;
  import org.junit.runner.RunWith;
  @RunWith(Cucumber.class)
  @CucumberOptions(plugin = "pretty",
  features = "classpath:features/",
  glue = {"com.github.jakimli.pandaria", "com.github.jakimli.pandaria_sample"})
  public class RunCucumberTest {
  }
  语法高亮和补全
  现在可以开始编写第一个自动化测试了。
  在 src/test/resource/features 下面创建以 .feature 结尾的文件,如test.feature。IntelliJ IDEA利用gherkin和Cucumber for Java两个插件提供gherkin的高亮和补全。可以在IntelliJ的插件安装中搜索这两个插件并安装,安装好后feature会高亮以及自动补全:
   
  HTTP
  全局Http Header
  Pandaria支持在配置文件( application.properties )中配置全局的Http Header,所有的Http Request都会带上这些Header。
  一个典型的场景是,自动化测试运行在测试环境,当需要对API进行认真的时候,通常需要一个测试账号,将对应的认证信息放到HTTP的Authorization Header中。我们可以使用 http.headers.<name> 来配置。如:
  application.properties
  http.headers.Authorization=Bear Token
  上传文件
  Pandaria支持文件上传,使用 attachment 关键字可以指定文件路径
  Scenario: upload file
  * uri: /files
  * attachment: attachments/abc.txt
  * send: POST
  * status: 200
  * response body:
  """
  uploaded
  """
  Mongo DB
  除了关系型数据库以外,Pandaria还支持对Mongo DB的操作和校验。
  插入
  通常我们需要往mongo的一个集合中插入测试数据,可以这么写:
  * collection: 'users' insert:
  """
  {"user": "jakim"}
  """
  清除
  清除测试数据:
  * collection: 'users' clear
  查询和验证
  同样我们可以从Mongo DB中查询数据并做校验
  * collection: 'users' find all
  * verify: '$[0].user'="alice"
  也可以指定查询条件
  * collection: 'users' find:
  """
  {"age": {$gt: 17}}
  """
  * verify: '$[0].user'="jakim"
  * collection: 'users' find:
  """
  {"age": {$lt: 17}}
  """
  * verify: '$[0].user'="alice"
  * collection: 'users' find: filter/greater_than_17.json
  * verify: '$[0].user'="jakim"
  变量
  普通变量
  使用Pandaria,你可以使用基本的变量功能, ${<name>} 用于使用普通变量如:
  你可以定义 envrionment 变量,然后在之后的URL中使用,这样如果你需要切换环境,就只需要改envrionment变量的值就好了。
  Background:
  * var: 'environment'='test'
  Scenario: hello world
  * uri: https://${environment}/users/octocat/orgs
  * send: GET
  * status: 200
  你也可以在配置文件中指定变量的初始值
  application.properties
  variables.environment=test
  Scenario: initial value from configuration file
  * verify: ${environment}="test"
  * var: 'environment'="production"
  * verify: ${environment}="production"
  如上述,在feature文件中定义会覆盖配置文件中的值。
  生成随机测试数据
  随机的测试数据在自动化测试中很实用,Pandaria中你可以使用 #{<expression>} 的形式来生成测试数据,如:
  Scenario: faker in request body as doc string
  * uri: /faker/users
  * request body:
  """
  {"name": "#{Name.fullName}", "city": "#{Address.city}"}
  """
  * send: POST
  * response body:
  """
  success
  """
  这里的 #{Name.fullName} 和 #{Address.city} 会被替换成随机的人名和城市名。通过配置 faker.locale 可以切换语言。
  上一次返回报文作为下一次请求报文
  Pandaria支持将第一次HTTP请求的返回内容直接作为下一个请求的Request内容, 通过 @{<json path>} 的形式使用。
  Scenario: request directly from last response
  * uri: /users/me
  * send: get
  * verify: '$.username'='jakim'
  * verify: '$.age'=18
  * verify: '$.iq'=double: 80.0
  * uri: /users
  * request body:
  """
  { "username": @{$.username}}
  """
  * send: POST
  * status: 200
  * verify: '$.id'='auto-generated'
  * verify: '$.username'='jakim'
  * verify: '$.age'=18
  * uri: /users
  * request body:
  """
  @{$}
  """
  * send: POST
  * status: 200
  * verify: '$.id'='auto-generated'
  * verify: '$.username'='jakim'
  * verify: '$.age'=18
  校验
  验证JSON Schema
  你可以验证一段JSON是否遵循给定的Json shcema:
  * uri: /products/1
  * send: get
  * verify: '$' conform to:
  """
  {
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.com/product.schema.json",
  "title": "Product",
  "description": "A product in the catalog",
  "type": "object"
  }
  """
  * verify: '$' conform to: schema/product.schema.json
  * verify: '$.tags' conform to:
  """
  {
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.com/product.tags.schema.json",
  "title": "product tags",
  "description": "Product tags",
  "type": "array",
  "items": {
  "type": "string"
  }
  }
  """
  复制代码
  使用Javascript自定义验证
  一些基本的验证可以通过Javascript来进行,使用 code 关键字,如:
  * var: 'age'=16
  * var: 'iq'=90.0
  * uri: http://localhost:10080/not_important
  * send: get
  * verify: '$.age'=code: ${age} + 2
  * verify: '$.iq'=code: ${iq} - 10
  * verify: '$.age'!=code: ${age} + 3
  * verify: '$.iq'!=code: ${iq} - 11
  * verify: '$.age'=code:
  """
  ${age} + 2
  """
  * verify: '$.iq'=code:
  """
  ${iq} - 10
  """
  或者
  * verify code: ${name} == ${iq} / 3
  * verify code:
  """
  ${name} != ${iq} % 3
  """
  * verify code file: verification.js
  集成CI
  使用Pandaria,结合Junit,运行测试就像运行单元测试一样,你只需要在CI上运行 mvn test 即可。

    上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号