testing - 如何去测试 Go 例程?

标签 testing go

此问题的一个示例是用户创建资源和删除资源时。我们将执行该操作并增加(减少)计数器缓存。

在测试中,有时会出现竞争条件,其中计数器缓存尚未由 go 例程更新。

编辑:抱歉造成困惑,澄清一下:计数器缓存不在内存中,它实际上是数据库中的一个字段。竞争条件不是针对内存中的变量,实际上是 Goroutine 写入数据库本身可能很慢!

我目前在操作后使用1秒 sleep ,以确保在测试计数器缓存之前计数器缓存已更新。是否有另一种方法可以测试 go 例程,而无需任意 1 秒 sleep 来等待 go 例程完成?

干杯

最佳答案

In testing, there is sometimes a race condition where the counter cache has not been updated by the go routine. I currently use a 1 second sleep after the operation to ensure that the counter cache has been updated before testing the counter cache.

哎呀,我不想这么说,但你做错了。 Go 拥有一流的特性,让并发变得简单!如果正确使用它们,就不可能出现竞争条件。

事实上,有一个工具可以detect races for you 。我敢打赌它会提示你的程序。

一个简单的解决方案:

  • 让主例程创建一个 goroutine 来跟踪计数器。
  • goroutine 只会执行一个选择并获取一条消息以递增/递减或读取计数器。 (如果读取,则会传入一个 channel ,返回数字)
  • 当您创建/删除资源时,通过其 channel 向 goroutine 计数器发送适当的消息。
  • 当你想读取计数器时,发送一条消息进行读取,然后读取返回 channel 。

(另一种选择是使用锁。它的性能会更高一点,但编写和确保它的正确性要麻烦得多。)

关于testing - 如何去测试 Go 例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18955498/

相关文章:

javascript - 开 Jest 安全 cookie?

inheritance - Go 中创建复杂结构层次结构的惯用方法是什么?

go - 将数据发送到 channel slice 中的 channel 时出现死锁

go - 一个go代码程序后台运行失败

go - 为类 Debian 系统打包 Go 1.5 应用程序

javascript - 我如何确保全局范围 JS 范围(窗口)保持干净?

java - 将双列表转换为分组字符串

django - Selenium -显示有关浏览器中发生的事情的注释

testing - 使用带有真实 Jackrabbit 实现的 wcm.io AEM Mocks 从 JSON 导入内容

c++ - 是否有一个示例如何使用 SWIG 通过 go build 生成 C++ 建筑?