Go语言如何为校验blacklist.yaml的测试用例编写上层测试
标准解决方案
Go 中这类场景的常规实现方式是把核心校验逻辑从测试入口函数中抽离为独立的可复用函数,测试函数仅作为特定场景的调用入口,这样就可以灵活传入不同的文件名参数,不需要修改原有部署流程的测试逻辑。
修改后的代码示例
package main import ( "regexp" "testing" ) // 抽离出来的核心校验逻辑,支持传入任意文件名 func validateBlacklistFile(t *testing.T, filename string) { blacklist := readBlacklist(filename) for _, entry := range blacklist { log.Info().Msgf("testing pattern %v of type %v", entry.Match, entry.Type) if entry.Type == "exact" || entry.Type == "regex" { log.Info().Msg("type is correct") } else { t.Errorf("type %v is not known", entry.Type) continue } if entry.Type == "regex" { _, err := regexp.Compile(entry.Match) if err != nil { t.Errorf("incorrect match pattern: %v", err) continue } } log.Info().Msgf("pattern %v of type %v is correct", entry.Match, entry.Type) } } // 原有部署流程用的测试保持不变,依然校验默认的blacklist.yaml func TestIfBlacklistIsCorrect(t *testing.T) { validateBlacklistFile(t, "blacklist.yaml") } // 测试测试逻辑的新函数,传入测试用的配置文件即可 func Test_TestIfBlacklistIsCorrect(t *testing.T) { // 校验测试用的配置文件,也可以拆分多个子测试分别测不同场景 t.Run("test all cases in blacklist_test.yaml", func(t *testing.T) { validateBlacklistFile(t, "blacklist_test.yaml") }) // 如果有更细分的单一场景测试文件,也可以单独添加 // t.Run("invalid regex should fail", func(t *testing.T) { // validateBlacklistFile(t, "testdata/invalid_regex.yaml") // }) }
更轻量的替代方案(适合不想改代码结构的场景)
如果不想重构现有代码,也可以通过环境变量传递文件名,仅需要修改读取文件名的一行逻辑:
// 优先读取环境变量指定的配置文件,没有就用默认的blacklist.yaml filename := os.Getenv("TEST_BLACKLIST_FILE") if filename == "" { filename = "blacklist.yaml" } blacklist := readBlacklist(filename)
跑测试的时候指定环境变量即可:
TEST_BLACKLIST_FILE=blacklist_test.yaml go test -run TestIfBlacklistIsCorrect
内容的提问来源于stack exchange,提问作者WoJ
相关产品推荐
相关产品推荐

