mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Fix JUnit reporter output so that it conforms to JUnit schema
The `properties` can only go under the `testsuite` tag, not under the `testsuites` tag. Fixes #1598
This commit is contained in:
		| @@ -76,22 +76,6 @@ namespace Catch { | ||||
|     void JunitReporter::testRunStarting( TestRunInfo const& runInfo )  { | ||||
|         CumulativeReporterBase::testRunStarting( runInfo ); | ||||
|         xml.startElement( "testsuites" ); | ||||
|  | ||||
|         if ( m_config->hasTestFilters() || m_config->rngSeed() != 0 )  | ||||
|             xml.startElement("properties"); | ||||
|  | ||||
|         if ( m_config->hasTestFilters() ) { | ||||
|             xml.scopedElement( "property" ) | ||||
|                 .writeAttribute( "name" , "filters" ) | ||||
|                 .writeAttribute( "value" , serializeFilters( m_config->getTestsOrTags() ) ); | ||||
|         } | ||||
|          | ||||
|         if( m_config->rngSeed() != 0 ) { | ||||
|             xml.scopedElement( "property" ) | ||||
|                 .writeAttribute( "name", "random-seed" ) | ||||
|                 .writeAttribute( "value", m_config->rngSeed() ); | ||||
|             xml.endElement(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void JunitReporter::testGroupStarting( GroupInfo const& groupInfo ) { | ||||
| @@ -130,6 +114,7 @@ namespace Catch { | ||||
|  | ||||
|     void JunitReporter::writeGroup( TestGroupNode const& groupNode, double suiteTime ) { | ||||
|         XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); | ||||
|  | ||||
|         TestGroupStats const& stats = groupNode.value; | ||||
|         xml.writeAttribute( "name", stats.groupInfo.name ); | ||||
|         xml.writeAttribute( "errors", unexpectedExceptions ); | ||||
| @@ -142,6 +127,21 @@ namespace Catch { | ||||
|             xml.writeAttribute( "time", suiteTime ); | ||||
|         xml.writeAttribute( "timestamp", getCurrentTimestamp() ); | ||||
|  | ||||
|         // Write properties if there are any | ||||
|         if (m_config->hasTestFilters() || m_config->rngSeed() != 0) { | ||||
|             auto properties = xml.scopedElement("properties"); | ||||
|             if (m_config->hasTestFilters()) { | ||||
|                 xml.scopedElement("property") | ||||
|                     .writeAttribute("name", "filters") | ||||
|                     .writeAttribute("value", serializeFilters(m_config->getTestsOrTags())); | ||||
|             } | ||||
|             if (m_config->rngSeed() != 0) { | ||||
|                 xml.scopedElement("property") | ||||
|                     .writeAttribute("name", "random-seed") | ||||
|                     .writeAttribute("value", m_config->rngSeed()); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Write test cases | ||||
|         for( auto const& child : groupNode.children ) | ||||
|             writeTestCase( *child ); | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <testsuites> | ||||
|   <properties> | ||||
|     <property name="filters" value="~[!nonportable]~[!benchmark]~[approvals]"/> | ||||
|     <property name="random-seed" value="1"/> | ||||
|   </properties> | ||||
| loose text artifact | ||||
| <testsuitesloose text artifact | ||||
| > | ||||
|   <testsuite name="<exe-name>" errors="17" failures="123" tests="1437" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> | ||||
|     <properties> | ||||
|       <property name="filters" value="~[!nonportable]~[!benchmark]~[approvals]"/> | ||||
|       <property name="random-seed" value="1"/> | ||||
|     </properties> | ||||
|     <testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="#1027" time="{duration}"/> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský