代码清单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在这次测试中被跳过了。

results matching ""

    No results matching ""