我有一个这样的对象:
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
}
如何对方法Read
& Write
检查它们是否是线程安全的?
我认为这种情况已经存在模式,但我找不到任何东西。
我读到-race
标志:
竞赛检测器只有在实际由运行代码触发时才能检测到竞争条件,这意味着在实际工作负载下运行支持竞争的二进制文件非常重要
我的问题是如何编写模拟实际工作负载的单元测试。
答案 0 :(得分:3)
使用Race detector运行测试。简而言之,运行:
go test -race
要构建普通二进制文件,例如在登台服务器上运行,请使用:
go build -race
但是还有更多的选择,所以最好阅读它:)
如果您的目标是在实际负载下进行测试,那么最好的选择是使用go build -race
编译代码,然后在实际负载下运行它。这可能意味着在登台服务器上。但是不要把它与单元测试混淆!
单元测试用于测试单元 - 代码的一小部分,通常是单个功能。负载/竞赛测试是一种不同的野兽,需要不同的工具和完全不同的方法。
Go将很容易使用比赛探测器进行单元测试这一事实很好,而且经常会抓住比赛。但是,由于单元测试执行的性质与生产执行的性质完全不同,因此不会,也不应该指望所有种族。