[Kimchi-devel] [PATCH] [Kimchi] Isolate unit tests execution.
Aline Manera
alinefm at linux.vnet.ibm.com
Fri May 20 14:07:44 UTC 2016
On 05/20/2016 08:27 AM, Paulo Ricardo Paz Vital wrote:
> On May 18 06:24PM, Aline Manera wrote:
>>
>> On 05/16/2016 11:16 PM, pvital at linux.vnet.ibm.com wrote:
>>> From: Paulo Vital <pvital at linux.vnet.ibm.com>
>>>
>>> This patch isolates each unit test execution reducing the occurrences of tests
>>> using data from previous unit tests and making results not reliable.
>>>
>>> In addition, it also simplifies the output of tests execution, printing the tags
>>> PASSED and FAILED and the error/failed banners only when necessary.
>>>
>>> Signed-off-by: Paulo Vital <pvital at linux.vnet.ibm.com>
>>> ---
>>> tests/run_tests.sh.in | 53 +++++++++++++++++++++++++++++++++++++++------------
>>> 1 file changed, 41 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/tests/run_tests.sh.in b/tests/run_tests.sh.in
>>> index 68dfa2e..d9c2661 100644
>>> --- a/tests/run_tests.sh.in
>>> +++ b/tests/run_tests.sh.in
>>> @@ -21,6 +21,10 @@
>>> HAVE_UNITTEST=@HAVE_PYMOD_UNITTEST@
>>> PYTHON_VER=@PYTHON_VERSION@
>>>
>>> +RED='\033[0;31m'
>>> +GREEN='\033[0;32m'
>>> +NC='\033[0m' # No Color
>>> +
>>> if [ "$1" = "-v" ]; then
>>> OPTS="-v"
>>> shift
>>> @@ -40,19 +44,44 @@ else
>>> CMD="python -m unittest"
>>> fi
>>>
>>> -LIST=($ARGS)
>>> -MODEL_LIST=()
>>> -MOCK_LIST=()
>>> -for ((i=0;i<${#LIST[@]};i++)); do
>>> -
>>> - if [[ ${LIST[$i]} == test_model* ]]; then
>>> - MODEL_LIST+=(${LIST[$i]})
>>> +NUM_TESTS=0
>>> +TIME=0
>>> +declare -A FAILED_UT # dict to store failed unit tests and its OUTPUT_FILE
>>> +for UT in $ARGS; do
>>> + OUTPUT_FILE=$(mktemp)
>>> + echo -n "***** Running unit test: $UT... "
>>> + # ../../../../../ refers to the project root
>>> + # ../../../../ refers to wok directory
>>> + # ../../../ refers to plugins directory
>>> + PYTHONPATH=../../../../../:../../../../:../../../ \
>>> + PYTHONWARNINGS="ignore:Unverified HTTPS request" \
>>> + $CMD $OPTS $UT &> $OUTPUT_FILE
>> You can do:
>>
>> output=$($CMD $OPTS $UT)
>>
>> to get the test output. That way we don't need to create multiple temporary
>> files.
>>
> Yeap, I can do this. However, the idea to have a temporary file is keep the full
> output of the test case execution for future analysis, instead of check only the
> console history.
>
> This patch, when an error or failure happens, prints only the 'banner' with the
> test case error on user console. With the output stored in a file (temporary
> because I delete the files which finishes with no errors) I can see it later to
> fix the error.
>
My point is: you don't need to have multiple files.
Store the error output in a variable and if it is not empty in the end
of the process, write it into a file and print the output to user as you
already do.
>>> + RES=$?
>>> + if [ $RES -ne 0 ]; then
>>> + # unit test has failed, so keep the OUTPUT_FILE and print the results
>>> + echo -e "\t ${RED}FAILED${NC}"
>>> + ERROR_LOG_BEGIN=$(grep -n "^\==*" $OUTPUT_FILE | head -n1 | cut -d":" -f1)
>>> + ERROR_LOG_END=$(cat $OUTPUT_FILE | wc -l)
>>> + tail -n $((${ERROR_LOG_END}-${ERROR_LOG_BEGIN}+1)) $OUTPUT_FILE
>>> + FAILED_UT+=([$UT]=$OUTPUT_FILE)
>>> + OUTPUT=$(grep "Ran" $OUTPUT_FILE)
>> Following my suggestion to do not use temporary files, all the above block
>> will be replace by:
>>
>> FAILED_UT+=$output
>>
> With this changes the full output of test execution will be printed in the
> console. As I told above, this patch's idea is 'clean' the output printed in the
> console by showing only the error/failure 'banner' and keeping the full
> execution stack on a file.
>
>>> else
>>> - MOCK_LIST+=(${LIST[$i]})
>>> + # unit test has passed, so print the results and delete the OUTPUT_FILE
>>> + OUTPUT=$(grep "Ran" $OUTPUT_FILE)
>>> + echo -e "\t ${GREEN}PASSED${NC} - $OUTPUT"
>>> + rm -rf $OUTPUT_FILE
>>> fi
>>> + TES=$(echo $OUTPUT | cut -d" " -f2)
>>> + NUM_TESTS=$(echo "$NUM_TESTS + $TES" | bc)
>>> + TES=$(echo $OUTPUT | cut -d" " -f5)
>>> + TIME=$(echo "$TIME + ${TES:0:-1}" | bc)
>>> done
>>>
>>> -# ../../../../../ refers to the project root
>>> -# ../../../../ refers to wok directory
>>> -# ../../../ refers to plugins directory
>>> -PYTHONPATH=../../../../../:../../../../:../../../ PYTHONWARNINGS="ignore:Unverified HTTPS request" $CMD $OPTS ${MODEL_LIST[@]} ${MOCK_LIST[@]}
>>> +# Print summary results
>>> +echo -e "======================================================================"
>>> +echo -e "===================== Kimchi Unit Tests Summary ======================"
>>> +echo -e "Ran $NUM_TESTS tests in $TIME seconds."
>>> +for i in "${!FAILED_UT[@]}"; do
>>> + FAIL_STATS=$(grep FAILED ${FAILED_UT[$i]} | cut -d" " -f2-4)
>>> + echo -e "$i FAILED: $FAIL_STATS - log available at ${FAILED_UT[$i]}"
>>> +done
>>> --
>>> 2.5.5
> --
> Paulo Ricardo Paz Vital
> Linux Technology Center, IBM Systems
> http://www.ibm.com/linux/ltc/
More information about the Kimchi-devel
mailing list