menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right the-way-to-go_ZH_CN chevron_right eBook chevron_right 13.9.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    13.9.md
    1.58 KB / 2024-07-16 23:14:28
        # 13.9 用(测试数据)表驱动测试
    
    编写测试代码时,一个较好的办法是把测试的输入数据和期望的结果写在一起组成一个数据表:表中的每条记录都是一个含有输入和期望值的完整测试用例,有时还可以结合像测试名字这样的额外信息来让测试输出更多的信息。
    
    实际测试时简单迭代表中的每条记录,并执行必要的测试。这在练习 [13.4](exercises/chapter_13/string_reverse_test.go) 中有具体的应用。
    
    可以抽象为下面的代码段:
    
    ```go
    var tests = []struct{ 	// Test table
    	in  string
    	out string
    
    }{
    	{"in1", "exp1"},
    	{"in2", "exp2"},
    	{"in3", "exp3"},
    ...
    }
    
    func TestFunction(t *testing.T) {
    	for i, tt := range tests {
    		s := FuncToBeTested(tt.in)
    		if s != tt.out {
    			t.Errorf("%d. %q => %q, wanted: %q", i, tt.in, s, tt.out)
    		}
    	}
    }
    ```
    
    如果大部分函数都可以写成这种形式,那么写一个帮助函数 `verify()` 对实际测试会很有帮助:
    
    ```go
    func verify(t *testing.T, testnum int, testcase, input, output, expected string) {
    	if expected != output {
    		t.Errorf("%d. %s with input = %s: output %s != %s", testnum, testcase, input, output, expected)
    	}
    }
    ```
    
    `TestFunction()` 则变为:
    
    ```go
    func TestFunction(t *testing.T) {
    	for i, tt := range tests {
    		s := FuncToBeTested(tt.in)
    		verify(t, i, "FuncToBeTested: ", tt.in, s, tt.out)
    	}
    }
    ```
    
    ## 链接
    
    - [目录](directory.md)
    - 上一节:[测试的具体例子](13.8.md)
    - 下一节:[性能调试:分析并优化 Go 程序](13.10.md)
    
    
    links
    file_download