正如之前所说,单元测试的目的是独立地进行测试。尽管有些时候,测试套件会因为内部存在依赖关系而无法独立地进行单元测试,但是只要单元测试可以独立地进行,用户就可以通过并行地运行测试用例来提升测试的速度了,本节的内容将向我们展示如何在Go中实现这一点。

首先,在main_test.go文件所在的目录中创建一个名为parallel_test.go的文件,并在文件中键入代码清单8-4所示的代码。

代码清单8-4 并行测试

package main

import (  
    "testing"  
    "time"
)

func TestParallel_1(t *testing.T) {// 模拟需要耗时一秒钟运行的任务  
    t.Parallel()// 调用Parallel函数,以并行方式运行测试用例  
    time.Sleep(1 * time.Second)
}

func TestParallel_2(t *testing.T) { // 模拟需要耗时2秒运行的任务 
    t.Parallel()  
    time.Sleep(2 * time.Second)
}

func TestParallel_3(t *testing.T) {// 模拟需要耗时3秒运行的任务 
    t.Parallel()  
    time.Sleep(3 * time.Second)
}

这个程序利用time.Sleep函数,以3个测试用例分别模拟了3个需要耗时1s、2s和3s来运行的任务,并且为了让这些测试用例能够以并行的方式运行,程序还在每个测试用例的开头调用了testing.T结构的Parallel函数。

现在,我们只要在终端中执行以下命令,Go就会以并行的方式运行测试:

go test –v –short –parallel 3

这条命令中的并行标志-parallel用于指示Go以并行方式运行测试用例,而参数3则表示我们希望最多并行运行3个测试用例。另外,这条命令还使用了-short标志,以便跳过main_test.go测试文件中需要长时间运行的测试用例。以下是这个命令的执行结果:

=== 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:30: Skipping long-running test in short mode
=== RUN TestParallel_1
=== RUN TestParallel_2
=== RUN TestParallel_3
--- PASS: TestParallel_1 (1.00s)
--- PASS: TestParallel_2 (2.00s)
--- PASS: TestParallel_3 (3.00s)
PASS
ok    unit_testing  3.006s

从这个结果我们可以看到,main_test.go文件和parallel_test.go文件中的所有测试用例都被执行了,更为重要的是,parallel_test.go文件中的3个并行测试用例被同时执行了:尽管这3个并行测试用例的运行时长各有不同,但由于它们是同时运行的,所以这3个测试用例最终都在运行时长最长的测试用例TestParallel_3的执行过程中结束了,这也是整个测试最终耗费了3.006 s的原因——其中0.006 s用于执行main_test.go中的前几个测试用例,而3 s则用于执行parallel_test.go中运行时间最长的测试用例TestParallel_3

results matching ""

    No results matching ""