いくつかのグーグル(私は決してbashの専門家ではありません)から、テストスイートを実行し、実行中に下部にステータスバーを出力できるbashスクリプトをまとめることができました。通常、約 10 時間かかります。ステータス バーには、成功したテストの数と失敗したテストの数が表示されます。
うまく機能することもありますが、無限ループに陥ることもあります。私が使用しているコードは次のとおりです。
#!/bin/bash
WHITE="\033[0m"
GREEN="\033[32m"
RED="\033[31m"
(run_test_suite 2>&1) | tee out.txt |
while IFS=read -r line;
do
printf "%$(tput cols)s\r" " ";
printf "%s\n" "$line";
printf "${WHITE}Passing Tests: ${GREEN}$(grep -c passed out.txt)\t" 2>&1;
printf "${WHITE}Failed Tests: ${RED}$( grep -c FAILED out.txt)${WHITE}\r" 2>&1;
done
バグに遭遇すると、エラー メッセージが無限に繰り返され、ログ ファイル ( out.txt
) が数メガバイトの巨大なものになります (一度 GB に入ったと思います)。繰り返されるエラーの例を次に示します (各セットの間に 4 行の空白があります)。
warning caused by MY::Custom::Perl::Module::TEST_FUNCTION
print() on closed filehandle GEN3663 at /some/CPAN/Perl/Module.pm line 123.
2>&1
リダイレクトを取り出そうとしましたが、に変更しようとしましたwhile IFS=read -r line;
がwhile read -r line;
、無限ループが発生し続けます。奇妙なことに、これはほとんどの場合に発生するようですが、長いテスト スイートを問題なく終了することもありました。
編集:
私がこれを書いている理由は、白黒のテスト スイートから色分けされたテスト スイート (したがって ANSI コード) にアップグレードするためです。以前は、次を使用してテスト スイートを実行していました。
run_test_suite > out.txt 2>&1 &
watch 'grep -c FAILED out.txt; grep -c passed out.txt; tail -20 out.txt'
この方法で実行すると、Perl から同じ警告が表示されますが、無限ループに陥ることなく、ファイルに出力されて先に進みます。watch を使用すると、[32m
実際にテキストを緑色でレンダリングするのではなく、次のようなものも印刷されます。