前言
TDD 测试驱动开发: 先编写测试程序,然后编写开发程序
命令
go test -v
Go 将查找当前目录下所有 *_test.go
文件来运行测试。
逻辑
测试代码的逻辑是假想已有代码,通过构造测试对象并调用假想代码,如果假想代码【应该】有结果,则对结果进一步编写测试逻辑。
例子
银行转账功能
测试用例
package bank
import "testing"
// 针对 Account 结构体功能测试
func TestAccount(t *testing.T) {
// 假想正式代码拥有 Account 结构体
account := Account{
Customer: Customer{
Name: "John",
Address: "Los Angeles, California",
Phone: "(213) 555 0147",
},
Number: 1001,
Balance: 0,
}
// 判断若已创建 Account 结构体变量 account ,则 account.Name 必然有值
if account.Name == "" {
t.Error("can't create an Account object")
}
}
// 针对转账的功能测试
func TestDeposit(t *testing.T) {
account := Account{
Customer: Customer{
Name: "John",
Address: "Los Angeles, California",
Phone: "(213) 555 0147",
},
Number: 1001,
Balance: 0,
}
// 调用假想的已有 Deposit 方法,随别写入10作为测试数据。
account.Deposit(10)
// 判断若转入 10 后,则账户余额应该等于 10.
if account.Balance != 10 {
t.Error("转账后余额没有增加")
}
// 判断主程是否有针对转账负值的逻辑
if err := account.Deposit(-10); err == nil {
t.Error("缺少针对负值的判断")
}
}
正式代码
package bank
import (
"errors"
)
// Customer ...
type Customer struct {
Name string
Address string
Phone string
}
// Account ...
type Account struct {
Customer
Number int32
Balance float64
}
// Deposit ...
func (a *Account) Deposit(amount float64) error {
if amount <= 0 {
return errors.New("the amount to deposit should be greater than zero")
}
a.Balance += amount
return nil
}