一、GoConvey 简介
GoConvey 是一个让测试更简单的实时测试反馈框架,它可以让您的测试更加容易编写、理解和组织,同时实时反馈让您在开发过程中节省了很多时间。
GoConvey 在 2013 年首次亮相,作者为 Chris Hines 。GoConvey 提供了一个简单、直观和可扩展的方式来编写测试并将测试结果实时反馈给开发人员。GoConvey 在 Go 语言测试框架中增强了 assertion 清晰度和可组织度,同时也提供了 BDD(行为驱动开发) 的支持。
二、使用 GoConvey
1. 安装
首先,您需要安装 GoConvey。在命令行工具中输入以下指令:
go get github.com/smartystreets/goconvey
2. 编写测试
GoConvey 基于 Go 的测试框架标准,只需要编写具有一些 assert 条件的代码,就可以在 GoConvey 中实时查看测试反馈。在 GoConvey 中,可以运行多个测试类,每个测试类都会显示在浏览器中的左侧导航栏中。这里我们简单介绍一下 GoConvey 的基本测试方法:
func TestAdd(t *testing.T) {
Convey("Given two numbers", t, func() {
a := 1
b := 2
Convey("When adding the numbers", func() {
result := a + b
Convey("The result should be 3", func() {
So(result, ShouldEqual, 3)
})
})
})
}
这就是 GoConvey 的基本测试方法。使用 Convey 方法编写了一个测试框架。Convey 的第一个参数是测试的名称,第二个参数是测试上下文,第三个参数是要执行的功能代码块。功能代码块中的第一个 Convey 函数表示给出了测试情景的描述(Given)。在这个例子中,它是给定两个数字。第二个 Convey 表示一个动作的执行(When)。在这里,这个动作是将这两个数字加在一起。最后的 Convey 表示对动作的验证(Then)。在这里,验证的结果是两个数字之和应该是 3。
当然,这只是一个简单的例子。更复杂的测试需要更多的代码以实现功能和测试的覆盖度。但是,GoConvey 提供了更复杂测试的实现方法,包括以下不同的测试类型:
- Convey( "Some full sentence representing functionality", func() { /*...*/ } )
- Convey( "Some sentence fragment", b )
- Convey( "Some sentence fragment", func() { c.So(x, c.ShouldEqual, 42) } )
从这些例子中可以看出,GoConvey 支持灵活的测试形式。基本结构足以处理陈述句和条件句,而这些陈述和条件可以实现复杂的测试。
3. 运行测试
运行测试的命令行如下所示:
goconvey
输入命令后,会在浏览器中打开 GoConvey 的运行页面。如果运行成功,所有的测试都会自动运行。如果测试失败,浏览器会给出反馈提示,您可以通过这个反馈信息找到错误。
4. 配置项
GoConvey 支持几种配置选项来修改默认行为,具体见以下代码:
So(true, ShouldBeTrue)
So(false, ShouldBeFalse)
So("Hello, GoConvey!", ShouldNotEqual, "Goodbye, GoConvey!")
这里的示例代码展示了三种不同的测试方法。第一个 So 方法测试了真值;第二个方法测试了假值;第三个测试方法比较两个字符串不相等。每个 So 方法都需要一个测试断言(ShouldBeTrue、ShouldBeFalse 或 ShouldNotEqual),该断言将与给定的值进行比较。如果断言失败,则测试会失败。
三、GoConvey 的优势
1. 实时反馈
GoConvey 可以在测试运行时实时地反馈结果,无需等待测试运行结束。这使得测试编写、调试和组织变得更加容易。
2. 容易看懂和编写
GoConvey 的结构基于自然语言的对话框架,使得测试用例变得容易编写、组织和阅读。同时,GoConvey 与 Go 的测试框架完全一致,所以您已经多少熟悉了一些基本的测试编写语法和结构。
3. 支持 BDD
GoConvey 支持 BDD(行为驱动开发),它利用自然语言的模式描述代码功能和行为。这让测试更加可读性、更容易编写,也让开发人员、测试人员和客户之间的协作变得更加容易。
4. 提供高级功能
GoConvey 提供了一些高级功能,如代码覆盖率、HTML 报告和可视化比较。这些功能都以后端命令行工具或前端浏览器插件的形式提供,在测试开发过程中增加了更多的灵活性和可扩展性。
结语
总之,GoConvey 为 Go 语言的测试框架带来了一些重要的优势,这些优势主要体现在改善测试编写、组织和运行的方面。总的来说,GoConvey 对于开发人员、测试人员和 QA 团队都是非常有用的。使用它可以大大节约时间和精力。
完整的代码示例:
package example
import (
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func TestAdd(t *testing.T) {
Convey("Given two numbers", t, func() {
a := 1
b := 2
Convey("When adding the numbers", func() {
result := a + b
Convey("The result should be 3", func() {
So(result, ShouldEqual, 3)
})
})
})
Convey("Given a string", t, func() {
str := "Hello, GoConvey!"
Convey("When check the string length", func() {
strLen := len(str)
Convey("The length should be 15", func() {
So(strLen, ShouldEqual, 15)
})
})
Convey("When change the string lowercase", func() {
result := strings.ToLower(str)
Convey("The result should be \"hello, goconvey!\"", func() {
So(result, ShouldEqual, "hello, goconvey!")
})
})
})
}