1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-16 05:26:58 +08:00

GoogleTest: Add XML_OUTPUT_DIR parameter

When executing googltests in parallel using 'ctest -j n' and using
'--gtest_output=xml' there is a race condition upon file creation.
See googletest issue https://github.com/google/googletest/issues/2506.

As all testcases (potentially) can be run in parallel each testcase has
to create it's own XML JUnit file. EXTRA_ARGS is not suitable because it
is identical per testsuite.
So instead a new (opitional) parameter has been introduced to specify
the storage location for each test of the testsuite.
This commit is contained in:
Alexander Stein
2020-03-06 13:42:36 +01:00
committed by Brad King
parent c3ab1c22b0
commit e9ab39eb1d
2 changed files with 16 additions and 1 deletions

View File

@@ -151,6 +151,7 @@ same as the Google Test name (i.e. ``suite.testcase``); see also
[PROPERTIES name1 value1...] [PROPERTIES name1 value1...]
[TEST_LIST var] [TEST_LIST var]
[DISCOVERY_TIMEOUT seconds] [DISCOVERY_TIMEOUT seconds]
[XML_OUTPUT_DIR dir]
) )
``gtest_discover_tests`` sets up a post-build command on the test executable ``gtest_discover_tests`` sets up a post-build command on the test executable
@@ -236,6 +237,13 @@ same as the Google Test name (i.e. ``suite.testcase``); see also
problem. The ambiguous behavior of the ``TIMEOUT`` keyword in 3.10.1 problem. The ambiguous behavior of the ``TIMEOUT`` keyword in 3.10.1
and 3.10.2 has not been preserved. and 3.10.2 has not been preserved.
``XML_OUTPUT_DIR dir``
If specified, the parameter is passed along with ``--gtest_output=xml:``
to test executable. The actual file name is the same as the test target,
including prefix and suffix. This should be used instead of
``EXTRA_ARGS --gtest_output=xml`` to avoid race conditions writing the
XML result output when using parallel test execution.
#]=======================================================================] #]=======================================================================]
# Save project's policies # Save project's policies
@@ -372,7 +380,7 @@ function(gtest_discover_tests TARGET)
cmake_parse_arguments( cmake_parse_arguments(
"" ""
"NO_PRETTY_TYPES;NO_PRETTY_VALUES" "NO_PRETTY_TYPES;NO_PRETTY_VALUES"
"TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST;DISCOVERY_TIMEOUT" "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST;DISCOVERY_TIMEOUT;XML_OUTPUT_DIR"
"EXTRA_ARGS;PROPERTIES" "EXTRA_ARGS;PROPERTIES"
${ARGN} ${ARGN}
) )
@@ -434,6 +442,7 @@ function(gtest_discover_tests TARGET)
-D "TEST_LIST=${_TEST_LIST}" -D "TEST_LIST=${_TEST_LIST}"
-D "CTEST_FILE=${ctest_tests_file}" -D "CTEST_FILE=${ctest_tests_file}"
-D "TEST_DISCOVERY_TIMEOUT=${_DISCOVERY_TIMEOUT}" -D "TEST_DISCOVERY_TIMEOUT=${_DISCOVERY_TIMEOUT}"
-D "TEST_XML_OUTPUT_DIR=${_XML_OUTPUT_DIR}"
-P "${_GOOGLETEST_DISCOVER_TESTS_SCRIPT}" -P "${_GOOGLETEST_DISCOVER_TESTS_SCRIPT}"
VERBATIM VERBATIM
) )

View File

@@ -99,6 +99,11 @@ foreach(line ${output})
endif() endif()
string(REGEX REPLACE "^DISABLED_" "" pretty_test "${pretty_test}") string(REGEX REPLACE "^DISABLED_" "" pretty_test "${pretty_test}")
string(REGEX REPLACE "#.*" "" test "${test}") string(REGEX REPLACE "#.*" "" test "${test}")
if(NOT TEST_XML_OUTPUT_DIR STREQUAL "")
set(TEST_XML_OUTPUT_PARAM "--gtest_output=xml:${TEST_XML_OUTPUT_DIR}/${prefix}${pretty_suite}.${pretty_test}${suffix}.xml")
else()
unset(TEST_XML_OUTPUT_PARAM)
endif()
# ...and add to script # ...and add to script
add_command(add_test add_command(add_test
"${prefix}${pretty_suite}.${pretty_test}${suffix}" "${prefix}${pretty_suite}.${pretty_test}${suffix}"
@@ -106,6 +111,7 @@ foreach(line ${output})
"${TEST_EXECUTABLE}" "${TEST_EXECUTABLE}"
"--gtest_filter=${suite}.${test}" "--gtest_filter=${suite}.${test}"
"--gtest_also_run_disabled_tests" "--gtest_also_run_disabled_tests"
${TEST_XML_OUTPUT_PARAM}
${extra_args} ${extra_args}
) )
if(suite MATCHES "^DISABLED" OR test MATCHES "^DISABLED") if(suite MATCHES "^DISABLED" OR test MATCHES "^DISABLED")