【发布时间】:2021-10-20 02:30:05
【问题描述】:
我的程序有一个黑名单功能,其中一个文件列出了一些要排除的条件。该文件名为blacklist.yaml。
此文件与主要代码(进入 docker 容器)一起投入生产(*),在此之前我想确保文件的结构正确。
为此我写道:
func TestIfBlacklistIsCorrect(t *testing.T) {}
具有blacklist.yaml 硬编码,并将作为部署过程的一部分运行,以在结构中存在语法错误时中止它(从而使现有容器保持完整并运行)。那部分很好。
我现在想“测试测试” - 那就是写一个测试Test_TestIfBlacklistIsCorrect 来检查TestIfBlacklistIsCorrect 是否真的正确,考虑到所有情况,边缘情况,等等
为此,我有一个blacklist_test.yaml,它有一系列正确和不正确的结构。我想针对该列表运行 TestIfBlacklistIsCorrect 以确保它正确捕获可能的问题。
我的问题: TestIfBlacklistIsCorrect 有 blacklist.yaml 硬编码。我可以将带有文件名的参数传递给实际读取文件的例程(我在下面的示例代码中这样做了),但这需要将此参数独立地传递给TestIfBlacklistIsCorrect和@987654332 @。
然而,将变量传递给测试似乎是不可能的。在 Go 中解决此类问题的标准方法是什么?
我目前的代码如下(主要是为了展示导入 YAML 数据的逻辑)
package main
import (
"regexp"
"testing"
)
func TestIfBlacklistIsCorrect(t *testing.T) {
blacklist := readBlacklist("blacklist.yaml")
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)
}
}
func Test_TestIfBlacklistIsCorrect() {
// work in progress :)
}
(*) “制作”其实是一个家庭级的程序,唯一会出错的人就是我。我提到这一点是为了让非核电站级的解决方案可以接受。
【问题讨论】:
-
不是您问题的直接答案,但我会考虑使用
//go:embed指令将 .yaml 文件嵌入到您的可执行文件中,并且仅在测试阶段而不是在运行时测试其有效性。 -
@Flimzy:我不确定会有什么不同? (我在其他代码中使用嵌入,所以我理解这个概念 - 只是不知道测试本身会发生什么变化。不过这个想法很好,因为要复制的文件少了)
-
表示你知道编译后的版本已经通过了测试,所以你不需要在运行时费心去测试。
-
测试函数可以调用其他函数。只需将测试代码分解为一个函数,并使用来自 Test* 函数的不同参数调用它。或者,使用TableDrivenTests 中所示的子测试。