现在呢,你一定已经把你的代码放在了安全的地方,并做了测试.在编码期间做测试能帮助你发现bug.在本节中,使用hello函数来做测试.
Go语言内置单元测试,以方便你即使测试代码,具体来说,使用命名规范、Go的test包和Go test命令,您可以快速编写和执行测试。
在greeting路径下,创建一个名为 greetings_test.go的文件
文件名以_test.go结尾,是用来告诉go test命令 这个文件包含test函数
在greeting_test.go,粘贴下面的代码
package greetings import ( "testing" "regexp" ) // TestHelloName calls greetings.Hello with a name, checking // for a valid return value. func TestHelloName(t *testing.T) { name := "Gladys" want := regexp.MustCompile(``+name+``) msg, err := Hello("Gladys") if !want.MatchString(msg) || err != nil { t.Fatalf(`Hello("Gladys") = %q, %v, want match for %#q, nil`, msg, err, want) } } // TestHelloEmpty calls greetings.Hello with an empty string, // checking for an error. func TestHelloEmpty(t *testing.T) { msg, err := Hello("") if msg != "" || err == nil { t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err) } }
这片代码:
- 实现了test函数
- 创建了两个测试函数为了测试greetings.Hello函数,测试函数名称的格式是 TestName, Name表述了具体做哪项测试,此外,测试函数 有个指针参数testing 它来源于testing包,你可以使用这个参数方法,来报告和记录你的测试.
- 实现了两个测试
TestHelloName调用了Hello函数,传入一个name值应该能返回一个响应消息,如果这个调用返回了一个错误或意外相应消息,你可以使用 t 参数的Fatalf 方法来将消息打印到控制台并结束执行。
TestHelloEmpty调用Hello函数,传入一个空字符串,这个测试是用来确认你的错误处理能正常工作,如果这个调用返回了一个非空错误或没有返回错误,你可以使用t 参数的Fatalf方法,将详细打印到控制台并结束执行.
3.在greeting路径的命令提示符下,运行go test命令,来执行测试
go test命令执行测试文件(这些文件都会以_test.go作为结尾)中的测试函数(这些函数都会以test开头), 你也可以添加-v 标识参数来输出,所有测试结果.
$ go test PASS ok example.com/greetings 0.364s $ go test -v === RUN TestHelloName --- PASS: TestHelloName (0.00s) === RUN TestHelloEmpty --- PASS: TestHelloEmpty (0.00s) PASS ok example.com/greetings 0.372s
4.查看失败的测试,
在TestHelloname测试函数中检查返回值,为了能够产生失败的测试效果,需要把greeting.Hello函数的打印name的输出删去.
在greeting/greetings.go中,粘贴下面代码来代替Hello函数,注意,高亮行改变了函数的返回值,相当于,name参数被意外删除
// Hello returns a greeting for the named person. func Hello(name string) (string, error) { // If no name was given, return an error with a message. if name == "" { return name, errors.New("empty name") } // Create a message using a random format. // message := fmt.Sprintf(randomFormat(), name) message := fmt.Sprint(randomFormat()) return message, nil }
5.在greeting路径下,运行go test命令
这次,运行 go test 命令但不加-v标识参数,于是,输出中只会包含测试失败信息,当有大量测试时,这会很有用,TestHelloName测试应该会失败,TestHelloEmpty会一直通过测试
$ go test --- FAIL: TestHelloName (0.00s) greetings_test.go:15: Hello("Gladys") = "Hail, %v! Well met!", <nil>, want match for `Gladys`, nil FAIL exit status 1 FAIL example.com/greetings 0.182s
接下来,你将会看到,如何在本地编译并安装代码