Ruby:Minitest、测试单元和实例变量

标签 ruby unit-testing thread-safety

(已在 https://www.ruby-forum.com/topic/6876320 发布,但在这里交叉发布,因为到目前为止我还没有收到回复)。

关于在 Minitest 和/或 Test::Unit 中并行化测试的问题(即正确使用 parallelize_me!):

假设我有一些辅助方法,几个测试都需要这些方法。根据我的理解,我不能用这种方法做这样的事情(简化示例):

def prep(m,n)
 @pid = m
 @state = n
end

def process
 if @stat > 5 && @pid != 0
   ...
 else
   ...
 end
end

我想我不能在 Minitest 和测试单元中这样做,因为如果我从我的几个测试函数调用准备和处理,测试就不能再并行化——那些测试函数都设置和读取同一个实例多变的。对吧?

现在,我的问题是,以下方法对于并行化是否安全:我将所有这些可变实例变量设为一个散列,我在设置中对其进行了初始化,如下所示:

def setup
  @pid ||= {}
  @state ||= {}
end

我的“辅助方法”收到一个键(例如,测试名称 方法)并使用它来访问他们“自己的”散列元素:

def prep(key,m,n)
 @pid[key] = m
 @state[key] = n
end

def process
 if @stat[key] > 5 && @pid[key] != 0
   ...
 else
   ...
 end
end

有点难看,但是:这是一种可靠的方法吗?这种访问哈希线程安全的方式吗?我怎样才能做得更好?

最佳答案

至少在 Minitest 中你可以安全地做,例如,

setup do
  @form = Form.new
end

没有 @form 在并行测试之间混淆,所以这种方法也应该是安全的:

def setup
  @stat = m
  @pid = n
end

这意味着您原来的方法也应该是安全的。

================

更新

考虑以下要点和一段代码,这些代码定义了 100 个不同的测试访问 @random,它在 setup https://gist.github.com/bbozo/2a64e1f53d29747ca559 中设置

您会注意到 setup 中设置的内容不会在测试之间共享,它在每次测试之前运行,基本上每个测试都被封装,因此线程安全不是问题。

关于Ruby:Minitest、测试单元和实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31857418/

相关文章:

php - 如何在 ruby​​ 中解密使用 'rijndael-128-cbc' 加密的数据

php - 在 Laravel 8 中运行多个 PHPUnit 测试时出错

javascript - Angularjs 单元测试和 httpbackend 超时

vb.net - Visual Basic-在线程应用程序中使用嵌套互斥对象-风险和建议

ios - 如何确保在同一个后台线程上运行一些代码?

multithreading - golang线程模型比较

ruby-on-rails - Ruby,更新推特头像和背景

html - CSS 中等效的 Ruby Truncate 方法

perl - 我如何在 Perl 中进行单元测试?

ruby - 如何使用 Nokogiri::XML::Builder 生成动态标签?