go-017测试

阅读量: zyh 2020-11-26 12:10:15
Categories: > Tags:

前言

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
}