package main
import (
"fmt"
"sync"
"testing"
)
func ConcurrentTask() {
var count int
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
count++
}()
}
wg.Wait()
fmt.Println(count)
}
func TestConcurrentTask(t *testing.T) {
var mu sync.Mutex
var count int
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
mu.Lock()
count++
mu.Unlock()
}()
}
wg.Wait()
if count != 10 {
t.Errorf("Expected count to be 10, but got %d", count)
}
}
测试策略
- 使用互斥锁(Mutex):在
TestConcurrentTask
函数中,通过sync.Mutex
来保护对共享变量count
的访问,以避免竞争条件。每个goroutine在修改count
之前先获取锁,修改完成后释放锁。
- 验证结果:在所有goroutine执行完毕后,检查
count
的值是否等于预期的10。如果不等于10,则使用t.Errorf
输出错误信息。
工具
- Go语言自带的testing包:用于编写和运行单元测试。
testing.T
提供了断言和错误报告的功能,例如t.Errorf
用于报告测试失败。
- sync包:提供了
sync.Mutex
互斥锁来处理并发访问共享资源时的竞争条件,以及sync.WaitGroup
来同步多个goroutine的执行。