我目前发布了使用rspec运行测试的问题。所有测试文件(* _spec.rb)都可以成功运行。在极少数情况下,可能会出现错误 - Errno::EACCES
,其中一个测试可能会失败。 E.g:
文件*_spec.rb
中的所有测试都运行:
异常来自如下行:
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
是不可接受的,但它会有所帮助。FileUtils.(mv|rm_r|mkdir_p)
)可以修改为在Errno::EACCES
重试一次,但这是最好的解决方案吗? P.S。
对不起我的英语,随时可以提出任何问题,因为我试图尽可能简短地解释。先谢谢你,至少你已经把它读到最后了;
答案 0 :(得分:0)
寻找根本原因,不要屈服于你提到的解决方法。
首先确保您使用before
和after
来设置和拆除文件夹具。如果您在规范本身中对您的设置和拆卸过程进行编码,那么当测试失败时,您就有可能无法运行它。
其次,请确保您的设置&拆卸程序为每个测试创建不同的文件和目录。如果你所做的只是阅读它可以使用共享的灯具,但对于所有其他的东西(移动,创建,追加,删除)使用一个新的文件/目录。最好的办法是使用新生成的临时文件和目录。它将使您的测试独立,甚至允许并行运行它们。
第三,检查其他进程可能使用测试创建/使用的文件。我不知道你的设置,这完全取决于它,但可能的东西是网络服务器,浏览器(例如通过selenium),邮件服务器等。只需检查你正在运行的其他进程作为构建的一部分。< / p>