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

原文 标签 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
}

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

我认为这种情况已经存在,但是我什么也没找到。

我阅读了有关-race标志的信息:

the race detector can detect race conditions only when they are actually triggered by running code, which means it's important to run race-enabled binaries under realistic workloads



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

最佳答案

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

go test -race

或构建普通的二进制文件(例如在登台服务器上运行),请使用:
go build -race

但是还有更多选择,所以最好继续阅读:)

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

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

Go可以使用种族检测器轻松进行单元测试,这一事实很好,并且经常赶上种族。但是,由于单元测试执行的性质与生产执行的性质完全不同,因此它也不会,也不应该引起所有竞争。

相关文章:

google-app-engine - Google App Engine仅注销应用程序,而不注销整个Google帐户

windows - 与pthreads和CreateThread的死锁

javascript - 为什么node.js是异步的?

c++ - 从VS6移植到VS2008时,在非常规架构中使用单元测试吗?

go - 重新分配指针方法接收器

websocket - 使用Chrome框架而不是SockJS

c++ - HTTP::getinputstream()线程安全吗?

java - 监视具有多个生产者和消费者的锻炼(Java)

ruby-on-rails - Unit::Test与Rspec之间的差异

unit-testing - 如何对文本显示在屏幕中央进行单元测试?