Tip #47 表驱动测试,测试集和并行运行测试

原始链接:Golang Tip #47: Table-driven tests, subtests, and parallel tests.

如果我们的这个提示被忽略了,那可就不妙了,因为测试是确保我们在部署后, 能否够睡个安稳觉不可或缺的环节。

1.表驱动测试

表驱动测试是一种通过表格的方式描述单元测试的方法,详细列出输入和预期结果。

让我们看一个简单的例子:我们有一个名为 add() 的函数,用于计算两个操作数的和。

以下是我们的测试用例:

设置好这些之后,我们只需运行一个测试函数, 就可以将所有的测试用例跑一遍:

就像上面那样,我们可以添加任意数量的测试用例,如果有任何失败,它们将很清晰地打印在控制台(或任何终端输出)上。

例如,将add()函数误认为是将a, b两个数相乘后,以下会生成一些失败的测试结果:

--- FAIL: TestAdd (0.00s)
   add(1, 2) = 2; want 3
   add(5, 0) = 0; want 5
   add(-1, -2) = 2; want -3
   add(-5, 10) = -50; want 5

“但如果有一个测试失败,我不想运行其余的测试,因为会很慢。”

我们可以使用 t.Fatalf 而不是 t.Errorf,它相当于 t.Logf + t.FailNow。

现在,我们还有一件事情忘记做了:给测试用例定义名称。

当测试失败时,命名变得非常重要。它能帮助我们快速定位哪个测试未通过,而无需仔细查看输入和预期结果。

2.测试集和并行运行测试

测试集让你以逻辑方式组织测试,并将它们作为较大测试函数的一部分运行。

首先,让我们给每个测试用例一个名称:

然后,我们通过稍微修改,就能生成一个测试集,并进行并行运行,注意这两处更新:

现在控制台上打印的结果非常清晰, 它们以层次结构显示了哪个测试和哪个子测试失败:


--- FAIL: TestAdd (0.00s)
    --- FAIL: TestAdd/two_positives (0.00s)
        add(1, 2) = 2; want 3

这种设置使你的测试输出清晰易懂,帮助你更快地识别和修复问题。