【问题标题】:How to test a test case?如何测试一个测试用例?
【发布时间】:2021-10-20 02:30:05
【问题描述】:

我的程序有一个黑名单功能,其中一个文件列出了一些要排除的条件。该文件名为blacklist.yaml

此文件与主要代码(进入 docker 容器)一起投入生产(*),在此之前我想确保文件的结构正确。

为此我写道:

func TestIfBlacklistIsCorrect(t *testing.T) {}

具有blacklist.yaml 硬编码,并将作为部署过程的一部分运行,以在结构中存在语法错误时中止它(从而使现有容器保持完整并运行)。那部分很好。

我现在想“测试测试” - 那就是写一个测试Test_TestIfBlacklistIsCorrect 来检查TestIfBlacklistIsCorrect 是否真的正确,考虑到所有情况,边缘情况,等等

为此,我有一个blacklist_test.yaml,它有一系列正确和不正确的结构。我想针对该列表运行 TestIfBlacklistIsCorrect 以确保它正确捕获可能的问题。

我的问题: TestIfBlacklistIsCorrectblacklist.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 中所示的子测试。

标签: go testing


【解决方案1】:

最简单的解决方案就是不使用testing 包进行运行时测试。 testing 包用于测试,而不是运行时。

所以将TestIfBlacklistIsCorrect 重构为不依赖于testing 的东西。例如:

func TestIfBlacklistIsCorrect() error {

并将其放入您的非_test.go 文件之一。

然后您可以轻松地为它编写一个测试。

【讨论】:

  • 如果我正确理解您的答案,黑名单结构的测试将在运行时(即实际启动可执行文件时)完成。我想要的是在构建可执行文件之前测试该结构,如果有问题则中止。 (并且在结构修复之前不会替换当前正在运行的容器)
  • 也许我误解了你的要求。我以为这就是你想要的。
  • 抱歉没有说清楚。我用一些更明确的陈述更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
相关资源
最近更新 更多