Merging, XML tests
This commit is contained in:
parent
703b4a85a2
commit
e891900666
|
@ -3448,6 +3448,11 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {
|
|||
// to delimit this attribute from prior attributes.
|
||||
static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
|
||||
|
||||
// Streams an XML representation of the test properties of a TestResult
|
||||
// object.
|
||||
static void OutputXmlTestProperties(std::ostream* stream,
|
||||
const TestResult& result);
|
||||
|
||||
// The output file.
|
||||
const std::string output_file_;
|
||||
|
||||
|
@ -3659,6 +3664,10 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
|
|||
const TestResult& result = *test_info.result();
|
||||
const std::string kTestcase = "testcase";
|
||||
|
||||
if (test_info.is_in_another_shard()) {
|
||||
return;
|
||||
}
|
||||
|
||||
*stream << " <testcase";
|
||||
OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
|
||||
|
||||
|
@ -3675,7 +3684,6 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
|
|||
OutputXmlAttribute(stream, kTestcase, "time",
|
||||
FormatTimeInMillisAsSeconds(result.elapsed_time()));
|
||||
OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
|
||||
*stream << TestPropertiesAsXmlAttributes(result);
|
||||
|
||||
int failures = 0;
|
||||
for (int i = 0; i < result.total_part_count(); ++i) {
|
||||
|
@ -3697,10 +3705,15 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
|
|||
}
|
||||
}
|
||||
|
||||
if (failures == 0)
|
||||
if (failures == 0 && result.test_property_count() == 0) {
|
||||
*stream << " />\n";
|
||||
else
|
||||
} else {
|
||||
if (failures == 0) {
|
||||
*stream << ">\n";
|
||||
}
|
||||
OutputXmlTestProperties(stream, result);
|
||||
*stream << " </testcase>\n";
|
||||
}
|
||||
}
|
||||
|
||||
// Prints an XML representation of a TestCase object
|
||||
|
@ -3780,6 +3793,26 @@ std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
|
|||
return attributes.GetString();
|
||||
}
|
||||
|
||||
void XmlUnitTestResultPrinter::OutputXmlTestProperties(
|
||||
std::ostream* stream, const TestResult& result) {
|
||||
const std::string kProperties = "properties";
|
||||
const std::string kProperty = "property";
|
||||
|
||||
if (result.test_property_count() <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
*stream << "<" << kProperties << ">\n";
|
||||
for (int i = 0; i < result.test_property_count(); ++i) {
|
||||
const TestProperty& property = result.GetTestProperty(i);
|
||||
*stream << "<" << kProperty;
|
||||
*stream << " name=\"" << EscapeXmlAttribute(property.key()) << "\"";
|
||||
*stream << " value=\"" << EscapeXmlAttribute(property.value()) << "\"";
|
||||
*stream << "/>\n";
|
||||
}
|
||||
*stream << "</" << kProperties << ">\n";
|
||||
}
|
||||
|
||||
// End XmlUnitTestResultPrinter
|
||||
|
||||
|
||||
|
|
|
@ -43,7 +43,13 @@ GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_"
|
|||
EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
|
||||
<testsuite name="PropertyOne" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||
<testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne" SetUpProp="1" TestSomeProperty="1" TearDownProp="1" />
|
||||
<testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne">
|
||||
<properties>
|
||||
<property name="SetUpProp" value="1"/>
|
||||
<property name="TestSomeProperty" value="1"/>
|
||||
<property name="TearDownProp" value="1"/>
|
||||
</properties>
|
||||
</testcase>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
"""
|
||||
|
@ -51,7 +57,13 @@ EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
|
|||
EXPECTED_XML_2 = """<?xml version="1.0" encoding="UTF-8"?>
|
||||
<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
|
||||
<testsuite name="PropertyTwo" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||
<testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo" SetUpProp="2" TestSomeProperty="2" TearDownProp="2" />
|
||||
<testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo">
|
||||
<properties>
|
||||
<property name="SetUpProp" value="2"/>
|
||||
<property name="TestSomeProperty" value="2"/>
|
||||
<property name="TearDownProp" value="2"/>
|
||||
</properties>
|
||||
</testcase>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
"""
|
||||
|
|
|
@ -104,15 +104,45 @@ Invalid characters in brackets []%(stack)s]]></failure>
|
|||
<testcase name="DISABLED_test_not_run" status="notrun" time="*" classname="DisabledTest"/>
|
||||
</testsuite>
|
||||
<testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*" SetUpTestCase="yes" TearDownTestCase="aye">
|
||||
<testcase name="OneProperty" status="run" time="*" classname="PropertyRecordingTest" key_1="1"/>
|
||||
<testcase name="IntValuedProperty" status="run" time="*" classname="PropertyRecordingTest" key_int="1"/>
|
||||
<testcase name="ThreeProperties" status="run" time="*" classname="PropertyRecordingTest" key_1="1" key_2="2" key_3="3"/>
|
||||
<testcase name="TwoValuesForOneKeyUsesLastValue" status="run" time="*" classname="PropertyRecordingTest" key_1="2"/>
|
||||
<testcase name="OneProperty" status="run" time="*" classname="PropertyRecordingTest">
|
||||
<properties>
|
||||
<property name="key_1" value="1"/>
|
||||
</properties>
|
||||
</testcase>
|
||||
<testcase name="IntValuedProperty" status="run" time="*" classname="PropertyRecordingTest">
|
||||
<properties>
|
||||
<property name="key_int" value="1"/>
|
||||
</properties>
|
||||
</testcase>
|
||||
<testcase name="ThreeProperties" status="run" time="*" classname="PropertyRecordingTest">
|
||||
<properties>
|
||||
<property name="key_1" value="1"/>
|
||||
<property name="key_2" value="2"/>
|
||||
<property name="key_3" value="3"/>
|
||||
</properties>
|
||||
</testcase>
|
||||
<testcase name="TwoValuesForOneKeyUsesLastValue" status="run" time="*" classname="PropertyRecordingTest">
|
||||
<properties>
|
||||
<property name="key_1" value="2"/>
|
||||
</properties>
|
||||
</testcase>
|
||||
</testsuite>
|
||||
<testsuite name="NoFixtureTest" tests="3" failures="0" disabled="0" errors="0" time="*">
|
||||
<testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest" key="1"/>
|
||||
<testcase name="ExternalUtilityThatCallsRecordIntValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_int="1"/>
|
||||
<testcase name="ExternalUtilityThatCallsRecordStringValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_string="1"/>
|
||||
<testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest">
|
||||
<properties>
|
||||
<property name="key" value="1"/>
|
||||
</properties>
|
||||
</testcase>
|
||||
<testcase name="ExternalUtilityThatCallsRecordIntValuedProperty" status="run" time="*" classname="NoFixtureTest">
|
||||
<properties>
|
||||
<property name="key_for_utility_int" value="1"/>
|
||||
</properties>
|
||||
</testcase>
|
||||
<testcase name="ExternalUtilityThatCallsRecordStringValuedProperty" status="run" time="*" classname="NoFixtureTest">
|
||||
<properties>
|
||||
<property name="key_for_utility_string" value="1"/>
|
||||
</properties>
|
||||
</testcase>
|
||||
</testsuite>
|
||||
<testsuite name="Single/ValueParamTest" tests="4" failures="0" disabled="0" errors="0" time="*">
|
||||
<testcase name="HasValueParamAttribute/0" value_param="33" status="run" time="*" classname="Single/ValueParamTest" />
|
||||
|
@ -149,7 +179,11 @@ EXPECTED_SHARDED_TEST_XML = """<?xml version="1.0" encoding="UTF-8"?>
|
|||
<testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
|
||||
</testsuite>
|
||||
<testsuite name="NoFixtureTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||
<testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest" key="1"/>
|
||||
<testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest">
|
||||
<properties>
|
||||
<property name="key" value="1"/>
|
||||
</properties>
|
||||
</testcase>
|
||||
</testsuite>
|
||||
<testsuite name="Single/ValueParamTest" tests="1" failures="0" disabled="0" errors="0" time="*">
|
||||
<testcase name="AnotherTestThatHasValueParamAttribute/1" value_param="42" status="run" time="*" classname="Single/ValueParamTest" />
|
||||
|
|
|
@ -101,19 +101,22 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
|||
self.AssertEquivalentNodes(child, actual_children[child_id])
|
||||
|
||||
identifying_attribute = {
|
||||
'testsuites': 'name',
|
||||
'testsuite': 'name',
|
||||
'testcase': 'name',
|
||||
'failure': 'message',
|
||||
}
|
||||
'testsuites': 'name',
|
||||
'testsuite': 'name',
|
||||
'testcase': 'name',
|
||||
'failure': 'message',
|
||||
'property': 'name',
|
||||
}
|
||||
|
||||
def _GetChildren(self, element):
|
||||
"""
|
||||
Fetches all of the child nodes of element, a DOM Element object.
|
||||
Returns them as the values of a dictionary keyed by the IDs of the
|
||||
children. For <testsuites>, <testsuite> and <testcase> elements, the ID
|
||||
is the value of their "name" attribute; for <failure> elements, it is
|
||||
the value of the "message" attribute; CDATA sections and non-whitespace
|
||||
children. For <testsuites>, <testsuite>, <testcase>, and <property>
|
||||
elements, the ID is the value of their "name" attribute; for <failure>
|
||||
elements, it is the value of the "message" attribute; for <properties>
|
||||
elements, it is the value of their parent's "name" attribute plus the
|
||||
literal string "properties"; CDATA sections and non-whitespace
|
||||
text nodes are concatenated into a single CDATA section with ID
|
||||
"detail". An exception is raised if any element other than the above
|
||||
four is encountered, if two child elements with the same identifying
|
||||
|
@ -123,11 +126,17 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
|||
children = {}
|
||||
for child in element.childNodes:
|
||||
if child.nodeType == Node.ELEMENT_NODE:
|
||||
self.assert_(child.tagName in self.identifying_attribute,
|
||||
'Encountered unknown element <%s>' % child.tagName)
|
||||
childID = child.getAttribute(self.identifying_attribute[child.tagName])
|
||||
self.assert_(childID not in children)
|
||||
children[childID] = child
|
||||
if child.tagName == 'properties':
|
||||
self.assert_(child.parentNode is not None,
|
||||
'Encountered <properties> element without a parent')
|
||||
child_id = child.parentNode.getAttribute('name') + '-properties'
|
||||
else:
|
||||
self.assert_(child.tagName in self.identifying_attribute,
|
||||
'Encountered unknown element <%s>' % child.tagName)
|
||||
child_id = child.getAttribute(
|
||||
self.identifying_attribute[child.tagName])
|
||||
self.assert_(child_id not in children)
|
||||
children[child_id] = child
|
||||
elif child.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:
|
||||
if 'detail' not in children:
|
||||
if (child.nodeType == Node.CDATA_SECTION_NODE or
|
||||
|
|
Loading…
Reference in New Issue
Block a user