在练习 9.4 中你写了一个叫 main_oddeven.go 的程序用来测试前 100 个整数是否是偶数。这个函数属于 even 包。

    下面是一种可能的方案:

    示例 13.7 even_main.go

    1. package main
    2. import (
    3. "fmt"
    4. "even/even"
    5. )
    6. func main() {
    7. for i:=0; i<=100; i++ {
    8. fmt.Printf("Is the integer %d even? %v\n", i, even.Even(i))
    9. }
    10. }

    上面使用了 even.go 中的 even 包:

    示例 13.8 even/even.go

    1. package even
    2. func Even(i int) bool { // Exported function
    3. return i%2 == 0
    4. }
    5. func Odd(i int) bool { // Exported function
    6. return i%2 != 0
    7. }

    在 even 包的路径下,我们创建一个名为 oddeven_test.go 的测试程序:

    示例 13.9 even/oddeven_test.go

    1. package even
    2. import "testing"
    3. func TestEven(t *testing.T) {
    4. if !Even(10) {
    5. t.Log(" 10 must be even!")
    6. t.Fail()
    7. }
    8. if Even(7) {
    9. t.Log(" 7 is not even!")
    10. t.Fail()
    11. }
    12. }
    13. func TestOdd(t *testing.T) {
    14. if !Odd(11) {
    15. t.Log(" 11 must be odd!")
    16. t.Fail()
    17. }
    18. if Odd(10) {
    19. t.Log(" 10 is not odd!")
    20. t.Fail()
    21. }
    22. }

    由于测试需要具体的输入用例且不可能测试到所有的用例(非常像一个无穷的数),所以我们必须对要使用的测试用例思考再三。

    至少应该包括:

    • 正常的用例
    • 反面的用例(错误的输入,如用负数或字母代替数字,没有输入等)
    • 边界检查用例(如果参数的取值范围是 0 到 1000,检查 0 和 1000 的情况)

    可以直接执行 go install 安装 even 或者创建一个 以下内容的 Makefile:

    1. include $(GOROOT)/src/Make.inc
    2. TARG=even
    3. GOFILES=\
    4. even.go\
    5. include $(GOROOT)/src/Make.pkg

    然后执行 make(或 gomake)命令来构建归档文件 even.a

    测试代码不能在 GOFILES 参数中引用,因为我们不希望生成的程序中有测试代码。如果包含了测试代码,go test 会给出错误提示!go test 会生成一个单独的包含测试代码的 _test 程序。

    现在我们可以用命令:go test(或 make test)来测试 even 包。

    因为示例 13.5 中的测试函数不会调用 t.Log 和 t.Fail,所以会得到一个 PASS 的结果。在这个简单例子中一切都正常执行。

    为了看到失败时的输出,把函数 TestEven 改为:

    1. func TestEven(t *testing.T) {
    2. if Even(10) {
    3. t.Log(“Everything OK: 10 is even, just a test to see failed output!”)
    4. t.Fail()
    5. }
    6. }

    现在会调用 t.Log 和 t.Fail,得到的结果如下:

    1. --- FAIL: even.TestEven (0.00 seconds)
    2. Everything OK: 10 is even, just a test to see failed output!
    3. FAIL

    练习 13.4:string_reverse_test.go

    为练习 7.11 string_reverse.go 写一个单元测试。

    把 string_reverse 放到自己的包 strev 中,只包含一个可导出函数 reverse。

    实现并测试它。