最近、ある歴史的なプロジェクトのリファクタリングで忙しかったのですが、客観的な制約からテストケースがなく、新旧サーバーの結果セットを人力で比較して正誤を判断していました。怠惰はプログラマーの美徳と言われているので、そのためのツールを書いた方がいいと思いました。
ロジックは非常に簡単ですが、それだけで結果セットを取得するために、別のサーバーでcurlを介して、その後、差分することができますが、ここで注意するいくつかのことです:まず、1行のJSONは、直接の差分は意味を失うことになります、第二に、JSONの中国語の文字は、ビューに資するものではなく、エンコードされます。明確にするために、JSONデータをフォーマットするとき、私はBashを使用せず、PHPを使用しました:
#!/bin/bash
RM=/bin/rm
PHP=/usr/bin/php
CURL=/usr/bin/curl
DIFF=/usr/bin/diff
VIMDIFF=/usr/bin/vimdiff
COLORDIFF=/usr/bin/colordiff
usage() {
echo "Usage: $0 --uri=<URI> --old=<IP> --new=<IP>"
}
format() {
$PHP -R '
function ksort_recursive(&$array) {
if (!is_array($array)) {
return;
}
ksort($array);
foreach (array_keys($array) as $key) {
ksort_recursive($array[$key]);
}
}
$options = JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE;
$array = json_decode($argn, true);
ksort_recursive($array);
echo json_encode($array, $options);
'
}
request() {
$CURL -s -H "Host: $1" "http://$2$3"
}
eval set -- $(
getopt -q -o "h" -l "host:,uri:,old:,new:,vim,help" -- "$@"
)
while true; do
case "$1" in
--host) HOST=$2; shift 2;;
--uri) URI=$2; shift 2;;
--old) OLD=$2; shift 2;;
--new) NEW=$2; shift 2;;
--vim) VIM="Y"; shift 1;;
-h|--help) usage; exit 0;;
--) break;;
esac
done
if [[ -z "$URI" || -z "$OLD" || -z "$NEW" ]]; then
usage
exit 1
fi
if [[ -z "$HOST" ]]; then
HOST="www.foobar.com"
fi
OLD_FILE=$(mktemp)
NEW_FILE=$(mktemp)
request "$HOST" "$OLD" "$URI" | format > $OLD_FILE
request "$HOST" "$NEW" "$URI" | format > $NEW_FILE
if [[ "$VIM" == "Y" ]]; then
$VIMDIFF $OLD_FILE $NEW_FILE
elif [[ -x "$COLORDIFF" ]]; then
$COLORDIFF -u $OLD_FILE $NEW_FILE
else
$DIFF -u $OLD_FILE $NEW_FILE
fi
$RM -f $OLD_FILE
$RM -f $NEW_FILE
Getopt in Bash
Bash: Preserving Whitespace Using set and eval





