aultPort != uri.Port {
authority.Host = net.JoinHostPort(uri.Host, strconv.Itoa(uri.Port))
} else {
// JoinHostPort() automatically add brackets to the host if it's
// an IPv6 address.
//
// If not port is specified, JoinHostPort() return an IP address in the
// form of "[::1]:", so we use TrimSuffix() to remove the extra ":".
authority.Host = strings.TrimSuffix(net.JoinHostPort(uri.Host, ""), ":")
}
if uri.Vhost != defaultURI.Vhost {
// Make sure net/url does not double escape, e.g.
// "%2F" does not become "%252F".
authority.Path = uri.Vhost
authority.RawPath = url.QueryEscape(uri.Vhost)
} else {
authority.Path = "/"
}
return authority.String()
}
先不用考虑上面函数的复杂性,我们的目的很简单,就是要测试ParseURI
函数。那如何测试呢?首先我们需要创建一个uri_test.go
文件,一般和需要测试的uri.go
在同一个目录下。其次文件的包名也需要和uri.go
一致。
然后我们就可以编写测试函数了,上面说了测试函数需要以Test
开头。
我们先写一个简单的测试函数:
package uri
import (
"testing"
)
// Test matrix defined on http://www.rabbitmq.com/uri-spec.html
type testURI struct {
url string
username string
password string
host string
port int
vhost string
canon string
}
var uriTest = testURI{
url: "amqp://user:pass@host:10000/vhost",
username: "user",
password: "pass",
host: "host",
port: 10000,
vhost: "vhost",
canon: "amqp://user:pass@host:10000/vhost",
}
func TestUri(t *testing.T) {
u, err := ParseURI(uriTest.url)
if err != nil {
t.Fatal("Could not parse spec URI: ", uriTest.url, " err: ", err)
}
if uriTest.username != u.Username {
t.Error("For: ", uriTest.url, " usernames do not match. want: ", uriTest.username, " got: ", u.Username)
} else {
t.Log("For: ", uriTest.url, " usernames match. want: ", uriTest.username, " got: ", u.Username)
}
}
首先我们看到包名是uri
,然后我们定义了一个以Test
开头的测试函数TestUri
。函数的入参就代表这是一个单元测试。
然后我们定义一个需要测试的url的结构testURI
,然后初始化结构体uriTest
。其中uriTest.url
就是需要传入ParseURI
的参数,另外的一些参数就是解析之后希望返回的结果。
可以看到上面有几个方法:
- t.Fatal,测试错误并退出
- t.Error,测试错误会继续往下执行
- t.Log,一般代表测试成功打印日志
3、运行测试代码
然后我们在命令行执行下这个测试函数:
go test -run TestUri
PASS
ok go-demo/testexample/uri 0.390s
从执行结果我们可以看到测试成功了,但是并没有打印成功的日志。这是因为我们需要加上一个参数,修改如下:
go test -v -run TestUri
=== RUN TestUri
uri_test.go:37: For: amqp://user:pass@host:10000/vhost usernames match. want: user got: user
--- PASS: TestUri (0.00s)
PASS
ok go-demo/testexample/uri 0.120s
可以看到测试成功的日志打印出来了。
-run
代表可以指定某个具体的测试函数执行,如果去掉的话也可以,会执行这个目录下所有的测试函数
4、表驱动测试
如果我们想执行一批测试代码,这个时候应该怎么写呢?很简单,我们只需要定义一个切片就行:
package uri
import (
"testing"
)
// Test matrix defined on http://www.rabbitmq.com/uri-spec.html
type testURI struct {
url string
username string
password string
host string
port int
vhost string
canon string
}
var uriTests = []testURI{
{
url: "amqp://user:pass@host:10000/vhost",
username: "user",
password: "pass",
host: "host",
port: 10000,
vhost: "vhost",
canon: "amqp://user:pass@host:10000/vhost",
},
{
url: "amqp://",
username: defaultURI.Username,
password: defaultURI.Password,
host: defaultURI.Hos