mirror of
https://github.com/git/git.git
synced 2026-01-19 07:04:49 +00:00
tests: optionally write results as JUnit-style .xml
This will come in handy when publishing the results of Git's test suite during an automated Azure DevOps run. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
1
t/.gitignore
vendored
1
t/.gitignore
vendored
@@ -2,3 +2,4 @@
|
||||
/test-results
|
||||
/.prove
|
||||
/chainlinttmp
|
||||
/out/
|
||||
|
||||
@@ -341,6 +341,9 @@ do
|
||||
-V|--verbose-log)
|
||||
verbose_log=t
|
||||
shift ;;
|
||||
--write-junit-xml)
|
||||
write_junit_xml=t
|
||||
shift ;;
|
||||
*)
|
||||
echo "error: unknown test option '$1'" >&2; exit 1 ;;
|
||||
esac
|
||||
@@ -488,11 +491,24 @@ trap 'exit $?' INT
|
||||
# the test_expect_* functions instead.
|
||||
|
||||
test_ok_ () {
|
||||
if test -n "$write_junit_xml"
|
||||
then
|
||||
write_junit_xml_testcase "$*"
|
||||
fi
|
||||
test_success=$(($test_success + 1))
|
||||
say_color "" "ok $test_count - $@"
|
||||
}
|
||||
|
||||
test_failure_ () {
|
||||
if test -n "$write_junit_xml"
|
||||
then
|
||||
junit_insert="<failure message=\"not ok $test_count -"
|
||||
junit_insert="$junit_insert $(xml_attr_encode "$1")\">"
|
||||
junit_insert="$junit_insert $(xml_attr_encode \
|
||||
"$(printf '%s\n' "$@" | sed 1d)")"
|
||||
junit_insert="$junit_insert</failure>"
|
||||
write_junit_xml_testcase "$1" " $junit_insert"
|
||||
fi
|
||||
test_failure=$(($test_failure + 1))
|
||||
say_color error "not ok $test_count - $1"
|
||||
shift
|
||||
@@ -501,11 +517,19 @@ test_failure_ () {
|
||||
}
|
||||
|
||||
test_known_broken_ok_ () {
|
||||
if test -n "$write_junit_xml"
|
||||
then
|
||||
write_junit_xml_testcase "$* (breakage fixed)"
|
||||
fi
|
||||
test_fixed=$(($test_fixed+1))
|
||||
say_color error "ok $test_count - $@ # TODO known breakage vanished"
|
||||
}
|
||||
|
||||
test_known_broken_failure_ () {
|
||||
if test -n "$write_junit_xml"
|
||||
then
|
||||
write_junit_xml_testcase "$* (known breakage)"
|
||||
fi
|
||||
test_broken=$(($test_broken+1))
|
||||
say_color warn "not ok $test_count - $@ # TODO known breakage"
|
||||
}
|
||||
@@ -763,6 +787,10 @@ test_start_ () {
|
||||
test_count=$(($test_count+1))
|
||||
maybe_setup_verbose
|
||||
maybe_setup_valgrind
|
||||
if test -n "$write_junit_xml"
|
||||
then
|
||||
junit_start=$(test-tool date getnanos)
|
||||
fi
|
||||
}
|
||||
|
||||
test_finish_ () {
|
||||
@@ -800,6 +828,13 @@ test_skip () {
|
||||
|
||||
case "$to_skip" in
|
||||
t)
|
||||
if test -n "$write_junit_xml"
|
||||
then
|
||||
message="$(xml_attr_encode "$skipped_reason")"
|
||||
write_junit_xml_testcase "$1" \
|
||||
" <skipped message=\"$message\" />"
|
||||
fi
|
||||
|
||||
say_color skip >&3 "skipping test: $@"
|
||||
say_color skip "ok $test_count # skip $1 ($skipped_reason)"
|
||||
: true
|
||||
@@ -815,9 +850,58 @@ test_at_end_hook_ () {
|
||||
:
|
||||
}
|
||||
|
||||
write_junit_xml () {
|
||||
case "$1" in
|
||||
--truncate)
|
||||
>"$junit_xml_path"
|
||||
junit_have_testcase=
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
printf '%s\n' "$@" >>"$junit_xml_path"
|
||||
}
|
||||
|
||||
xml_attr_encode () {
|
||||
# We do not translate CR to 
 because BSD sed does not handle
|
||||
# \r in the regex. In practice, the output should not even have any
|
||||
# carriage returns.
|
||||
printf '%s\n' "$@" |
|
||||
sed -e 's/&/\&/g' -e "s/'/\'/g" -e 's/"/\"/g' \
|
||||
-e 's/</\</g' -e 's/>/\>/g' \
|
||||
-e 's/ /\	/g' -e 's/$/\
/' -e '$s/
$//' |
|
||||
tr -d '\012\015'
|
||||
}
|
||||
|
||||
write_junit_xml_testcase () {
|
||||
junit_attrs="name=\"$(xml_attr_encode "$this_test.$test_count $1")\""
|
||||
shift
|
||||
junit_attrs="$junit_attrs classname=\"$this_test\""
|
||||
junit_attrs="$junit_attrs time=\"$(test-tool \
|
||||
date getnanos $junit_start)\""
|
||||
write_junit_xml "$(printf '%s\n' \
|
||||
" <testcase $junit_attrs>" "$@" " </testcase>")"
|
||||
junit_have_testcase=t
|
||||
}
|
||||
|
||||
test_done () {
|
||||
GIT_EXIT_OK=t
|
||||
|
||||
if test -n "$write_junit_xml" && test -n "$junit_xml_path"
|
||||
then
|
||||
test -n "$junit_have_testcase" || {
|
||||
junit_start=$(test-tool date getnanos)
|
||||
write_junit_xml_testcase "all tests skipped"
|
||||
}
|
||||
|
||||
# adjust the overall time
|
||||
junit_time=$(test-tool date getnanos $junit_suite_start)
|
||||
sed "s/<testsuite [^>]*/& time=\"$junit_time\"/" \
|
||||
<"$junit_xml_path" >"$junit_xml_path.new"
|
||||
mv "$junit_xml_path.new" "$junit_xml_path"
|
||||
|
||||
write_junit_xml " </testsuite>" "</testsuites>"
|
||||
fi
|
||||
|
||||
if test -z "$HARNESS_ACTIVE"
|
||||
then
|
||||
test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results"
|
||||
@@ -1058,6 +1142,7 @@ then
|
||||
else
|
||||
mkdir -p "$TRASH_DIRECTORY"
|
||||
fi
|
||||
|
||||
# Use -P to resolve symlinks in our working directory so that the cwd
|
||||
# in subprocesses like git equals our $PWD (for pathname comparisons).
|
||||
cd -P "$TRASH_DIRECTORY" || exit 1
|
||||
@@ -1071,6 +1156,19 @@ then
|
||||
test_done
|
||||
fi
|
||||
|
||||
if test -n "$write_junit_xml"
|
||||
then
|
||||
junit_xml_dir="$TEST_OUTPUT_DIRECTORY/out"
|
||||
mkdir -p "$junit_xml_dir"
|
||||
junit_xml_base=${0##*/}
|
||||
junit_xml_path="$junit_xml_dir/TEST-${junit_xml_base%.sh}.xml"
|
||||
junit_attrs="name=\"${junit_xml_base%.sh}\""
|
||||
junit_attrs="$junit_attrs timestamp=\"$(TZ=UTC \
|
||||
date +%Y-%m-%dT%H:%M:%S)\""
|
||||
write_junit_xml --truncate "<testsuites>" " <testsuite $junit_attrs>"
|
||||
junit_suite_start=$(test-tool date getnanos)
|
||||
fi
|
||||
|
||||
# Provide an implementation of the 'yes' utility
|
||||
yes () {
|
||||
if test $# = 0
|
||||
|
||||
Reference in New Issue
Block a user