バックグラウンドプロセスを続行するためにスリープする必要があるertを使用していくつかのテストを設定しようとしています。とを使ってみましsleep-for
たaccept-process-output
。どちらも信頼できません。これが小さな例です。
このテストは5秒間スリープしてから、少なくとも3秒が経過したことを確認します。それを使用sleep-for
するとすぐに終了し、失敗します。コメントがない場合shell-command
は、予想される5秒かかり、成功します。ここで何が起こっているのですか?
(ert-deftest timetest ()
(let ((now (cadr (current-time))))
;(shell-command "sleep 5")
(sleep-for 5)
(should (< now (- (cadr (current-time)) 3)))))
編集:
前の例をテストしたとき、私の環境には何か奇妙なことがあったに違いありません。このわずかに変更された例には、テストする必要があるようなバックグラウンドプロセスが含まれており、失敗します。インタラクティブとコマンドの両方を使用してテストしました。
emacs --batch -l example.el -f ert-run-tests-batch-and-exit
(ert-deftest timetest ()
(let ((now (cadr (current-time))))
(start-process "echo" "*echo*" "echo" "hello world")
(sleep-for 5)
(should (< now (- (cadr (current-time)) 3)))))
出力は次のとおりです。
Test timetest condition:
(ert-test-failed
((should
(< now
(- ... 3)))
:form
(< 55177 55174)
:value nil))
FAILED 1/1 timetest
Ran 1 tests, 0 results as expected, 1 unexpected (2013-02-05 09:57:29+0000)
1 unexpected results:
FAILED timetest
EDIT2:
プロセス出力を示しているように見える新しいバージョンは、割り込みに十分sleep-for
です:
(ert-deftest timetest ()
(let ((now (cadr (current-time))))
(start-process "yes" "*yes*" "yes")
(sleep-for 1) ;; This sleep-for may be interrupted by process *output*
(sleep-for 5) ;; This sleep-for is also interrupted
(should (< now (- (cadr (current-time)) 3)))))
EDIT3:
心が重いので、別のバージョンを投稿します。
(ert-deftest timetest ()
(let ((now (cadr (current-time)))
(process-connection-type nil))
(start-process "tmp" "*tmp*" "bash" "-c" "sleep 1; echo hi")
(sleep-for 5)
(should (< now (- (cadr (current-time)) 3)))))
sleep-for
ブロックに頼ることができないことは明らかなようです。