(已在 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/