如何编写单元测试来检查方法是否是线程安全的

Dmi*_*Sh. 3 multithreading unit-testing go

我有一个这样的对象:

type Store struct {
    mutex sync.RWMutex
    data  map[string]int
}

func (s * Store) Read(key string) int, error {
    // ...
    defer s.mutex.RUnlock()
    s.mutex.RLock()
    // ...
    return val, nil
}

func (s * Store) Write(key string, value int) error {
    // ...
    defer s.mutex.Unlock()
    s.mutex.Lock()
    // ...
    return nil
}
Run Code Online (Sandbox Code Playgroud)

方法的单元测试应该如何ReadWrite检查它们是否是线程安全的?

我认为这样的情况已经存在模式,但我没有找到任何东西。

我读到关于-race旗帜的内容:

仅当运行代码实际触发竞争条件时,竞争检测器才能检测到竞争条件,这意味着在实际工作负载下运行支持竞争的二进制文件非常重要

我的问题是如何编写模拟实际工作负载的单元测试。

Fli*_*mzy 5

使用Race 检测器运行测试。简而言之,运行:

go test -race
Run Code Online (Sandbox Code Playgroud)

或者要构建普通的二进制文件,例如在临时服务器上运行,请使用:

go build -race
Run Code Online (Sandbox Code Playgroud)

但还有更多选择,所以最好阅读一下:)

如果您的目标是在实际负载下进行测试,那么最好的选择是使用 编译代码go build -race,然后在实际负载下运行它。这可能意味着在临时服务器上。但不要将其与单元测试混淆!

单元测试用于测试单元——代码的小部分,通常是单独的功能。负载/竞赛测试是一个不同的野兽,需要不同的工具和完全不同的方法。

事实上,Go 可以使用竞争检测器轻松运行单元测试,这一点很好,并且经常捕获竞争。但它不会,也不应该期望能够捕获所有竞争,因为单元测试执行的性质与生产执行的性质完全不同。