开始编写测试
在开始编写程序之前,让我们先讨论一下测试并创建我们的第一个测试。 程序包测试为 Go 程序包的自动化测试提供支持。 测试对于确保代码按预期工作非常重要。 通常,程序包中的每个函数都应该有至少一个测试来确认功能。
编写代码时要遵循的一个良好做法是使用测试驱动开发 (TDD) 方法。 使用此方法时,我们将首先编写测试。 我们可以肯定那些测试会失败,因为它们测试的代码还不存在。 然后,我们将编写满足测试条件的代码。
创建测试文件
首先,我们需要创建用来保存 bankcore
程序包的所有测试的 Go 文件。 创建测试文件时,该文件的名称必须以 _test.go
结尾。 你可以将你想用的任何内容用作文件名的前半部分,但典型做法是使用你要测试的文件的名称。
此外,要编写的每个测试都必须是以 Test
开头的函数。 然后,你通常为你编写的测试编写一个描述性名称,例如 TestDeposit
。
转到 $GOPATH/src/bankcore/
位置,创建一个名为 bank_test.go
的文件,其中包含以下内容:
package bank
import "testing"
func TestAccount(t *testing.T) {
}
打开一个终端,确保你处于 $GOPATH/src/bankcore/
位置。 然后,使用以下命令在详细模式下运行测试:
go test -v
Go 将查找所有 *_test.go
文件来运行测试,因此你应该会看到以下输出:
=== RUN TestAccount
--- PASS: TestAccount (0.00s)
PASS
ok github.com/msft/bank 0.391s
编写将失败的测试
编写任何代码之前,让我们先使用 TDD 为其编写一个将失败的测试。 使用以下代码修改 TestAccount
函数:
package bank
import "testing"
func TestAccount(t *testing.T) {
account := Account{
Customer: Customer{
Name: "John",
Address: "Los Angeles, California",
Phone: "(213) 555 0147",
},
Number: 1001,
Balance: 0,
}
if account.Name == "" {
t.Error("can't create an Account object")
}
}
我们引入了一个尚未实现的用于帐户和客户的结构。 并且,我们使用 t.Error()
函数来指示,如果某件事情没有按预期的方式发生,测试将失败。
另请注意,测试具有创建帐户对象(尚不存在)的逻辑。 但是,我们此刻正在设计如何与我们的程序包进行交互。
注意
我们会将用于测试的代码提供给你,因为我们不想逐行解释。 但是,你的心智模型应该是这样的:一点一点地开始,根据需要进行多次迭代。
在我们的案例中,我们将只进行一次迭代:编写测试,确保它失败,然后编写满足测试条件的代码。 在你自己编写代码时,应该先从简单代码开始,逐步增加复杂性。
运行 go test -v
命令时,应该会在输出中看到一个将失败的测试:
# github.com/msft/bank [github.com/msft/bank.test]
.\bank_test.go:6:13: undefined: Account
.\bank_test.go:7:13: undefined: Customer
FAIL github.com/msft/bank [build failed]
让我们暂时先把它放在这里。 我们将完成此测试,并在为网上银行系统编写逻辑时创建新的测试。