一、自动化测试框架
1.1自动化测试与自动化测试框架
自动化测试是指通过自动化工具对软件应用程序进行各种测试。技术角度而言,自动化测试框架是一组定制的、用来执行脚本化测试和全面报告测试结果的交互式组件。
1.2测试级别
可以在不同的测试级别编写自动化测试,如单个函数或类、集成组件组、整个系统等。
单元测试(Unit Tests)是对单个功能或类进行测试,单元测试应该尽可能详尽并覆盖所有代码路径。单元测试通常是数据驱动的风格——定义多组输入参数和预期输出,再迭代测试每个输入/输出对。
集成测试(Integration Tests)是测试可独立工作的系统但愿与其他单元的代码交互。集成测试不用详尽测试输入输出,而是侧重于测试该单元如何通过事务流进行交互(单元间的依赖关系)。
系统测试(System Tests)是在类似生产环境中测试整个系统,用于发现仅在生产环境中才会出现的问题。
除此之外,还有性能测试/性能测试(Stress Tests)。
1.3自动化测试框架类型
二、Go自动化测试
2.1单元测试
testing标准库
Go语言提供了标准库testing用于单元测试和性能测试。在针对Go代码的单元测试中,主要有以下规则:
名称 |
说明 |
依赖 |
import testing |
命令 |
在待测脚本目录下执行go test命令 |
测试文件名 |
必须以_test.go结尾 |
功能测试用例函数 |
必须以Test开头,并且是大驼峰写法 |
性能测试用例函数 |
必须以Benchmark开头,并且是大驼峰写法 |
功能测试参数 |
*testing.T |
性能测试参数 |
*testing.B |
记录测试信息 |
命令go test默认情况不会记录,需要显式使用go test -v |
测试控制 |
通过t.Error、t.Errorf、t.FailNow、t.Fatal、t.FatalIf等进行断言。 t.Log(“***”)、t.Logf(“***”):用于日志输出。 t.Fail():标记用例失败,但仍继续执行当前用例。 t.FailNow():标记用例失败并立即停止执行当前用例,执行下一个用例。 t.Error():等价于Log+Fail。 t.Errorf():等价于Logf+Fail。 t.SkipNow():标记跳过并停止执行该用例,继续执行下一用例。 t.Skip():等价于Log+SkipNow。 t.Skipf():等价于Logf+SkipNow。 t.Skipped():返回用例是否被跳过。 |
性能测试 |
命令go test默认情况不会进行性能测试,需要显式使用go test -test.bench |
go test参数解读 |
go test [-c] [-i] [build/test flags] [packages] [build/test flags & test binary flags] -c:编译go test为可执行二进制文件,但不测试。 -i:安装测试包依赖的package,但不测试。 build flags:编译运行过程中使用的参数,可以go help build查看。 packages:关于包管理,可以go help packages查看。 -test.v:输出全部单元用例测试记录。默认情况只输出失败的单元测试用例。 -test.run pattern:只跑哪些单元测试用例。 -test.bench pattern:只跑哪些性能测试用例。 -test.benchmem:在压测时输出内存情况。 -test.cpuprofile cpu.out:输出cpu性能分析文件。 -test.memprofile mem.out:输出内存性能分析文件。 -test.parallel n:压测的并行cpu数,默认等于GOMAXPROCS。 -test.timeout t:若用例运行时间超过t,则抛出panic。 |
Goconvey库
Testify库
testing标准库在进行断言和错误信息输出时需要自己编写各种条件判断,再根据结果决定输出对应的信息。而Testify提供了很多函数可以做断言和错误信息输出,核心内容有:
- assert:断言
- mock:测试替身
- suite:测试套件
2.2 集成测试
单元测试多为数据驱动且详尽的,而集成测试侧重于一系列调用组合。Go静态类型使得构建模拟变得困难。解决方法可以有面向接口、mock依赖的解决方案。在敏捷软件开发中,测试驱动开发和行为驱动开发是常使用的方法和设计方法论。
测试驱动开发(TDD)是指开发先根据功能规范编写自动化测试,然后通过仅添加使测试通过的代码来实现功能。
行为驱动开发(BDD)是通过自然语言定义系统行为,从使用者角度编写需求场景,这些行为描述可以直接形成需求文档和测试标准。BDD更关注需求的功能而非实际结果。
Ginkgo是Go的BDD测试框架,集成了Go原生库。Ginkgo还和断言、mock套件testify、富测试集go-check兼容。Ginkgo的建议是和gomega库一起使用。
Ginkgo概览
Ginkgo常见功能如下图所示,其主要模块为Describe、Context、It、BeforeEach、AfterEach、JustBeforeEach、JustAfterEach 、BeforeSuite、AfterSuite、By、Fail。
Ginkgo实践
步骤1:配置Goland
步骤2:下载Ginkgo和Gomega
步骤3:安装Ginkgo
步骤4:使用Ginkgo
三、Python自动化测试
3.1测试框架
Unittest/PyUnit
Unittest是python标准库自带的单元测试框架,也被称为pyunit。
Nose/nose2
nose是第三方单元测试框架,完全兼容unittest。
Pytest
三者对比
四、自动化:Golang vs Python
要点 |
Golang |
Python |
自动发现用例 |
testing、goconvey支持 |
unittest、nose、pytest均支持 |
指定用例执行 |
testing、goconvey支持 |
unittest、nose、pytest均支持 |
支持assert断言 |
testing使用官方断言+条件判断; goconvey使用内置断言; ginkgo使用内置断言+gomega断言。 |
unittest < nose < pytest |
支持fixture |
ginkgo支持 |
unittest、nose、pytest均支持 |
fixture种类 |
ginkgo支持前置和清理 |
unittest、nose支持前置和清理; pytest还支持自定义fixture。 |
fixture生效级别 |
ginkgo:suite、class、case |
unittest、nose:case、class、module; pytest:case、class、module、package、session。 |
支持用例跳过或预计失败 |
goconvey:通过skipConvey、SkipSo方法。 ginkgo:通过X、F、P前缀。 |
unittest、nose、pytest均支持 |
子测试 |
-- |
unittest、nose、pytest均支持 |
测试结果导出 |
testing默认在终端打印TXT报告,另需要依赖三方库goreporter、go-test-report生成测试报告; goconvey同上,另外支持Web界面测试报告; ginkgo一般生成Junit XML测试报告。 |
unittest、nose、pytest均可以,pytest更鲜明。 |
插件 |
一般常见的有,但是没有python丰富。 |
unittest、nose一般,pytest丰富。 |
钩子 |
-- |
pytest支持。 |
社区生态 |
-- |
unittest官方维护,nose活跃度低,pytest活跃度高。 |
针对go语言的单元测试,go具有自己的标准单元测试库testing进行功能测试和性能测试。目前,基于testing的自动化测试在断言和结果判断的处理上会很复杂。而testify库提供了丰富且编写简单的断言函数,可以在自动化测试中使用testify库;此外,testify库还提供了suite来构建测试套件、http来测试http服务器,也支持简单的mock来模拟测试数据。但是testify暂未形成一个明确的框架,在实际使用中仍多使用它的断言功能。goconvey库也提供了断言函数,并且提供了测试用例包裹函数,除了命令行方式,goconvey库还提供Web界面方式,比较友好。在简单实践时感觉goconvey整体仍然比较简单,没有提供相应的测试套件、测试脚手架(fixture),因此可以用做单元测试,但并不适合做集成测试。
针对go的集成测试自动化有ginkgo框架,该框架目前是k8s进行端到端测试使用。结合ginkgo和gomega库能够提供完整的测试例编写、断言、测试例标签(X\F\P)、测试结果导出(Junit的XML格式)。此外还调研了python的自动化框架,目前针对go自动化测试框架并没有像python一样拥有较为丰富的插件体系,测试结果的导出格式一般为Junit XML格式。
以上是基于go和python的自动化测试框架相关知识。