前言

使用go语言做开发差不多快一年了,主要用来写后端Web服务,从一开始吐槽他的结构体,比如创建个复杂的JSON格式数据,那是相当的痛苦。还有 err 处理写的巨麻烦。

当然,go 也有爽的地方,创建个线协程简直太简单了。

到后来慢慢接受,觉得效率还行,因为是静态强类型语言,在修改完项目代码之后,反而很有信心(如果出现低级的类型错误,直接编译出错了),相比 Python 就要反复检查两边,对修改的代码总时心里发虚。

go语言测试相关的东西都不咋地,比如自带的测试框架相比较 pytest 那是相当的简陋。今年开始给后端写单元测试(其实应该叫接口测试),发现 apitest库 眼前一亮。采用链式调用,和 HttpRunner 3.x 的链式调用颇有几分相似。

  • HttpRunner 3.x
# httprunner 3.x
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase class TestCaseTestCase(HttpRunner): config = Config("basic test config").base_url("http://127.0.0.1:8000/api") teststeps = [
Step(
RunRequest(" test_add_event_all_null")
.post("/add_event/")
.with_data({"eid": "", "limit": "", "address": "", "start_time": ""})
.validate()
.assert_equal("body.status", 10021)
.assert_equal("body.message", "parameter error")
)
] if __name__ == "__main__":
TestCaseTestCase().test_start()

apitest 测试库

一个简单且可扩展的行为测试库。

测试库: https://github.com/steinfletcher/apitest jsonpath库: github.com/steinfletcher/apitest-jsonpath

  • 简单的get接口
package api

import (
"net/http"
"testing"
"time" "github.com/steinfletcher/apitest"
) func Client() http.Client {
cli := &http.Client{
Timeout: time.Second * 10,
}
return *cli
} func TestGetSample(t *testing.T) {
cli := Client()
apitest.New().
EnableNetworking(&cli).
Get("http://httpbin.org/get").
Expect(t).
Status(http.StatusOK).
End()
}

New(): 创建一个新的API测试。

EnableNetworking(): EnableNetworking为提供的客户端启用网络,需要一个 http.Clinet。

Get(): 发送get 请求,需要一个URL。

Expect(): Expect将请求规范标记为完整。

Status(): 断言http状态。http.StatusOK = 200

End(): End运行测试,将结果返回给调用者。

  • get接口带参数
import (
...
jsonpath "github.com/steinfletcher/apitest-jsonpath"
) ... func TestGetParams(t *testing.T) {
cli := Client()
apitest.New().
EnableNetworking(&cli).
Intercept(func(req *http.Request) {
req.URL.RawQuery = "id=1&name=jack"
}).
Get("http://httpbin.org/get").
Expect(t).
Assert(
jsonpath.Contains(`$.args.id`, "1")).
Assert(
jsonpath.Equal(`$.args.name`, "jack")).
End()
}

req.URL.RawQuery: 用于定义get请求参数。

Assert() ,方法用于断言。

jsonpath 提供了断言方法,Contains判断包含,Equal判断相等。

  • post接口Form-data参数
...

func TestPostFormData(t *testing.T) {
cli := Client()
apitest.New().
EnableNetworking(&cli).
Post("http://httpbin.org/post").
FormData("key1", "value1").
FormData("key2", "value2").
Expect(t).
Assert(
jsonpath.Chain().
Equal(`$.form.key1`, "value1").
Equal(`$.form.key2`, "value2").
End()).
End()
}

FormData() 用于设置form-Data格式的参数。

jsonpath 提供的断言同样支持链式调用。

  • post接口JSON参数
...

func TestPostJson(t *testing.T) {
cli := Client()
apitest.New().
EnableNetworking(&cli).
Post("http://httpbin.org/post").
JSON(`{"message": "hi"}`).
Expect(t).
Assert(
jsonpath.Chain().
Contains(`$.data`, "message").
Contains(`$.data`, "hi").
End()).
End()
}

JSON() 用于设置JSON()请求方法。

apitest 评价

官网:https://apitest.dev/

apitest 在完成http接口测试方面还是非常方便的,如果你被 go语言的 http 库蹂躏过一段时间之后感触更深;怎么说了,比如你经常被老板PUA,突然有一天老板居然当面表扬了你,大概就这种感觉。

go测试库之apitest的更多相关文章

  1. Gremlins.js – 模拟用户随机操作的 JS 测试库

    Gremlins.js 是基于 JavaScript 编写的 Monkey 测试库,支持 Node.js 平台和浏览器中使用.Gremlins.js 随机模拟用户操作:单击窗口中的任意位置,在表格中输 ...

  2. poium测试库介绍

    poium测试库前身为selenium-page-objects测试库,我在以前的文章中也有介绍过:这可能是最简单的Page Object库,项目的核心是基于Page Objects实现元素定位的封装 ...

  3. robotframework导入测试库使用方法

    1.新建一个测试库 course_mgr.py,存在一个函数listCourse 2.新建RF测试用例使用listCourse关键字 导入测试库如下方式 course_mgr若存在上级目录,则需要加上 ...

  4. Robot Framework - 4 - 创建和扩展测试库的示例

    创建和扩展Library的示例 示例:Check status on Linux OS 创建与使用library的基本步骤:           1--- library实现的内容和实现的方式     ...

  5. Robot Framework - 3 - 测试库API

    08- 创建测试库--发布测试库 ***** 测试库文档 为了便于维护,测试库文档应该从源代码中生成. Robot  Framework 有自己的文档工具 libdoc.py生成 API 文档. 一个 ...

  6. Robot Framework - 2 - 创建测试库

    04- 创建测试库--基础概念 Robot Framework 实际的测试能力是由测试库提供的. ***** 支持的编程语言 Robot Framework 自身是用 Python 编写的,能使用 P ...

  7. Robot Framework - 1 - 测试用例与测试库

    01- 关于测试库(Test libraries) Test libraries provide the actual testing capabilities to Robot Framework ...

  8. 关于Django启动创建测试库的问题

    最近项目迁移到别的机器上进行开发,启动Django的时候,有如下提示: Creating test database for alias 'default' 其实这个可能是在Django启动按钮的设置 ...

  9. logminer使用测试库进行挖掘分析,10.2.0.5

    上一篇测试是在dg环境进行测试挖掘,但是如果客户存在一个测试库,那样使用日志挖掘的影响性更小.本篇进行测试分析. 测试环境介绍: oracle linux  5.6,vmware虚拟机,安装两套单实例 ...

  10. ODOO区分测试库和正式库的简单方法

    ODOO区分测试库和正式库的简单方法.1. 打开 开发者模式,右上角能显示数据库名称,缺点是,太耗系统资源了,数据多的时候就明显感觉慢了.2. 安装社区的显示测试帐套的模块, 若是正式环境还是尽量少装 ...

随机推荐

  1. shrding-jdbc分表引起的坑

    1.sum等函数不能解析,报错 2.3.1版本,分页,计算出错,第二页以后数据出现问题 3.4.1版本,创建索引添加"`"关键字报错,因为会给索引名拼接上表名,组装后的sql错误.

  2. java: javacTask: 源发行版 8 需要目标发行版 1.8

    idea同一工作空间中不同工程使用不同的jkd版本.在本地idea同时使用jdk1.7和jdk1.8,不同的java工程使用不同的jdk版本,但是在java代码编译时报错,其报错信息为:[java: ...

  3. 使用Python+Appium+夜神模拟器,并连接uiautomatorviewer

    本文不介绍安装步骤,实在是太多博文了 一.安装 Python:3.8 Appium:1.22.3 夜神模拟器 node JDK1.8 SDK 二.成功连接模拟器 PytCharm代码如下: # cod ...

  4. js指南

    1.for /in: 与for/of相比,可迭代对象不同,in后面可以是任意对象.数组.字符串.集合和映射可迭代. object.keys()   object.values()   object.e ...

  5. windows监控web程序连接数

    运行: win+R->perfmon.msc 右键,添加计数器 选择webservice中的current connection选项,再选中对应实例即可~

  6. 火狐浏览器调试eval源码

    火狐浏览器调试eval源码 firefox浏览器在网页调试上,有一个没法和chrome一比高下的功能,就是eval脚本的调试,有时前端架构使用了基于eval的方式,有时候可能是自己一个多行函数,每每遇 ...

  7. day1 第一个程序“Hello world!”

    程序运行机制 源程序(.java文件)->java编译器->字节码(.class文件)->类装载器->字节码校验器->解释器->操作系统平台Java源码后缀名:.j ...

  8. 解决 SMTP Error: data not accepted php邮件发送失败的问题

    php 发送邮件 出现  SMTP Error: data not accepted   1.正常情况下 都是正常的 但是偶尔 发送失败了 163.com 邮箱发送不了了. 所以去查了下问题所在  在 ...

  9. luffy项目全局配置

    一:media文件夹配置 settings.dev下配置media文件夹,暴露资源 media_path=BASE_DIR.parentMEDIA_ROOT=Path(media_path).join ...

  10. NDVI批量处理排除值-3000

    代码如下: import arcpy from arcpy import env from arcpy.sa import * import sys reload(sys) sys.setdefaul ...