0

現在、rspec でテストを実行する際に問題が発生しています。すべてのテスト ファイル (*_spec.rb) が正常に実行される可能性があります。同じまれなケースで、エラー --Errno::EACCESが表示され、テストの 1 つが失敗することがあります。例:
ファイル*_spec.rb実行中のすべてのテスト:

  1. 成功しました。
  2. 成功しました。
  3. テストが失敗したもの。
  4. 成功しました。
  5. テストが失敗したもの (#3 とは異なります)。

次のような行から例外が発生します。

  1. FileUtils.mv
  2. FileUtils.mkdir_p
  3. 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が、これが最善の解決策ですか?

PS
私の英語で申し訳ありませんが、できるだけ簡単に説明しようとしたので、お気軽に質問してください. 少なくともこれを最後まで読んでくれてありがとう。

4

1 に答える 1

0

根本的な原因を探し、あなたが言及した回避策に屈しないでください。

まず、ファイル フィクスチャの設定と破棄にbeforeandを使用していることを確認します。after仕様自体にセットアップとティアダウンの手順をコーディングすると、テストが失敗したときに仕様が実行されないリスクがあります。

次に、セットアップとティアダウンの手順で、テストごとに異なるファイルとディレクトリが作成されるようにしてください。読み取りだけを行っている場合は、共有フィクスチャを使用しても問題ありませんが、他のすべての操作 (移動、作成、追加、削除) には新しいファイル/ディレクトリを使用してください。最善の方法は、新しく生成された一時ファイルとディレクトリを使用することです。テストを独立させ、並行して実行することさえ可能にします。

3 番目に、テストで作成/使用されたファイルを使用する他のプロセスを確認します。私はあなたのセットアップを知りません。それはすべてそれに依存しますが、考えられるのは Web サーバー、ブラウザー (セレン経由など)、メール サーバーなどです。ビルドの一部として実行している他のプロセスを確認してください。

于 2012-08-29T10:23:52.297 に答える