前言

上一篇文章说到我还开发了一个独立的自动测试工具,可以根据 OpenAPI 的文档来测试,并且在测试完成后输出测试报告,报告内容包括每个接口是否测试通过和响应时间等。

这个工具我使用了 go 语言开发,主要是考虑到了 go 语言可以傻瓜式的实现交叉编译,生成的可执行文件直接上传到服务器就可以执行,非常方便。

为了避免篇幅太长,本文先介绍用到的组件,详细实现以及解析 OpenAPI 文档生成测试配置的部分后续的文章再介绍。

网络请求

标准库中的 net/http 包提供了发送 HTTP 请求的功能,拿到数据之后,使用 json.Unmarshal 函数解析 JSON 数据。这个包相对比较低级,对于简单的网络请求,够用,不过我还是想选择更好用的组件。

Resty 是一个简单而强大的 Go HTTP 客户端,具有链式 API,可以轻松地发送 HTTP 请求并处理 JSON 数据。它提供了丰富的功能,包括自动重试、超时设置、请求和响应日志等。您可以使用 Resty 来发送 GET、POST、PUT、DELETE 等各种类型的请求,并且它能够自动将响应的 JSON 数据解析为 Go 结构体。

现在出了 v2 版本,支持 HTTP/2、WebSocket、Cookie 操作,并提供了更加简洁和易用的 API 。

项目地址: https://github.com/go-resty/resty

使用起来还行

GET 方法

import 	"github.com/go-resty/resty/v2"

req := c.RestyClient.R().SetHeader("Authorization", "token "+c.AuthToken)

req.SetQueryParams(map[string]string{
"year": "2024",
})
resp, err = req.Get("path")

POST 方法

req.SetBody(map[string]string{
"year": "2024",
})
resp, err = req.Get("path")

SetBody 的参数是 interface{} 类型,可以传入的类型比较丰富,我这里还是跟 GET 一样传了字典,实际上应该传 struct 比较多一些吧。

日志组件

我之前用的是 go 语言内置的 log ,但似乎功能很少,也没有日志等级啥的,这能叫日志库吗……

接着我找到了在 GitHub 上 star 很多的 logrus 库,不过感觉这是一个比较古老的库了,不太好用,formatter 也没找到好用的,看项目主页的介绍发现这个库已经进入退休状态…

它让我 Check out, for example, Zerolog, Zap, and Apex.

Logrus is in maintenance-mode. We will not be introducing new features. It's simply too hard to do in a way that won't break many people's projects, which is the last thing you want from your Logging library (again...).

项目地址: https://github.com/sirupsen/logrus

所以,最终还是用了 uber 的日志库 go.uber.org/zap

logrus 使用 & 配置

虽然后面换了 zap ,还是记录一下关于 logrus 的使用。

项目主页上列举的几个第三方 formatter 我基本都试用了,就这个 nested-logrus-formatter 比较好用。

以下配置实现了同时输出日志到控制台和文件。

import (
nested "github.com/antonfisher/nested-logrus-formatter"
"github.com/sirupsen/logrus"
"os"
) func initLogger() *os.File {
logger.SetLevel(logrus.DebugLevel)
logger.SetReportCaller(true)
logger.SetFormatter(&nested.Formatter{}) // 创建一个文件作为日志输出
file, err := os.OpenFile("logfile.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
logger.Fatalf("无法打开日志文件: %v", err)
} // 创建一个多写入器,将日志同时输出到控制台和文件
mw := io.MultiWriter(os.Stdout, file) // 添加 Hook 到 Logger 中
logger.Out = mw return file
} func main() {
file := initLogger()
defer func(file *os.File) {
err := file.Close()
if err != nil {
fmt.Println(err)
}
}(file)
}

zap 使用 & 配置

zap 比起 logrus 好用多了,开箱即用,搭配 zapcore 可以配置多个输出,也可以设置按日志大小分割文件,还可以对接其他日志收集平台啥的,基本做到了现代日志组件的水平了…

一样是实现了同时输出日志到控制台和文件。

import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
) func buildLogger() *zap.SugaredLogger {
config := zap.NewProductionEncoderConfig()
config.EncodeTime = zapcore.ISO8601TimeEncoder
consoleEncoder := zapcore.NewConsoleEncoder(config)
fileEncoder := zapcore.NewJSONEncoder(config)
logFile, _ := os.OpenFile("./log-test-zap.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 06666) tee := zapcore.NewTee(
zapcore.NewCore(fileEncoder, zapcore.AddSync(logFile), zap.DebugLevel),
zapcore.NewCore(consoleEncoder, zapcore.AddSync(os.Stdout), zap.DebugLevel),
)
var zapLogging = zap.New(
tee,
zap.AddCaller(),
zap.AddStacktrace(zapcore.ErrorLevel),
) var logger = zapLogging.Sugar()
return logger
} func main() {
logger := buildLogger()
defer logger.Sync()
}

swagger 组件

这里我试着用了一下 go swagger

项目地址: https://github.com/go-swagger/go-swagger

这个可以使用 scoop 安装

scoop install go-swagger

用着一般,没有 swagger code generator 好用。

就没继续探索下去了。

PS: Jetbrains 系的 IDE 里有几成 swagger code generator 工具,功能非常强大,可以生成各种代码。

不过我还是自己实现了OpenAPI 文档解析(比较灵活),所以暂时还没用上这个强大的工具。

Excel 导出

Excel 操作我用的是这个 github.com/xuri/excelize/v2

一开始没注意,后面发现这个居然是奇安信开源的…… 然后看了 qax-os 这个 group ,发现开源的几个项目都是跟安全无关的,不务正业啊老哥!

没有对比其他的,看着 star 挺多,上手就直接用了

感觉还行。

func exportTestReportsToExcel(testReports []*tester.Report, filename string) error {
// 创建一个新的 Excel 文件
f := excelize.NewFile() // 创建一个名为 "测试报告" 的工作表
index, err := f.NewSheet("测试报告")
if err != nil {
return err
} // 设置工作表列名
f.SetCellValue("测试报告", "A1", "接口名称")
f.SetCellValue("测试报告", "B1", "接口路径")
f.SetCellValue("测试报告", "C1", "测试是否通过")
f.SetCellValue("测试报告", "D1", "耗时(秒)") // 遍历测试报告并在工作表中写入数据
for i, report := range testReports {
row := i + 2
f.SetCellValue("测试报告", fmt.Sprintf("A%d", row), report.ApiName)
f.SetCellValue("测试报告", fmt.Sprintf("B%d", row), report.ApiPath)
f.SetCellValue("测试报告", fmt.Sprintf("C%d", row), func() string {
if report.IsPassed {
return "是"
}
return "否"
}())
f.SetCellValue("测试报告", fmt.Sprintf("D%d", row), report.Elapsed.Seconds())
} // 设置活动工作表
f.SetActiveSheet(index) // 将 Excel 文件保存到磁盘
err = f.SaveAs(filename)
if err != nil {
return err
} return nil
}

吐槽

三元表达式

我很想吐槽 go 为啥没有三元表达式,用匿名函数真的好繁琐啊!!

据说是因为觉得三元表达式可以写出很多让人看不懂的骚代码,所以 go 不打算支持,因噎废食啊

不过这难不倒我,可以写个函数来模拟,而且现在 go 似乎更新了泛型的功能,不用再拿 interface 来模拟

func If[T any](condition bool, trueVal, falseVal T) T {
if condition {
return trueVal
}
return falseVal
}

使用的时候就

result := If[string](report.IsPassed, "成功", "没通过")

支持类型推导,所以 [string] 也可以省略了。

这样前面导出 Excel 的代码里的匿名函数就可以改成这样,简洁多了!

f.SetCellValue("测试报告", fmt.Sprintf("C%d", row), If(report.IsPassed, "是", "否"))

数组排序

本来也不算什么吐槽,属于是挑刺了,go 的排序没那么好用,但也不难用。

用匿名函数可以实现按字段排序,这倒是和 C 语言里用函数指针大同小异,不愧是带 gc 的 C 语言

测试报告的数据结构是这样

// Report 测试报告
type Report struct {
ApiName string
ApiPath string
IsPassed bool
Elapsed time.Duration
Response *ApiResponse
}

我想对 []*Report 数组排序,可以用 sort.Slice 方法

// 按照 Elapsed 属性排序,从大到小
sort.Slice(testReports, func(i, j int) bool {
return testReports[i].Elapsed > testReports[j].Elapsed
})

相比之下还是 cs 的 Linq 舒服啊

testReports.Sort((a, b) => a - b);

小结

就这样吧,很简单的一个小工具,因为还处在 go 的小白阶段,每用一个新的库都会记录一下。

参考资料

使用go语言开发自动化API测试工具的更多相关文章

  1. 国人开发的api测试工具 ApiPost

    挺好用的 ApiPost https://www.apipost.cn/download.html 需要注册,免费试用.感觉比postman好用

  2. 如何选择API测试工具

    没有最好,只有最合适. 如今,越来越多的公司正在向DevOps的方向左转,以实现持续集成和持续部署开发.这意味着我们的反馈需要比以往更快,以便确定我们的应用程序是否准备好交付.这就是API测试如此重要 ...

  3. 开源API测试工具 Hitchhiker v0.7更新 - Schedule的对比diff

    Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持Schedule, 数据对比,压力测试,支持脚本定制请求,可以轻松部署到本地,和你的team成员一起协作测试Ap ...

  4. API测试工具SoapUI & Postman对比分析

    本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 最近公司要引入API测试工具,经过调查和了解,最终决定在SoapUI ...

  5. 开源API测试工具 Hitchhiker v0.10 - 中文版

    Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持自动化测试, 数据对比,压力测试,支持脚本定制请求,可以轻松部署到本地,和你的team成员一起协作测试Api. ...

  6. 自动化兼容性测试工具——WeTest

    这个作业属于哪个课程 2021春软件工程实践|W班(福州大学) 这个作业要求在哪里 软件工程实践总结&个人技术博客 这个作业的目标 分享自动化兼容性测试工具的使用 其他参考文献 ... 目录 ...

  7. Aliexpress API 测试工具

    Aliexpress API 测试工具 上回简单说了 Aliexpress API 的认证流程, 这回在奉送一个小工具, API 测试工具. 点我下载 做这一行,和做程序员的生活完全不搭调, 格格不入 ...

  8. 开源API测试工具 Hitchhiker v0.4更新 - 没有做不到,只有想不到

    Hitchhiker 是一款开源的 Restful Api 测试工具,支持Schedule, 数据对比,压力测试,支持上传脚本定制请求,可以轻松部署到本地,和你的team成员一起管理Api. 详细介绍 ...

  9. 开源API测试工具 Hitchhiker v0.5更新 - 完善细节

    Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持Schedule, 数据对比,压力测试,支持上传脚本定制请求,可以轻松部署到本地,和你的team成员一起管理Ap ...

  10. 开源API测试工具 Hitchhiker v0.6更新 - 改进压力测试

    Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持Schedule, 数据对比,压力测试,支持上传脚本定制请求,可以轻松部署到本地,和你的team成员一起协作测试 ...

随机推荐

  1. Go 跟踪函数调用链,理解代码更直观

    Go 跟踪函数调用链,理解代码更直观 目录 Go 跟踪函数调用链,理解代码更直观 一.引入 二.自动获取所跟踪函数的函数名 三.增加 Goroutine 标识 四.让输出的跟踪信息更具层次感 五.利用 ...

  2. P9779_[HUSTFC 2023] 不定项选择题_题解

    rt 题目 有一道共 n 个选项的不定项选择题,它的答案至少包含一个选项,由于题目与选项的内容晦涩难懂,你打算通过尝试每一种可能的答案来通过这道题. 初始时所有选项都没有被勾选,你可以执行任意次下述操 ...

  3. 设计模式学习-使用go实现命令模式

    命令模式 定义 优点 缺点 适用范围 代码实现 命令模式对比策略模式 参考 命令模式 定义 命令模式(Command):将一个请求封装成一个对象,从而是你可用不同的的请求对客户进行参数化:对请求排队或 ...

  4. 小白学k8s(3)什么是内网穿透

    什么是内网穿透 内网穿透 工作方式 通信的一方处于内网 通信的双方都处于内网 NAT穿透的原理 UDP内网穿透的实现流程 参考 什么是内网穿透 内网穿透 什么是内网穿透呢? 百度百科的描述 内网穿透, ...

  5. 7.4 C/C++ 实现链表栈

    相对于顺序栈,链表栈的内存使用更加灵活,因为链表栈的内存空间是通过动态分配获得的,它不需要在创建时确定其大小,而是根据需要逐个分配节点.当需要压入一个新的元素时,只需要分配一个新的节点,并将其插入到链 ...

  6. ROS节点通信(二)service和client

    目录 1.说明 2.创建功能包 3.自定义通信数据类型 4.编写代码 5.编译配置 5.1.CMakeLists.txt 5.2.package.xml 6.编译运行 1.说明 ROS的节点通信模式有 ...

  7. 《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(1)-初识Wireshark

    1.简介 前边已经介绍过两款抓包工具,应该是够用了,也能够处理在日常工作中遇到的问题了,但是还是有人留言让宏哥要讲解讲解Wireshark这一款抓包工具,说实话宏哥之前也没有用过这款工具,只能边研究边 ...

  8. Unity框架中的核心类

    组件:Component 在Unity中,所有的游戏对象都可以挂载组件.组件控制着游戏对象的行为和外观,例如渲染.动画.碰撞检测等. 而Component就是组件的基类,提供了一些通用的方法和属性,例 ...

  9. Windows、MacOs上 gif 录像软件 LICEcap

    LICEcap 官网:https://www.cockos.com/licecap/ 适用于 windows macos 我自己保持的一版,下载地址:https://files-cdn.cnblogs ...

  10. LVM(逻辑卷管理器)

    目录 一.LVM概述 二.基本术语 三.PE.PV.VG.LV之间的关系 四.LVM的工作原理 五.LVM的使用 1.部署逻辑卷 第一步: 还原快照,并在虚拟机添加两块新硬盘设备,开机 第二步: 让新 ...