在公司开了4节课教导测试小伙伴们学习和使用soapui,以下是本人的一些关于soapui的课程总结

课程:

  • 第1课: SoapUI 入门
  • 第2课: git操作和问题回顾
  • 第3课: 设计接口测试用例的一些方法
  • 第4课: Soapui in Jenkins

SoapUI 入门

从gitlab中导入项目

  1. 以windows为例,到C盘目录下,克隆项目
  2. 在soapui中切换工作空间,File -> Switch Workspace,选择workspace.xml

switch

  1. 双击打叉的项目,填入项目在硬盘中的绝对地址:C:\soapui\soapui-project,确认后即成功读取整个Project

reload

  1. 点击项目,左下角属性里面有一项 Composite Project:true,即以文件夹形式保存项目,方便多人协作,如果为false,即以单文件形式保存项目,不方便多人协作。

composite

新建接口测试工作空间和项目

  1. 新建工作空间,File -> New Workspace,填写 工作空间名(如果已建,忽略该步骤)
  2. 新建项目,File -> New Project,填写项目名称,如 项目名
  3. 在左下角项目属性里面,将 Composite Project : false 改为 true ,以以文件夹形式保存项目,方便多人协作
  4. 添加项目全局变量 Properties :

    • Name :apiv
    • Value :v5_3_0
    • 引用该变量用: ${#Project#apiv} ,用于适应接口版本变更

Properties

添加一个 API URL

A.使用录制的方式(接口已在 swagger-ui 文档中)

  1. 选中项目右键,Discover REST APIs;

Discover

  1. 到 swagger-ui 中把完整的 Request URL 复制,黏贴进去,按一下回车;

swagger-ui

  1. 等待请求响应后,点击 Done;

Done

  1. 转跳请求 url 记录,点击 Generate services 生成 Services,确认;

generate-services

  1. 在主界面左侧就能看到生成的 API URL
  2. 以上是从接口文档中得到的请求参数,由于接口文档不一定准确,还需要用 Charles 从 app 抓包检查接口参数,还可以从代码中走读检查是否有缺失参数:如何找到接口路径以及完整参数

B.使用手动的方式

  1. 选中项目右键,New REST Service from URI,输入完整URL
  2. 调整 Service 配置:选中 Service,左下角中的属性设置:

    • name : host
    • Base Path : /${#Project#apiv}/api/xxx
  3. 如果已有 Service,选中 Service 右键,New Resource,输入 Path:/xxx.php?xx=xx1&xx=xx2
  4. 在生成的 Request 1 中,手动调整参数:

    • Style : QUERY
    • Level : RESOURCE

canshu

C.使用 swagger-ui json 导入

  1. swagger2.0 版本的 json 比较好,1.2 兼容性不行
  2. 新建项目时,选中 Create project from Swagger Definition(REST)

new-project

  1. 如果已有项目,右键项目,选择 Import Swagger

import-swagger

已录入的接口还能导出 Swagger json ,但是没有示例参数,没有归类 tag,并不算好用

如何找到接口路径以及完整参数

  • 从 swagger-ui 中找
  • 从 kibana 中找
  • 从 Charles 中找
  • 从代码中找
  • 判断接口是否已不使用
    从 kibana 线上数据中找到接口是否被调用的记录

筛选条件形如:

{
  "query": {
    "match": {
      "uripath": {
        "query": "/api/xx.php",
        "type": "phrase"
      }
    }
  }
}

新建测试套件和测试用例

  1. 新建测试套件和测试用例,选择 Request 右键,Add to TestCase

testcase

  1. 生成的测试套件和测试用例如下,

createtestcast

  1. 处理 token 问题,可以自己写接口计算 token 值再传参到真正的请求,或者用 groovy 脚本记录cookies,本人用 php 写了计算 token 接口并结合 nginx rewrite 规则来使用

数据驱动

  1. 添加测试步骤:DataSource,DataSource Loop,用于数据驱动

testsuite

  1. 数据源的设置,类型选择 Grid

datasource

  1. 数据循环的设置:

datasourceloop

  1. 执行测试步骤对数据源的引用方式如下,可以从输入框右边的柱状按钮点击选择:

testrequest

初期,可以一个testcase只有一个执行测试步骤,先不加入数据驱动

用例关联

  1. Add Step -> Run TestCase 引用其他用例作为测试步骤

other-testcase

  1. 过程中需要传参,如该登陆接口需要传递 uid 到关注接口,登陆 Test Case 添加 Properties uid

properties2

  1. 登陆 Test Case 在 Property Transfer 中配置 uid 参数传递,$.data.uid 这个Xpath可以从GET - Request 1 步骤的返回 json 中获取

property-transfer

  1. 引入的手机账号登陆 Test Case 设置参数传递,点击扳手图标,将参数勾选上

run-testcase-options

  1. 测试步骤中,引用其他测试步骤传递过来的参数:

添加断言

  • 在测试步骤中,底部点击 Assertion 展开,添加;或者在返回 Json 中选中数据,右键 Add Assertion

assertion

git操作和问题回顾

  • 导入项目
  • git 回滚操作

    • 本地未提交,拉取报冲突
    • 本地已提交,拉取报冲突
    • git reset 3种模式(重置提交) 和 git revert (提交回滚)的区别
    • git stash (贮藏)的用法
  • 挑选文件提交、重置文件
  • 清除初始url中的参数数值
  • 整体执行用例调试

设计接口测试用例的一些方法

测试用例设计

  • 单一接口 (优先)

    • 覆盖正常情况(优先)
    • 前置条件和收尾工作最好通过写入固定数据库数据来做
    • 不仅要校验返回值,还要校验数据变更是否符合预期
  • 组合接口 (业务场景)

    • 模拟常用的业务场景,在接口层面进行检查

断言方法:

  • for Content
  • for Count
  • for Existence
  • for Content matching RegEX 正则参考
  • Valid HTTP Status Codes
  • Contains 中文需unicode转码
  • Not Contents
  • XPath Match 可以模糊匹配
  • 一般用准确断言和存在断言来对返回数据进行判断,在不能进行数据库数据写入后还原的情况下,更多地使用存在断言或模糊匹配
  • 可以用groovy脚本来进行更复杂的断言,需要较高学习成本

数据驱动

  • 目的:重复导入字段数据,检测接口异常
  • 添加步骤 DataSource 和 DataSource Loop ,进行数据循环录入,设置好 DataSource Loop 的 DataSource Step 和 Target Step
  • 在 request 参数中 填入 ${DataSource#变量名} 来引用数据源

业务场景

  • 参数传递

    • 在 testcase 的 Properties 中添加变量,并添加 PropertyTransfer 步骤将 response 拿到的参数传递给变量
    • 关联用例 testcase 添加后,在 request 参数中 填入 ${用例名#变量名} 来引用
  • 不同的账号以不同的登录 testcase 来给其他用例组成测试场景,避免以数据驱动的方式来实现,不然要面对复杂的断言

SoapUI in Jenkins

普通命令行方式运行:

  1. 在 jenkins 所在的 linux 服务器上安装Soapui开源版~/SoapUI-x64-5.2.1.sh
  2. 安装 jenkins 插件并配置

  3. 配置 jenkins 项目

    • 源码管理: Git 填写 soapui 仓库地址,Additional Behavioursa 添加 Clean before checkout
    • Build periodically: H 9 * ,每天定时早上9点构建一次
    • 构建:Execute shell:
        cd ${WORKSPACE}
        mkdir report
        cd /data/SoapUI-5.2.1/bin
        ./testrunner.sh -Dfile.encoding=UTF-8 -I -r -j -f${WORKSPACE}/report ${WORKSPACE}/soapui-project.xml
- 构建后操作: Publish JUnit test result report,  测试报告(XML) : report/*.xml 
- 构建后操作: Editable Email Notification,  Default Content : ${JELLY_SCRIPT,template="testReport_fail"}

以 docker 方式运行

  1. 在jenkins所在 linux 服务器(如 ubuntu )上安装 docker: curl -sSL https://get.docker.com/ubuntu/ | sudo sh ,参考:Install Docker Engine
  2. 拉取镜像,docker pull jmcn/soapui-docker ,参考: https://github.com/JMcn/soapui-docker
  3. jenkins 项目设置中的构建步骤改为:
    Execute shell:
mkdir ${WORKSPACE}/report

sudo docker run --rm --add-host="host:ip" -v ${WORKSPACE}:/var/home jmcn/soapui-docker -l -c "testrunner.sh -Dfile.encoding=UTF-8 -I -r -j -f/var/home/report/ /var/home/soapui-project.xml"

项目构建触发条件:

  1. 定时运行,在项目中设置

    • Build periodically:相当于 linux 的 crontab,定时执行构建任务
    • Poll SCM:定时检查源码变更,有更新则 checkout 最新代码,然后执行构建
  2. 设置上游项目

    • 场景:接口代码更新构建后,执行一次自动化接口测试
    • 在接口的构建项目设置中添加 构建后操作, Build other projects ,选择要构建的项目以及触发条件

命令行参数:

  • ssh 到服务器运行安装目录下的 ./bin/testrunner.sh 即可查看参数具体说明,特别注意只能指定 soapui-project-file 的 xml 文件来运行,不能指定项目文件夹
  • 在Soapui图形界面中,右键 TestSuite 测试套件,Lauch 后查看 log 能找到 soapui 命令行的带参以及运行情况

testrunner

测试报告

  • pro 版可以生成 pdf 以及 html 的测试报告,但开源版只能对每个 TestSuite 生成 xml 文件,错误的请求详情以 txt 文件记录,所以,需要配合 jenkins 的 Publish JUnit test result report 步骤来展示报告,或邮件模板来展示
  • 添加 -a 参数无论错误还是正确的 testcase 都会生成 txt 文件记录请求详情
  • 添加 -I 参数:Do not stop if error occurs, ignore them
  • xml 文件中文名称不显示问题,需要在系统安装中文语言包并设置语言为 zh_CN.UTF-8