我当前在使用rspec运行测试时遇到问题。所有测试文件(*_spec.rb)都可以成功运行。在同样罕见的情况下,可能会出现错误Errno::EACCES
,其中一个测试可能失败。例如:
文件*_spec.rb
中的所有测试运行:
- 成功
- 成功
- 有一次测试失败了
- 成功
- 一个测试失败了(与#3中的不同)
- 等等
异常从以下行引发:
FileUtils.mv
FileUtils.mkdir_p
FileUtils.rm_r
所有这些列表都适用于文件或目录,并在测试中多次使用。即:
创建文件夹(包含子文件夹、文件等)、重命名文件夹、测试内容、删除。。等等
问题似乎隐藏在"定时"的某个地方(如果某个尚未完成,并且另一个操作试图访问该某些)。这种想法来自:
begin
FileUtils.mv(a, b) # if an `Errno:EACCESS` was raised here
rescue #
FileUtils.mv(a, b) # it wouldn't be raised now
end
问题是:
如何修复?(我的意思是很少再生的Errno:EACCESS
和一些测试)
- 在每次使用文件的操作之后添加
sleep
是不可接受的,不过这会有所帮助 - ruby的方法(
FileUtils.(mv|rm_r|mkdir_p)
)可能会被修改为在Errno::EACCES
上重试一次,但这是最好的解决方案吗
p.S.
很抱歉我的英语不好,请随意提问,因为我已经尽可能简短地解释了。提前感谢,至少你已经读到最后了;
寻找根本原因,不要屈服于您提到的解决方案。
首先确保使用before
和after
来设置和拆除文件固定装置。如果您在规范中对设置和拆卸过程进行编码,那么当测试失败时,它就有无法运行的风险。
第二,确保你的设置&拆卸过程为每个测试创建不同的文件和目录。如果你所做的只是阅读,那么使用共享固定装置是可以的,但对于所有其他事情(移动、创建、附加、删除),请使用新的文件/目录。最好的做法是使用新生成的临时文件和目录。它将使您的测试独立,甚至允许并行运行它们。
第三,检查哪些其他进程可能使用测试创建/使用的文件。我不知道你的设置,这一切都取决于此,但可能的东西是网络服务器、浏览器(例如通过selenium)、邮件服务器等。只需检查你在构建中运行的其他进程。