Go语言CSV包单元测试失败:输出匹配却不通过
Go CSV包单元测试失败排查:输出看似一致却不匹配
我在大型项目中计划使用Go的encoding/csv包,编写了GenerateCSV基础函数和对应的单元测试,但测试始终失败——明明输出和预期看起来完全一致。
代码文件
package csv import ( "bytes" "encoding/csv" ) func GenerateCSV(records [][]string) (string, error) { buf := bytes.Buffer{} w := csv.NewWriter(&buf) for _, record := range records { if err := w.Write(record); err != nil { // 错误处理为空 } } w.Flush() if err := w.Error(); err != nil { // 错误处理为空 } return buf.String(), nil }
测试文件
package csv import "testing" func TestGenerateCSV(t *testing.T) { records := [][]string{ {"first_name","last_name","user_name"}, } type args struct { records [][]string } tests := []struct { name string args args want string wantErr bool }{ {"T1", args{records: records}, "first_name,last_name,user_name", false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := GenerateCSV(tt.args.records) if (err != nil) != tt.wantErr { t.Errorf("GenerateCSV() error = %v, wantErr %v", err, tt.wantErr) return } if got != tt.want { t.Errorf("GenerateCSV() = %v, want %v", got, tt.want) } }) } }
测试运行输出
FAIL: TestGenerateCSV GenerateCSV() = first_name,last_name,user_name , want first_name,last_name,user_name
问题原因
Go标准库的csv.Writer默认会在每条写入的记录末尾添加换行符(\n),而测试用例中want字符串没有包含这个换行符。肉眼看似内容一致,但实际got的值是"first_name,last_name,user_name\n",和want的字符串不相等,导致测试失败。测试输出中got内容后多出的空行,就是这个换行符的直观体现。
另外,GenerateCSV函数中的错误处理逻辑为空,虽然不是本次测试失败的原因,但大型项目中必须补全这些逻辑(比如写入失败时返回错误),否则会忽略潜在问题,始终返回nil错误。
解决方案
最规范的做法是让测试预期值符合CSV的实际输出,在want字符串末尾添加换行符:
{"T1", args{records: records}, "first_name,last_name,user_name\n", false},
如果业务场景确实不需要换行符,也可以修改csv.Writer的配置(不推荐,不符合通用CSV规范):
w := csv.NewWriter(&buf) w.UseCRLF = false // 仅切换换行符类型,默认的\n仍会添加;若要完全避免换行,需手动拼接记录
同时记得补全函数的错误处理逻辑:
if err := w.Write(record); err != nil { return "", err } // ... if err := w.Error(); err != nil { return "", err }
内容的提问来源于stack exchange,提问作者Robert Campbell
相关产品推荐
相关产品推荐

