【发布时间】:2017-06-23 18:53:05
【问题描述】:
我有一个这样的对象:
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 flag:
竞争检测器只能在运行代码实际触发竞争条件时检测它们,这意味着在实际工作负载下运行支持竞争的二进制文件很重要
我的问题是如何编写模拟实际工作负载的单元测试。
【问题讨论】:
-
阅读go documentation 中的
-race构建/测试标志。 -
@Adrian 嗨,我读到了关于 -race 标志的信息:“竞争检测器只有在运行代码实际触发竞争条件时才能检测到竞争条件,这意味着在实际工作负载下运行支持竞争的二进制文件很重要" 我的问题是如何编写模拟实际工作负载的单元测试。
-
通过编写一个模拟现实工作负载的测试......没有简单的答案。这取决于你的具体情况。你必须自己弄清楚那部分。
-
单元测试不打算在实际工作负载下运行。如果您正在测试实际的工作负载,则根据定义,您不是在运行单元测试。对于您想要的测试类型,最好的办法是在生产式负载下运行
-race-built 二进制文件。但不要将此与单元测试混淆,后者的目的完全不同。
标签: multithreading unit-testing go