代码清单8-3在同一个测试文件里包含了两个测试用例,第一个是前面已经介绍过的TestDecode
,而另一个则是TestEncode
。因为代码清单8-1中的程序并未实现相应的编码方法,所以TestEncode
并没有做任何实际的行为。程序员在进行测试驱动开发(test driven development, TDD)的时候,通常会让测试用例持续地失败,直到函数被真正地实现出来为止;但是,为了避免测试用例在函数尚未实现之前一直打印烦人的失败信息,用户也可以使用testing.T
结构提供的Skip
函数,暂时跳过指定的测试用例。此外,如果某个测试用例的执行时间非常长,我们也可以在实施完整性检查(sanity check)的时候,使用Skip
函数跳过该测试用例。
除了可以直接跳过整个测试用例,用户还可以通过向go test
命令传入短暂标志-short
,并在测试用例中使用某些条件逻辑来跳过测试中的指定部分。注意,这种做法跟在go test
命令中通过选项来选择性地执行指定的测试不一样:选择性执行只会执行指定的测试,并跳过其他所有测试,而-short
标志则会根据用户编写测试代码的方式,跳过测试中的指定部分或者跳过整个测试用例。
作为例子,让我们来看一下如何通过-short
标志来避免执行一个长时间运行的测试用例。首先,在main_test.go
文件中导入time
包,并创建一个新的测试用例:
func TestLongRunningTest(t *testing.T) {
if testing.Short() {
t.Skip("Skipping long-running test in short mode")
}
time.Sleep(10 * time.Second)
}
如果用户给定了-short
标志,测试用例TestLongRunningTest
将被跳过;相反,如果用户没有给定-short
标志,那么TestLongRunningTest
用例将被执行,并因此导致测试过程休眠10 s。现在,首先让我们来看一下测试用例在一般情况下是如何运行的:
=== RUN TestDecode
--- PASS: TestDecode (0.00s)
=== RUN TestEncode
--- SKIP: TestEncode (0.00s)
main_test.go:24: Skipping encoding for now
=== RUN TestLongRunningTest
--- PASS: TestLongRunningTest (10.00s)
PASS
coverage: 46.7% of statements
ok unit_testing 10.004s
正如我们所料,测试花了10 s来执行TestLongRunningTest
测试用例。现在,我们使用以下命令再次运行测试:
go test –v –cover -short
这次运行测试将得出以下结果:
=== RUN TestDecode
--- PASS: TestDecode (0.00s)
=== RUN TestEncode--- SKIP: TestEncode (0.00s)
main_test.go:24: Skipping encoding for now
=== RUN TestLongRunningTest
--- SKIP: TestLongRunningTest (0.00s)
main_test.go:29: Skipping long-running test in short mode
PASS
coverage: 46.7% of statements
ok unit_testing 0.004s
正如结果所示,长时间运行的测试用例TestLongRunningTest
在这次测试中被跳过了。