Tony Bai

Tony Bai -

使用go test框架驱动的自动化测试

本文永久链接 – https://tonybai.com/2023/03/30/automated-testing-driven-by-go-test 一. 背景 团队的测试人员稀缺,无奈只能“自己动手,丰衣足食”,针对我们开发的系统进行自动化测试,这样既节省的人力,又提高了效率,还增强了对系统质量保证的信心。 我们的目标是让自动化测试覆盖三个环境,如下图所示: 我们看到这三个环境分别是: CI/CD流水线上的自动化测试 发版后在各个stage环境中的自动化冒烟/验收测试 发版后在生产环境的自动化冒烟/验收测试 我们会建立统一的用例库或针对不同环境建立不同用例库,但这些都不重要,重要的是我们用什么语言来编写这些用例、用什么工具来驱动这些用例。 下面看看方案的诞生过程。 二. 方案 最初组内童鞋使用了YAML文件来描述测试用例,并用Go编写了一个独立的工具读取这些用例并执行。这个工具运作起来也很正常。但这样的方案存在一些问题: 编写复杂 编写一个最简单的connect连接成功的用例,我们要配置近80行yaml。一个稍微复杂的测试场景,则要150行左右的配置。 难于扩展 由于最初的YAML结构设计不足,缺少了扩展性,使得扩展用例时,只能重新建立一个用例文件。 表达能力不足 我们的系统是消息网关,有些用例会依赖一定的时序,但基于YAML编写的用例无法清晰地表达出这种用例。 可维护性差 如果换一个人来编写新用例或维护用例,这个人不仅要看明白一个个百十来行的用例描述,还要翻看一下驱动执行用例的工具,看看其执行逻辑。很难快速cover这个工具。 为此我们想重新设计一个工具,测试开发人员可以利用该工具支持的外部DSL文法来编写用例,然后该工具读取这些用例并执行。 注:根据Martin Fowler的《领域特定语言》一书对DSL的分类,DSL有三种选型:通用配置文件(xml, json, yaml, toml)、自定义领域语言,这两个合起来称为外部DSL。如:正则表达式、awk, sql、xml等。利用通用编程语言片段/子集作为DSL则称为内部dsl,像ruby等。 后来基于待测试的场景数量和用例复杂度粗略评估了一下DSL文法(甚至借助ChatGPT生成过几版DSL文法),发现这个“小语言”那也是“麻雀虽小五脏俱全”。如果用这样的DSL编写用例,和利用通用语言(比如Python)编写的用例在代码量级上估计也不相上下了。 既然如此,自己设计外部DSL意义也就不大了。还不如用Python来整。但转念一想,既然用通用语言的子集了,团队成员对Python又不甚熟悉,那为啥不回到Go呢^_^。 让我们进行一个大胆的设定:将Go testing框架作为“内部DSL”来编写用例,用go test命令作为执行这些用例的测试驱动工具。此外,有了GPT-4加持,生成TestXxx、补充用例啥的应该也不是大问题。 下面我们来看看如何组织和编写用例并使用go test驱动进行自动化测试。 三. 实现 1. 测试用例组织 我的《Go语言精进之路vol2》书中的第41条“有层次地组织测试代码”中对基于go test的测试用例组织做过系统的论述。结合Go test提供的TestMain、TestXxx与sub test,我们完全可以基于go test建立起一个层次清晰的测试用例结构。这里就以一个对开源mqtt broker的自动化测试为例来说明一下。 注:你可以在本地搭建一个单机版的开源mqtt broker服务作为被测对象,比如使用Eclipse的mosquitto。 在组织用例之前,我先问了一下ChatGPT对一个mqtt broker测试都应该包含哪些方面的用例,ChatGPT给了我一个简单的表: 如果你对MQTT协议有所了解,那么你应该觉得ChatGPT给出的答案还是很不错的。 这里我们就以connection、subscribe和publish三个场景(scenario)来组织用例: $tree [...]

本文介绍了基于go test驱动的自动化测试的实现方法,包括测试用例的编写和组织、测试执行和报告生成。团队通过这种方法实现了自动化测试的目标,并能够快速定位错误。文章还提到了方案的不足之处和解决方法。

go test 测试报告 测试用例 自动化测试 错误定位

相关推荐 去reddit讨论

热榜 Top10

eolink
eolink
观测云
观测云
LigaAI
LigaAI
Dify.AI
Dify.AI

推荐或自荐