web-dev-qa-db-ja.com

期待スクリプトでタイムアウトを検出する方法

コマンドを生成し、一連のイベントを待機するexpectスクリプトについて考えてみます。これを使用してソフトウェアをテストします。タイムアウトが発生したときに、スクリプトから常に失敗の戻り値を取得しようとしています。

spawn some-command

set timeout 10

expect "First message"
expect "Other message"

このスクリプトは、タイムアウトが発生した場合でも、常に0(成功)を返します。タイムアウトを処理する唯一の方法は、すべてのexpectステートメントを次のように変換することです。

expect {
    timeout { exit 1 }
    eof     { exit 1 }
    "First message"
}

しかし、これはすぐに扱いにくくなります。簡略化はありますか?早期タイムアウト/ eof致命的エラーを引き起こすexpectオプションはありますか?

2

コメント meuhの答えexpect_beforeexpectと同じ引数を取るので、次のように書くことができます。

expect_before {
    timeout { puts "timeout"; exit 2 }
    eof     { puts "eof";     exit 1 }
}
# ...
expect "First message"
2
glenn jackman

expect_beforeコマンドを設定できます。これは、スクリプトの後半でexpectを使用するたびに実行されます。例えば

proc abort { } { send_user "Timeout!" ; exit 2 }
set timeout 5
spawn ssh myhost
expect_before timeout abort
expect  "assword: "
send "abc\r"
expect  "$ "
send "sleep 99\r"
expect  "$ "
2
meuh