开始编写测试

已完成

在开始编写程序之前,让我们先讨论一下测试并创建我们的第一个测试。 程序包测试为 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]

让我们暂时先把它放在这里。 我们将完成此测试,并在为网上银行系统编写逻辑时创建新的测试。