使用-race检测竞态条件,通过sync.WaitGroup等待所有goroutine完成,避免time.Sleep;利用testing.T.Parallel()测试并行性,结合超时机制防止死锁和阻塞。

测试并发代码在Golang中是一个常见但容易出错的任务。关键在于确保你的测试能准确反映并发行为,同时避免竞态条件、死锁或误报。Go语言本身提供了强大的来帮助我们完成这项工作。
使用 -race 检测竞态条件
Go的竞态检测器是测试并发代码最有效的工具之一。它能在运行时检测到数据竞争问题。
在执行测试时加上 -race 标志:
test -race
如果代码中存在多个goroutine同时读写同一变量且无,-race 会报告具体的位置和调用。这是必须开启的选项,尤其是在CI流程中。
立即学习“”;
使用 sync.WtGroup 等待所有goroutine完成
测试并发函数时,主goroutine不能提前退出,否则其他goroutine可能还没执行完。
通过 WaitGroup 可以等待所有任务结束:
func TestConcurrentTask(t *testing.T) { var wg sync.WaitGroup counter := 0 mu := sync.Mutex{}
for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() mu.Lock() counter++ mu.Unlock() }() } wg.Wait() // 等待所有goroutine完成 if counter != 10 { t.Errorf("expected 10, got %d", counter) }
}
注意:不要依赖 time.Sleep() 来等待,这会让测试不稳定且不可靠。
代码小浣熊是基于商汤大语言模型的软件智能研发助手,覆盖软件需求分析、架构设计、代码编写、软件测试等环节
51 利用 testing.T.Parallel() 测试并行性
当你想测试多个测试用例并行执行的情况,可以标记测试为并行:
func TestParallelExample(t *testing.T) { t.Parallel() // 执行一些并发操作 }
然后运行:
go test -parallel 4
这会并行执行可并行的测试,模拟真实高并发场景下的行为。
检查死锁和资源泄漏
虽然Go没有内置死锁检测,但可以通过以下方式预防:
- 避免嵌套加锁
- 统一锁获取顺序
- 使用带超时的锁操作,如 context.WithTimeout 和 chan 操作
- 对 channel 操作设置超时,防止永久阻塞
例如:
select { case result :=
基本上就这些。写好并发测试的核心是:用 -race 捕获竞争,用 WaitGroup 控制生命周期,避免睡眠等待,合理设计同步逻辑。不复杂但容易忽略细节。
以上就是如何在Golang中测试并发代码的详细内容,更多请关注php中文网其它相关文章!
微信扫一扫打赏
支付宝扫一扫打赏
