一部のソフトウェアでtestSuiteを実行した結果を要約するには、生成された.xmlファイルを解析する必要があります。たとえば、私の行の1つから:
<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />
これは、失敗したテスト、実行されていないテスト、通過したテストの数を示します。テストスイートにいくつのテストがあるかを計算する必要があるため、上記の場合は10 + 0 + 18065 = 18075を追加する必要があります。
Bashでこれを行うにはどうすればよいですか?
答え1
あなたはそれを使用することができますxmlstarlet
正しいXML解析のために。
あなたの質問について:
total=0; \
for i in failed notExecuted pass; do \
sum=`xmlstarlet sel -t -v "//Summary/@$i" test.xml`; \
total=$(($sum + $total)); \
done; \
echo "Total=$total"
test.xml
xmlデータを含むファイルはどこにありますか?
答え2
使用perl
perl -lne 'my @a=$_=~/(\d+)/g;$sum+=$_ for @a; print $sum' file
使用awk
tr ' ' '\n' < file |
awk '/[0-9]+/ {gsub(/[^0-9]/, "", $0); sum+=$0} END {print sum}'
はい
% perl -lne 'my @a=$_=~/(\d+)/g;$sum+=$_ for @a; print $sum' foo
18075
% tr ' ' '\n' < foo |
awk '/[0-9]+/ {gsub(/[^0-9]/, "", $0); sum+=$0} END {print sum}'
18075
% cat foo
<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />
答え3
数字や空白以外の文字をすべて削除してください。
echo '<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />'|\
sed -e 's/[^0-9 ]//g'
与えられた
10 0 0 18065
。
合計は、DCを使用して実行できます(要求に応じてタイムアウトフィールドのフィルタリング)。
echo '<Summary failed="10" notExecuted="0" timeout="0" pass="18065" />'|\
sed -e 's/timeout="[0-9]*" //' \
-e 's/[^0-9 ]//g' \
-e 's/^ *//' \
-e 's/ *$//' \
-e 's/ /+/g' \
-e 's/^/0 /' \
-e 's/$/pq/'|dc
。
説明する
sedスクリプトは次のとおりです。
s/timeout="[0-9]*" // #remove the timeout
s/[^0-9 ]//g #drop anything but numbers and spaces
s/^ *// #drop spaces at the beginning of the line
s/ *$// #drop spaces at the end of the line
s/ /+/g #replace remaining spaces with +
s/^/0 / #add a 0 to initialize the sum for dc
s/$/pq/ #add print and quit command for dc
スクリプトは次のように簡単に使用できます。
INPUT|sed -f script.sed
。複数行を入力するためにsedとdcを使用してこのスクリプトを適用することはあなたの役割です。私が書く必要があるのは一行だけです!
答え4
次の XML パーサーを使用します。XMLスター質問に提供されたファイル:
$ xml sel -t -m '//Summary' -v '@failed+@notExecuted+@timeout+@pass' -nl file.xml
18075
Summary
複数の場所にあるノードが見つかると、各ノードに対して1行が出力されます。
xmlstarlet
一部のシステムでは、XMLStarletがxml
。