Googletest export

Adds ISO8601 timestamps to XML output and RFC3339 timestamps to JSON output.

Adds timestamps to testsuites, testsuite and testcases structured JSON/XML output for better reporting how/where time is spent on tests.

PiperOrigin-RevId: 260039817
This commit is contained in:
Abseil Team 2019-07-25 19:04:39 -04:00 committed by Andy Getz
parent 373ed74af5
commit 2134e3fd85
7 changed files with 552 additions and 504 deletions

View File

@ -588,6 +588,10 @@ class GTEST_API_ TestResult {
// Returns the elapsed time, in milliseconds. // Returns the elapsed time, in milliseconds.
TimeInMillis elapsed_time() const { return elapsed_time_; } TimeInMillis elapsed_time() const { return elapsed_time_; }
// Gets the time of the test case start, in ms from the start of the
// UNIX epoch.
TimeInMillis start_timestamp() const { return start_timestamp_; }
// Returns the i-th test part result among all the results. i can range from 0 // Returns the i-th test part result among all the results. i can range from 0
// to total_part_count() - 1. If i is not in that range, aborts the program. // to total_part_count() - 1. If i is not in that range, aborts the program.
const TestPartResult& GetTestPartResult(int i) const; const TestPartResult& GetTestPartResult(int i) const;
@ -618,6 +622,9 @@ class GTEST_API_ TestResult {
return test_properties_; return test_properties_;
} }
// Sets the start time.
void set_start_timestamp(TimeInMillis start) { start_timestamp_ = start; }
// Sets the elapsed time. // Sets the elapsed time.
void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; } void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
@ -661,6 +668,8 @@ class GTEST_API_ TestResult {
std::vector<TestProperty> test_properties_; std::vector<TestProperty> test_properties_;
// Running count of death tests. // Running count of death tests.
int death_test_count_; int death_test_count_;
// The start time, in milliseconds since UNIX Epoch.
TimeInMillis start_timestamp_;
// The elapsed time, in milliseconds. // The elapsed time, in milliseconds.
TimeInMillis elapsed_time_; TimeInMillis elapsed_time_;
@ -881,6 +890,10 @@ class GTEST_API_ TestSuite {
// Returns the elapsed time, in milliseconds. // Returns the elapsed time, in milliseconds.
TimeInMillis elapsed_time() const { return elapsed_time_; } TimeInMillis elapsed_time() const { return elapsed_time_; }
// Gets the time of the test suite start, in ms from the start of the
// UNIX epoch.
TimeInMillis start_timestamp() const { return start_timestamp_; }
// Returns the i-th test among all the tests. i can range from 0 to // Returns the i-th test among all the tests. i can range from 0 to
// total_test_count() - 1. If i is not in that range, returns NULL. // total_test_count() - 1. If i is not in that range, returns NULL.
const TestInfo* GetTestInfo(int i) const; const TestInfo* GetTestInfo(int i) const;
@ -999,6 +1012,8 @@ class GTEST_API_ TestSuite {
internal::TearDownTestSuiteFunc tear_down_tc_; internal::TearDownTestSuiteFunc tear_down_tc_;
// True iff any test in this test suite should run. // True iff any test in this test suite should run.
bool should_run_; bool should_run_;
// The start time, in milliseconds since UNIX Epoch.
TimeInMillis start_timestamp_;
// Elapsed time, in milliseconds. // Elapsed time, in milliseconds.
TimeInMillis elapsed_time_; TimeInMillis elapsed_time_;
// Holds test properties recorded during execution of SetUpTestSuite and // Holds test properties recorded during execution of SetUpTestSuite and

View File

@ -2032,9 +2032,7 @@ std::string AppendUserMessage(const std::string& gtest_msg,
// Creates an empty TestResult. // Creates an empty TestResult.
TestResult::TestResult() TestResult::TestResult()
: death_test_count_(0), : death_test_count_(0), start_timestamp_(0), elapsed_time_(0) {}
elapsed_time_(0) {
}
// D'tor. // D'tor.
TestResult::~TestResult() { TestResult::~TestResult() {
@ -2103,13 +2101,7 @@ static const char* const kReservedTestSuitesAttributes[] = {
// The list of reserved attributes used in the <testsuite> element of XML // The list of reserved attributes used in the <testsuite> element of XML
// output. // output.
static const char* const kReservedTestSuiteAttributes[] = { static const char* const kReservedTestSuiteAttributes[] = {
"disabled", "disabled", "errors", "failures", "name", "tests", "time", "timestamp"};
"errors",
"failures",
"name",
"tests",
"time"
};
// The list of reserved attributes used in the <testcase> element of XML output. // The list of reserved attributes used in the <testcase> element of XML output.
static const char* const kReservedTestCaseAttributes[] = { static const char* const kReservedTestCaseAttributes[] = {
@ -2117,10 +2109,10 @@ static const char* const kReservedTestCaseAttributes[] = {
"value_param", "file", "line"}; "value_param", "file", "line"};
// Use a slightly different set for allowed output to ensure existing tests can // Use a slightly different set for allowed output to ensure existing tests can
// still RecordProperty("result") // still RecordProperty("result") or "RecordProperty(timestamp")
static const char* const kReservedOutputTestCaseAttributes[] = { static const char* const kReservedOutputTestCaseAttributes[] = {
"classname", "name", "status", "time", "type_param", "classname", "name", "status", "time", "type_param",
"value_param", "file", "line", "result"}; "value_param", "file", "line", "result", "timestamp"};
template <int kSize> template <int kSize>
std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) { std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
@ -2705,6 +2697,7 @@ void TestInfo::Run() {
test, &Test::DeleteSelf_, "the test fixture's destructor"); test, &Test::DeleteSelf_, "the test fixture's destructor");
} }
result_.set_start_timestamp(start);
result_.set_elapsed_time(internal::GetTimeInMillis() - start); result_.set_elapsed_time(internal::GetTimeInMillis() - start);
// Notifies the unit test event listener that a test has just finished. // Notifies the unit test event listener that a test has just finished.
@ -2774,6 +2767,7 @@ TestSuite::TestSuite(const char* a_name, const char* a_type_param,
set_up_tc_(set_up_tc), set_up_tc_(set_up_tc),
tear_down_tc_(tear_down_tc), tear_down_tc_(tear_down_tc),
should_run_(false), should_run_(false),
start_timestamp_(0),
elapsed_time_(0) {} elapsed_time_(0) {}
// Destructor of TestSuite. // Destructor of TestSuite.
@ -2823,11 +2817,11 @@ void TestSuite::Run() {
internal::HandleExceptionsInMethodIfSupported( internal::HandleExceptionsInMethodIfSupported(
this, &TestSuite::RunSetUpTestSuite, "SetUpTestSuite()"); this, &TestSuite::RunSetUpTestSuite, "SetUpTestSuite()");
const internal::TimeInMillis start = internal::GetTimeInMillis(); start_timestamp_ = internal::GetTimeInMillis();
for (int i = 0; i < total_test_count(); i++) { for (int i = 0; i < total_test_count(); i++) {
GetMutableTestInfo(i)->Run(); GetMutableTestInfo(i)->Run();
} }
elapsed_time_ = internal::GetTimeInMillis() - start; elapsed_time_ = internal::GetTimeInMillis() - start_timestamp_;
impl->os_stack_trace_getter()->UponLeavingGTest(); impl->os_stack_trace_getter()->UponLeavingGTest();
internal::HandleExceptionsInMethodIfSupported( internal::HandleExceptionsInMethodIfSupported(
@ -3788,6 +3782,9 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
: "suppressed"); : "suppressed");
OutputXmlAttribute(stream, kTestsuite, "time", OutputXmlAttribute(stream, kTestsuite, "time",
FormatTimeInMillisAsSeconds(result.elapsed_time())); FormatTimeInMillisAsSeconds(result.elapsed_time()));
OutputXmlAttribute(
stream, kTestsuite, "timestamp",
FormatEpochTimeInMillisAsIso8601(result.start_timestamp()));
OutputXmlAttribute(stream, kTestsuite, "classname", test_suite_name); OutputXmlAttribute(stream, kTestsuite, "classname", test_suite_name);
int failures = 0; int failures = 0;
@ -3838,6 +3835,9 @@ void XmlUnitTestResultPrinter::PrintXmlTestSuite(std::ostream* stream,
OutputXmlAttribute(stream, kTestsuite, "errors", "0"); OutputXmlAttribute(stream, kTestsuite, "errors", "0");
OutputXmlAttribute(stream, kTestsuite, "time", OutputXmlAttribute(stream, kTestsuite, "time",
FormatTimeInMillisAsSeconds(test_suite.elapsed_time())); FormatTimeInMillisAsSeconds(test_suite.elapsed_time()));
OutputXmlAttribute(
stream, kTestsuite, "timestamp",
FormatEpochTimeInMillisAsIso8601(test_suite.start_timestamp()));
*stream << TestPropertiesAsXmlAttributes(test_suite.ad_hoc_test_result()); *stream << TestPropertiesAsXmlAttributes(test_suite.ad_hoc_test_result());
} }
*stream << ">\n"; *stream << ">\n";
@ -3864,11 +3864,11 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
stream, kTestsuites, "disabled", stream, kTestsuites, "disabled",
StreamableToString(unit_test.reportable_disabled_test_count())); StreamableToString(unit_test.reportable_disabled_test_count()));
OutputXmlAttribute(stream, kTestsuites, "errors", "0"); OutputXmlAttribute(stream, kTestsuites, "errors", "0");
OutputXmlAttribute(stream, kTestsuites, "time",
FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
OutputXmlAttribute( OutputXmlAttribute(
stream, kTestsuites, "timestamp", stream, kTestsuites, "timestamp",
FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp())); FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
OutputXmlAttribute(stream, kTestsuites, "time",
FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
if (GTEST_FLAG(shuffle)) { if (GTEST_FLAG(shuffle)) {
OutputXmlAttribute(stream, kTestsuites, "random_seed", OutputXmlAttribute(stream, kTestsuites, "random_seed",
@ -4156,6 +4156,9 @@ void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream,
? (result.Skipped() ? "SKIPPED" : "COMPLETED") ? (result.Skipped() ? "SKIPPED" : "COMPLETED")
: "SUPPRESSED", : "SUPPRESSED",
kIndent); kIndent);
OutputJsonKey(stream, kTestsuite, "timestamp",
FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()),
kIndent);
OutputJsonKey(stream, kTestsuite, "time", OutputJsonKey(stream, kTestsuite, "time",
FormatTimeInMillisAsDuration(result.elapsed_time()), kIndent); FormatTimeInMillisAsDuration(result.elapsed_time()), kIndent);
OutputJsonKey(stream, kTestsuite, "classname", test_suite_name, kIndent, OutputJsonKey(stream, kTestsuite, "classname", test_suite_name, kIndent,
@ -4202,6 +4205,10 @@ void JsonUnitTestResultPrinter::PrintJsonTestSuite(
OutputJsonKey(stream, kTestsuite, "disabled", OutputJsonKey(stream, kTestsuite, "disabled",
test_suite.reportable_disabled_test_count(), kIndent); test_suite.reportable_disabled_test_count(), kIndent);
OutputJsonKey(stream, kTestsuite, "errors", 0, kIndent); OutputJsonKey(stream, kTestsuite, "errors", 0, kIndent);
OutputJsonKey(
stream, kTestsuite, "timestamp",
FormatEpochTimeInMillisAsRFC3339(test_suite.start_timestamp()),
kIndent);
OutputJsonKey(stream, kTestsuite, "time", OutputJsonKey(stream, kTestsuite, "time",
FormatTimeInMillisAsDuration(test_suite.elapsed_time()), FormatTimeInMillisAsDuration(test_suite.elapsed_time()),
kIndent, false); kIndent, false);

View File

@ -67,11 +67,14 @@ EXPECTED_1 = {
0, 0,
u'time': u'time':
u'*', u'*',
u'timestamp':
u'*',
u'testsuite': [{ u'testsuite': [{
u'name': u'TestSomeProperties', u'name': u'TestSomeProperties',
u'status': u'RUN', u'status': u'RUN',
u'result': u'COMPLETED', u'result': u'COMPLETED',
u'time': u'*', u'time': u'*',
u'timestamp': u'*',
u'classname': u'PropertyOne', u'classname': u'PropertyOne',
u'SetUpProp': u'1', u'SetUpProp': u'1',
u'TestSomeProperty': u'1', u'TestSomeProperty': u'1',
@ -108,10 +111,13 @@ EXPECTED_2 = {
0, 0,
u'time': u'time':
u'*', u'*',
u'timestamp':
u'*',
u'testsuite': [{ u'testsuite': [{
u'name': u'TestSomeProperties', u'name': u'TestSomeProperties',
u'status': u'RUN', u'status': u'RUN',
u'result': u'COMPLETED', u'result': u'COMPLETED',
u'timestamp': u'*',
u'time': u'*', u'time': u'*',
u'classname': u'PropertyTwo', u'classname': u'PropertyTwo',
u'SetUpProp': u'2', u'SetUpProp': u'2',

View File

@ -73,457 +73,474 @@ EXPECTED_NON_EMPTY = {
u'42', u'42',
u'name': u'name':
u'AllTests', u'AllTests',
u'testsuites': [ u'testsuites': [{
{ u'name':
u'SuccessfulTest',
u'tests':
1,
u'failures':
0,
u'disabled':
0,
u'errors':
0,
u'time':
u'*',
u'timestamp':
u'*',
u'testsuite': [{
u'name': u'Succeeds',
u'status': u'RUN',
u'result': u'COMPLETED',
u'time': u'*',
u'timestamp': u'*',
u'classname': u'SuccessfulTest'
}]
}, {
u'name':
u'FailedTest',
u'tests':
1,
u'failures':
1,
u'disabled':
0,
u'errors':
0,
u'time':
u'*',
u'timestamp':
u'*',
u'testsuite': [{
u'name': u'name':
u'SuccessfulTest', u'Fails',
u'tests': u'status':
1, u'RUN',
u'failures': u'result':
0, u'COMPLETED',
u'disabled':
0,
u'errors':
0,
u'time': u'time':
u'*', u'*',
u'testsuite': [{ u'timestamp':
u'name': u'Succeeds', u'*',
u'status': u'RUN', u'classname':
u'result': u'COMPLETED',
u'time': u'*',
u'classname': u'SuccessfulTest'
}]
},
{
u'name':
u'FailedTest', u'FailedTest',
u'tests': u'failures': [{
1, u'failure': u'gtest_xml_output_unittest_.cc:*\n'
u'failures': u'Expected equality of these values:\n'
1, u' 1\n 2' + STACK_TRACE_TEMPLATE,
u'disabled': u'type': u''
0, }]
u'errors': }]
0, }, {
u'name':
u'DisabledTest',
u'tests':
1,
u'failures':
0,
u'disabled':
1,
u'errors':
0,
u'time':
u'*',
u'timestamp':
u'*',
u'testsuite': [{
u'name': u'DISABLED_test_not_run',
u'status': u'NOTRUN',
u'result': u'SUPPRESSED',
u'time': u'*',
u'timestamp': u'*',
u'classname': u'DisabledTest'
}]
}, {
u'name':
u'SkippedTest',
u'tests':
1,
u'failures':
0,
u'disabled':
0,
u'errors':
0,
u'time':
u'*',
u'timestamp':
u'*',
u'testsuite': [{
u'name': u'Skipped',
u'status': u'RUN',
u'result': u'SKIPPED',
u'time': u'*',
u'timestamp': u'*',
u'classname': u'SkippedTest'
}]
}, {
u'name':
u'MixedResultTest',
u'tests':
3,
u'failures':
1,
u'disabled':
1,
u'errors':
0,
u'time':
u'*',
u'timestamp':
u'*',
u'testsuite': [{
u'name': u'Succeeds',
u'status': u'RUN',
u'result': u'COMPLETED',
u'time': u'*',
u'timestamp': u'*',
u'classname': u'MixedResultTest'
}, {
u'name':
u'Fails',
u'status':
u'RUN',
u'result':
u'COMPLETED',
u'time': u'time':
u'*', u'*',
u'testsuite': [{ u'timestamp':
u'name':
u'Fails',
u'status':
u'RUN',
u'result':
u'COMPLETED',
u'time':
u'*',
u'classname':
u'FailedTest',
u'failures': [{
u'failure': u'gtest_xml_output_unittest_.cc:*\n'
u'Expected equality of these values:\n'
u' 1\n 2' + STACK_TRACE_TEMPLATE,
u'type': u''
}]
}]
},
{
u'name':
u'DisabledTest',
u'tests':
1,
u'failures':
0,
u'disabled':
1,
u'errors':
0,
u'time':
u'*', u'*',
u'testsuite': [{ u'classname':
u'name': u'DISABLED_test_not_run',
u'status': u'NOTRUN',
u'result': u'SUPPRESSED',
u'time': u'*',
u'classname': u'DisabledTest'
}]
},
{
u'name':
u'SkippedTest',
u'tests':
1,
u'failures':
0,
u'disabled':
0,
u'errors':
0,
u'time':
u'*',
u'testsuite': [{
u'name': u'Skipped',
u'status': u'RUN',
u'result': u'SKIPPED',
u'time': u'*',
u'classname': u'SkippedTest'
}]
},
{
u'name':
u'MixedResultTest', u'MixedResultTest',
u'tests': u'failures': [{
3, u'failure': u'gtest_xml_output_unittest_.cc:*\n'
u'failures': u'Expected equality of these values:\n'
1, u' 1\n 2' + STACK_TRACE_TEMPLATE,
u'disabled': u'type': u''
1, }, {
u'errors': u'failure': u'gtest_xml_output_unittest_.cc:*\n'
0, u'Expected equality of these values:\n'
u' 2\n 3' + STACK_TRACE_TEMPLATE,
u'type': u''
}]
}, {
u'name': u'DISABLED_test',
u'status': u'NOTRUN',
u'result': u'SUPPRESSED',
u'time': u'*',
u'timestamp': u'*',
u'classname': u'MixedResultTest'
}]
}, {
u'name':
u'XmlQuotingTest',
u'tests':
1,
u'failures':
1,
u'disabled':
0,
u'errors':
0,
u'time':
u'*',
u'timestamp':
u'*',
u'testsuite': [{
u'name':
u'OutputsCData',
u'status':
u'RUN',
u'result':
u'COMPLETED',
u'time': u'time':
u'*', u'*',
u'testsuite': [ u'timestamp':
{ u'*',
u'name': u'Succeeds', u'classname':
u'status': u'RUN',
u'result': u'COMPLETED',
u'time': u'*',
u'classname': u'MixedResultTest'
},
{
u'name':
u'Fails',
u'status':
u'RUN',
u'result':
u'COMPLETED',
u'time':
u'*',
u'classname':
u'MixedResultTest',
u'failures':
[{
u'failure': u'gtest_xml_output_unittest_.cc:*\n'
u'Expected equality of these values:\n'
u' 1\n 2' + STACK_TRACE_TEMPLATE,
u'type': u''
},
{
u'failure': u'gtest_xml_output_unittest_.cc:*\n'
u'Expected equality of these values:\n'
u' 2\n 3' + STACK_TRACE_TEMPLATE,
u'type': u''
}]
},
{
u'name': u'DISABLED_test',
u'status': u'NOTRUN',
u'result': u'SUPPRESSED',
u'time': u'*',
u'classname': u'MixedResultTest'
}
]
},
{
u'name':
u'XmlQuotingTest', u'XmlQuotingTest',
u'tests': u'failures': [{
1, u'failure': u'gtest_xml_output_unittest_.cc:*\n'
u'failures': u'Failed\nXML output: <?xml encoding="utf-8">'
1, u'<top><![CDATA[cdata text]]></top>' +
u'disabled': STACK_TRACE_TEMPLATE,
0, u'type': u''
u'errors': }]
0, }]
}, {
u'name':
u'InvalidCharactersTest',
u'tests':
1,
u'failures':
1,
u'disabled':
0,
u'errors':
0,
u'time':
u'*',
u'timestamp':
u'*',
u'testsuite': [{
u'name':
u'InvalidCharactersInMessage',
u'status':
u'RUN',
u'result':
u'COMPLETED',
u'time': u'time':
u'*', u'*',
u'testsuite': [{ u'timestamp':
u'name': u'*',
u'OutputsCData', u'classname':
u'status':
u'RUN',
u'result':
u'COMPLETED',
u'time':
u'*',
u'classname':
u'XmlQuotingTest',
u'failures': [{
u'failure': u'gtest_xml_output_unittest_.cc:*\n'
u'Failed\nXML output: <?xml encoding="utf-8">'
u'<top><![CDATA[cdata text]]></top>' +
STACK_TRACE_TEMPLATE,
u'type': u''
}]
}]
},
{
u'name':
u'InvalidCharactersTest', u'InvalidCharactersTest',
u'tests': u'failures': [{
1, u'failure': u'gtest_xml_output_unittest_.cc:*\n'
u'failures': u'Failed\nInvalid characters in brackets'
1, u' [\x01\x02]' + STACK_TRACE_TEMPLATE,
u'disabled': u'type': u''
0,
u'errors':
0,
u'time':
u'*',
u'testsuite': [{
u'name':
u'InvalidCharactersInMessage',
u'status':
u'RUN',
u'result':
u'COMPLETED',
u'time':
u'*',
u'classname':
u'InvalidCharactersTest',
u'failures': [{
u'failure': u'gtest_xml_output_unittest_.cc:*\n'
u'Failed\nInvalid characters in brackets'
u' [\x01\x02]' + STACK_TRACE_TEMPLATE,
u'type': u''
}]
}] }]
}, }]
{ }, {
u'name': u'name':
u'PropertyRecordingTest', u'PropertyRecordingTest',
u'tests': u'tests':
4, 4,
u'failures': u'failures':
0, 0,
u'disabled': u'disabled':
0, 0,
u'errors': u'errors':
0, 0,
u'time': u'time':
u'*', u'*',
u'SetUpTestSuite': u'timestamp':
u'yes', u'*',
u'TearDownTestSuite': u'SetUpTestSuite':
u'aye', u'yes',
u'testsuite': [{ u'TearDownTestSuite':
u'name': u'OneProperty', u'aye',
u'status': u'RUN', u'testsuite': [{
u'result': u'COMPLETED', u'name': u'OneProperty',
u'time': u'*', u'status': u'RUN',
u'classname': u'PropertyRecordingTest', u'result': u'COMPLETED',
u'key_1': u'1' u'time': u'*',
}, u'timestamp': u'*',
{ u'classname': u'PropertyRecordingTest',
u'name': u'IntValuedProperty', u'key_1': u'1'
u'status': u'RUN', }, {
u'result': u'COMPLETED', u'name': u'IntValuedProperty',
u'time': u'*', u'status': u'RUN',
u'classname': u'PropertyRecordingTest', u'result': u'COMPLETED',
u'key_int': u'1' u'time': u'*',
}, u'timestamp': u'*',
{ u'classname': u'PropertyRecordingTest',
u'name': u'ThreeProperties', u'key_int': u'1'
u'status': u'RUN', }, {
u'result': u'COMPLETED', u'name': u'ThreeProperties',
u'time': u'*', u'status': u'RUN',
u'classname': u'PropertyRecordingTest', u'result': u'COMPLETED',
u'key_1': u'1', u'time': u'*',
u'key_2': u'2', u'timestamp': u'*',
u'key_3': u'3' u'classname': u'PropertyRecordingTest',
}, u'key_1': u'1',
{ u'key_2': u'2',
u'name': u'TwoValuesForOneKeyUsesLastValue', u'key_3': u'3'
u'status': u'RUN', }, {
u'result': u'COMPLETED', u'name': u'TwoValuesForOneKeyUsesLastValue',
u'time': u'*', u'status': u'RUN',
u'classname': u'PropertyRecordingTest', u'result': u'COMPLETED',
u'key_1': u'2' u'time': u'*',
}] u'timestamp': u'*',
}, u'classname': u'PropertyRecordingTest',
{ u'key_1': u'2'
u'name': }]
u'NoFixtureTest', }, {
u'tests': u'name':
3, u'NoFixtureTest',
u'failures': u'tests':
0, 3,
u'disabled': u'failures':
0, 0,
u'errors': u'disabled':
0, 0,
u'time': u'errors':
u'*', 0,
u'testsuite': [ u'time':
{ u'*',
u'name': u'RecordProperty', u'timestamp':
u'status': u'RUN', u'*',
u'result': u'COMPLETED', u'testsuite': [{
u'time': u'*', u'name': u'RecordProperty',
u'classname': u'NoFixtureTest', u'status': u'RUN',
u'key': u'1' u'result': u'COMPLETED',
}, u'time': u'*',
{ u'timestamp': u'*',
u'name': u'ExternalUtilityThatCallsRecordIntValuedProperty', u'classname': u'NoFixtureTest',
u'status': u'RUN', u'key': u'1'
u'result': u'COMPLETED', }, {
u'time': u'*', u'name': u'ExternalUtilityThatCallsRecordIntValuedProperty',
u'classname': u'NoFixtureTest', u'status': u'RUN',
u'key_for_utility_int': u'1' u'result': u'COMPLETED',
}, u'time': u'*',
{ u'timestamp': u'*',
u'name': u'classname': u'NoFixtureTest',
u'ExternalUtilityThatCallsRecordStringValuedProperty', u'key_for_utility_int': u'1'
u'status': }, {
u'RUN', u'name': u'ExternalUtilityThatCallsRecordStringValuedProperty',
u'result': u'status': u'RUN',
u'COMPLETED', u'result': u'COMPLETED',
u'time': u'time': u'*',
u'*', u'timestamp': u'*',
u'classname': u'classname': u'NoFixtureTest',
u'NoFixtureTest', u'key_for_utility_string': u'1'
u'key_for_utility_string': }]
u'1' }, {
} u'name':
] u'TypedTest/0',
}, u'tests':
{ 1,
u'name': u'failures':
u'TypedTest/0', 0,
u'tests': u'disabled':
1, 0,
u'failures': u'errors':
0, 0,
u'disabled': u'time':
0, u'*',
u'errors': u'timestamp':
0, u'*',
u'time': u'testsuite': [{
u'*', u'name': u'HasTypeParamAttribute',
u'testsuite': [{ u'type_param': u'int',
u'name': u'HasTypeParamAttribute', u'status': u'RUN',
u'type_param': u'int', u'result': u'COMPLETED',
u'status': u'RUN', u'time': u'*',
u'result': u'COMPLETED', u'timestamp': u'*',
u'time': u'*', u'classname': u'TypedTest/0'
u'classname': u'TypedTest/0' }]
}] }, {
}, u'name':
{ u'TypedTest/1',
u'name': u'tests':
u'TypedTest/1', 1,
u'tests': u'failures':
1, 0,
u'failures': u'disabled':
0, 0,
u'disabled': u'errors':
0, 0,
u'errors': u'time':
0, u'*',
u'time': u'timestamp':
u'*', u'*',
u'testsuite': [{ u'testsuite': [{
u'name': u'HasTypeParamAttribute', u'name': u'HasTypeParamAttribute',
u'type_param': u'long', u'type_param': u'long',
u'status': u'RUN', u'status': u'RUN',
u'result': u'COMPLETED', u'result': u'COMPLETED',
u'time': u'*', u'time': u'*',
u'classname': u'TypedTest/1' u'timestamp': u'*',
}] u'classname': u'TypedTest/1'
}, }]
{ }, {
u'name': u'name':
u'Single/TypeParameterizedTestSuite/0', u'Single/TypeParameterizedTestSuite/0',
u'tests': u'tests':
1, 1,
u'failures': u'failures':
0, 0,
u'disabled': u'disabled':
0, 0,
u'errors': u'errors':
0, 0,
u'time': u'time':
u'*', u'*',
u'testsuite': [{ u'timestamp':
u'name': u'HasTypeParamAttribute', u'*',
u'type_param': u'int', u'testsuite': [{
u'status': u'RUN', u'name': u'HasTypeParamAttribute',
u'result': u'COMPLETED', u'type_param': u'int',
u'time': u'*', u'status': u'RUN',
u'classname': u'Single/TypeParameterizedTestSuite/0' u'result': u'COMPLETED',
}] u'time': u'*',
}, u'timestamp': u'*',
{ u'classname': u'Single/TypeParameterizedTestSuite/0'
u'name': }]
u'Single/TypeParameterizedTestSuite/1', }, {
u'tests': u'name':
1, u'Single/TypeParameterizedTestSuite/1',
u'failures': u'tests':
0, 1,
u'disabled': u'failures':
0, 0,
u'errors': u'disabled':
0, 0,
u'time': u'errors':
u'*', 0,
u'testsuite': [{ u'time':
u'name': u'HasTypeParamAttribute', u'*',
u'type_param': u'long', u'timestamp':
u'status': u'RUN', u'*',
u'result': u'COMPLETED', u'testsuite': [{
u'time': u'*', u'name': u'HasTypeParamAttribute',
u'classname': u'Single/TypeParameterizedTestSuite/1' u'type_param': u'long',
}] u'status': u'RUN',
}, u'result': u'COMPLETED',
{ u'time': u'*',
u'name': u'timestamp': u'*',
u'Single/ValueParamTest', u'classname': u'Single/TypeParameterizedTestSuite/1'
u'tests': }]
4, }, {
u'failures': u'name':
0, u'Single/ValueParamTest',
u'disabled': u'tests':
0, 4,
u'errors': u'failures':
0, 0,
u'time': u'disabled':
u'*', 0,
u'testsuite': [ u'errors':
{ 0,
u'name': u'HasValueParamAttribute/0', u'time':
u'value_param': u'33', u'*',
u'status': u'RUN', u'timestamp':
u'result': u'COMPLETED', u'*',
u'time': u'*', u'testsuite': [{
u'classname': u'Single/ValueParamTest' u'name': u'HasValueParamAttribute/0',
}, u'value_param': u'33',
{ u'status': u'RUN',
u'name': u'HasValueParamAttribute/1', u'result': u'COMPLETED',
u'value_param': u'42', u'time': u'*',
u'status': u'RUN', u'timestamp': u'*',
u'result': u'COMPLETED', u'classname': u'Single/ValueParamTest'
u'time': u'*', }, {
u'classname': u'Single/ValueParamTest' u'name': u'HasValueParamAttribute/1',
}, u'value_param': u'42',
{ u'status': u'RUN',
u'name': u'AnotherTestThatHasValueParamAttribute/0', u'result': u'COMPLETED',
u'value_param': u'33', u'time': u'*',
u'status': u'RUN', u'timestamp': u'*',
u'result': u'COMPLETED', u'classname': u'Single/ValueParamTest'
u'time': u'*', }, {
u'classname': u'Single/ValueParamTest' u'name': u'AnotherTestThatHasValueParamAttribute/0',
}, u'value_param': u'33',
{ u'status': u'RUN',
u'name': u'AnotherTestThatHasValueParamAttribute/1', u'result': u'COMPLETED',
u'value_param': u'42', u'time': u'*',
u'status': u'RUN', u'timestamp': u'*',
u'result': u'COMPLETED', u'classname': u'Single/ValueParamTest'
u'time': u'*', }, {
u'classname': u'Single/ValueParamTest' u'name': u'AnotherTestThatHasValueParamAttribute/1',
} u'value_param': u'42',
] u'status': u'RUN',
} u'result': u'COMPLETED',
] u'time': u'*',
u'timestamp': u'*',
u'classname': u'Single/ValueParamTest'
}]
}]
} }
EXPECTED_FILTERED = { EXPECTED_FILTERED = {
@ -556,11 +573,14 @@ EXPECTED_FILTERED = {
0, 0,
u'time': u'time':
u'*', u'*',
u'timestamp':
u'*',
u'testsuite': [{ u'testsuite': [{
u'name': u'Succeeds', u'name': u'Succeeds',
u'status': u'RUN', u'status': u'RUN',
u'result': u'COMPLETED', u'result': u'COMPLETED',
u'time': u'*', u'time': u'*',
u'timestamp': u'*',
u'classname': u'SuccessfulTest', u'classname': u'SuccessfulTest',
}] }]
}], }],

View File

@ -42,8 +42,8 @@ GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_"
EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?> EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests"> <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="*"> <testsuite name="PropertyOne" tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="TestSomeProperties" status="run" result="completed" time="*" classname="PropertyOne"> <testcase name="TestSomeProperties" status="run" result="completed" time="*" timestamp="*" classname="PropertyOne">
<properties> <properties>
<property name="SetUpProp" value="1"/> <property name="SetUpProp" value="1"/>
<property name="TestSomeProperty" value="1"/> <property name="TestSomeProperty" value="1"/>
@ -56,8 +56,8 @@ EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
EXPECTED_XML_2 = """<?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"> <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="*"> <testsuite name="PropertyTwo" tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="TestSomeProperties" status="run" result="completed" time="*" classname="PropertyTwo"> <testcase name="TestSomeProperties" status="run" result="completed" time="*" timestamp="*" classname="PropertyTwo">
<properties> <properties>
<property name="SetUpProp" value="2"/> <property name="SetUpProp" value="2"/>
<property name="TestSomeProperty" value="2"/> <property name="TestSomeProperty" value="2"/>

View File

@ -66,20 +66,20 @@ else:
EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?> EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="24" failures="4" disabled="2" errors="0" time="*" timestamp="*" name="AllTests" ad_hoc_property="42"> <testsuites tests="24" failures="4" disabled="2" errors="0" time="*" timestamp="*" name="AllTests" ad_hoc_property="42">
<testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*"> <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="Succeeds" status="run" result="completed" time="*" classname="SuccessfulTest"/> <testcase name="Succeeds" status="run" result="completed" time="*" timestamp="*" classname="SuccessfulTest"/>
</testsuite> </testsuite>
<testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*"> <testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="Fails" status="run" result="completed" time="*" classname="FailedTest"> <testcase name="Fails" status="run" result="completed" time="*" timestamp="*" classname="FailedTest">
<failure message="gtest_xml_output_unittest_.cc:*&#x0A;Expected equality of these values:&#x0A; 1&#x0A; 2" type=""><![CDATA[gtest_xml_output_unittest_.cc:* <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Expected equality of these values:&#x0A; 1&#x0A; 2" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
Expected equality of these values: Expected equality of these values:
1 1
2%(stack)s]]></failure> 2%(stack)s]]></failure>
</testcase> </testcase>
</testsuite> </testsuite>
<testsuite name="MixedResultTest" tests="3" failures="1" disabled="1" errors="0" time="*"> <testsuite name="MixedResultTest" tests="3" failures="1" disabled="1" errors="0" time="*" timestamp="*">
<testcase name="Succeeds" status="run" result="completed" time="*" classname="MixedResultTest"/> <testcase name="Succeeds" status="run" result="completed" time="*" timestamp="*" classname="MixedResultTest"/>
<testcase name="Fails" status="run" result="completed" time="*" classname="MixedResultTest"> <testcase name="Fails" status="run" result="completed" time="*" timestamp="*" classname="MixedResultTest">
<failure message="gtest_xml_output_unittest_.cc:*&#x0A;Expected equality of these values:&#x0A; 1&#x0A; 2" type=""><![CDATA[gtest_xml_output_unittest_.cc:* <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Expected equality of these values:&#x0A; 1&#x0A; 2" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
Expected equality of these values: Expected equality of these values:
1 1
@ -89,86 +89,86 @@ Expected equality of these values:
2 2
3%(stack)s]]></failure> 3%(stack)s]]></failure>
</testcase> </testcase>
<testcase name="DISABLED_test" status="notrun" result="suppressed" time="*" classname="MixedResultTest"/> <testcase name="DISABLED_test" status="notrun" result="suppressed" time="*" timestamp="*" classname="MixedResultTest"/>
</testsuite> </testsuite>
<testsuite name="XmlQuotingTest" tests="1" failures="1" disabled="0" errors="0" time="*"> <testsuite name="XmlQuotingTest" tests="1" failures="1" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="OutputsCData" status="run" result="completed" time="*" classname="XmlQuotingTest"> <testcase name="OutputsCData" status="run" result="completed" time="*" timestamp="*" classname="XmlQuotingTest">
<failure message="gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;XML output: &lt;?xml encoding=&quot;utf-8&quot;&gt;&lt;top&gt;&lt;![CDATA[cdata text]]&gt;&lt;/top&gt;" type=""><![CDATA[gtest_xml_output_unittest_.cc:* <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;XML output: &lt;?xml encoding=&quot;utf-8&quot;&gt;&lt;top&gt;&lt;![CDATA[cdata text]]&gt;&lt;/top&gt;" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
Failed Failed
XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]>]]&gt;<![CDATA[</top>%(stack)s]]></failure> XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]>]]&gt;<![CDATA[</top>%(stack)s]]></failure>
</testcase> </testcase>
</testsuite> </testsuite>
<testsuite name="InvalidCharactersTest" tests="1" failures="1" disabled="0" errors="0" time="*"> <testsuite name="InvalidCharactersTest" tests="1" failures="1" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="InvalidCharactersInMessage" status="run" result="completed" time="*" classname="InvalidCharactersTest"> <testcase name="InvalidCharactersInMessage" status="run" result="completed" time="*" timestamp="*" classname="InvalidCharactersTest">
<failure message="gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;Invalid characters in brackets []" type=""><![CDATA[gtest_xml_output_unittest_.cc:* <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;Invalid characters in brackets []" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
Failed Failed
Invalid characters in brackets []%(stack)s]]></failure> Invalid characters in brackets []%(stack)s]]></failure>
</testcase> </testcase>
</testsuite> </testsuite>
<testsuite name="DisabledTest" tests="1" failures="0" disabled="1" errors="0" time="*"> <testsuite name="DisabledTest" tests="1" failures="0" disabled="1" errors="0" time="*" timestamp="*">
<testcase name="DISABLED_test_not_run" status="notrun" result="suppressed" time="*" classname="DisabledTest"/> <testcase name="DISABLED_test_not_run" status="notrun" result="suppressed" time="*" timestamp="*" classname="DisabledTest"/>
</testsuite> </testsuite>
<testsuite name="SkippedTest" tests="1" failures="0" disabled="0" errors="0" time="*"> <testsuite name="SkippedTest" tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="Skipped" status="run" result="skipped" time="*" classname="SkippedTest"/> <testcase name="Skipped" status="run" result="skipped" time="*" timestamp="*" classname="SkippedTest"/>
</testsuite> </testsuite>
<testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*" SetUpTestSuite="yes" TearDownTestSuite="aye"> <testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*" timestamp="*" SetUpTestSuite="yes" TearDownTestSuite="aye">
<testcase name="OneProperty" status="run" result="completed" time="*" classname="PropertyRecordingTest"> <testcase name="OneProperty" status="run" result="completed" time="*" timestamp="*" classname="PropertyRecordingTest">
<properties> <properties>
<property name="key_1" value="1"/> <property name="key_1" value="1"/>
</properties> </properties>
</testcase> </testcase>
<testcase name="IntValuedProperty" status="run" result="completed" time="*" classname="PropertyRecordingTest"> <testcase name="IntValuedProperty" status="run" result="completed" time="*" timestamp="*" classname="PropertyRecordingTest">
<properties> <properties>
<property name="key_int" value="1"/> <property name="key_int" value="1"/>
</properties> </properties>
</testcase> </testcase>
<testcase name="ThreeProperties" status="run" result="completed" time="*" classname="PropertyRecordingTest"> <testcase name="ThreeProperties" status="run" result="completed" time="*" timestamp="*" classname="PropertyRecordingTest">
<properties> <properties>
<property name="key_1" value="1"/> <property name="key_1" value="1"/>
<property name="key_2" value="2"/> <property name="key_2" value="2"/>
<property name="key_3" value="3"/> <property name="key_3" value="3"/>
</properties> </properties>
</testcase> </testcase>
<testcase name="TwoValuesForOneKeyUsesLastValue" status="run" result="completed" time="*" classname="PropertyRecordingTest"> <testcase name="TwoValuesForOneKeyUsesLastValue" status="run" result="completed" time="*" timestamp="*" classname="PropertyRecordingTest">
<properties> <properties>
<property name="key_1" value="2"/> <property name="key_1" value="2"/>
</properties> </properties>
</testcase> </testcase>
</testsuite> </testsuite>
<testsuite name="NoFixtureTest" tests="3" failures="0" disabled="0" errors="0" time="*"> <testsuite name="NoFixtureTest" tests="3" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="RecordProperty" status="run" result="completed" time="*" classname="NoFixtureTest"> <testcase name="RecordProperty" status="run" result="completed" time="*" timestamp="*" classname="NoFixtureTest">
<properties> <properties>
<property name="key" value="1"/> <property name="key" value="1"/>
</properties> </properties>
</testcase> </testcase>
<testcase name="ExternalUtilityThatCallsRecordIntValuedProperty" status="run" result="completed" time="*" classname="NoFixtureTest"> <testcase name="ExternalUtilityThatCallsRecordIntValuedProperty" status="run" result="completed" time="*" timestamp="*" classname="NoFixtureTest">
<properties> <properties>
<property name="key_for_utility_int" value="1"/> <property name="key_for_utility_int" value="1"/>
</properties> </properties>
</testcase> </testcase>
<testcase name="ExternalUtilityThatCallsRecordStringValuedProperty" status="run" result="completed" time="*" classname="NoFixtureTest"> <testcase name="ExternalUtilityThatCallsRecordStringValuedProperty" status="run" result="completed" time="*" timestamp="*" classname="NoFixtureTest">
<properties> <properties>
<property name="key_for_utility_string" value="1"/> <property name="key_for_utility_string" value="1"/>
</properties> </properties>
</testcase> </testcase>
</testsuite> </testsuite>
<testsuite name="Single/ValueParamTest" tests="4" failures="0" disabled="0" errors="0" time="*"> <testsuite name="Single/ValueParamTest" tests="4" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="HasValueParamAttribute/0" value_param="33" status="run" result="completed" time="*" classname="Single/ValueParamTest" /> <testcase name="HasValueParamAttribute/0" value_param="33" status="run" result="completed" time="*" timestamp="*" classname="Single/ValueParamTest" />
<testcase name="HasValueParamAttribute/1" value_param="42" status="run" result="completed" time="*" classname="Single/ValueParamTest" /> <testcase name="HasValueParamAttribute/1" value_param="42" status="run" result="completed" time="*" timestamp="*" classname="Single/ValueParamTest" />
<testcase name="AnotherTestThatHasValueParamAttribute/0" value_param="33" status="run" result="completed" time="*" classname="Single/ValueParamTest" /> <testcase name="AnotherTestThatHasValueParamAttribute/0" value_param="33" status="run" result="completed" time="*" timestamp="*" classname="Single/ValueParamTest" />
<testcase name="AnotherTestThatHasValueParamAttribute/1" value_param="42" status="run" result="completed" time="*" classname="Single/ValueParamTest" /> <testcase name="AnotherTestThatHasValueParamAttribute/1" value_param="42" status="run" result="completed" time="*" timestamp="*" classname="Single/ValueParamTest" />
</testsuite> </testsuite>
<testsuite name="TypedTest/0" tests="1" failures="0" disabled="0" errors="0" time="*"> <testsuite name="TypedTest/0" tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="HasTypeParamAttribute" type_param="*" status="run" result="completed" time="*" classname="TypedTest/0" /> <testcase name="HasTypeParamAttribute" type_param="*" status="run" result="completed" time="*" timestamp="*" classname="TypedTest/0" />
</testsuite> </testsuite>
<testsuite name="TypedTest/1" tests="1" failures="0" disabled="0" errors="0" time="*"> <testsuite name="TypedTest/1" tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="HasTypeParamAttribute" type_param="*" status="run" result="completed" time="*" classname="TypedTest/1" /> <testcase name="HasTypeParamAttribute" type_param="*" status="run" result="completed" time="*" timestamp="*" classname="TypedTest/1" />
</testsuite> </testsuite>
<testsuite name="Single/TypeParameterizedTestSuite/0" tests="1" failures="0" disabled="0" errors="0" time="*"> <testsuite name="Single/TypeParameterizedTestSuite/0" tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="HasTypeParamAttribute" type_param="*" status="run" result="completed" time="*" classname="Single/TypeParameterizedTestSuite/0" /> <testcase name="HasTypeParamAttribute" type_param="*" status="run" result="completed" time="*" timestamp="*" classname="Single/TypeParameterizedTestSuite/0" />
</testsuite> </testsuite>
<testsuite name="Single/TypeParameterizedTestSuite/1" tests="1" failures="0" disabled="0" errors="0" time="*"> <testsuite name="Single/TypeParameterizedTestSuite/1" tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="HasTypeParamAttribute" type_param="*" status="run" result="completed" time="*" classname="Single/TypeParameterizedTestSuite/1" /> <testcase name="HasTypeParamAttribute" type_param="*" status="run" result="completed" time="*" timestamp="*" classname="Single/TypeParameterizedTestSuite/1" />
</testsuite> </testsuite>
</testsuites>""" % { </testsuites>""" % {
'stack': STACK_TRACE_TEMPLATE 'stack': STACK_TRACE_TEMPLATE
@ -178,25 +178,25 @@ EXPECTED_FILTERED_TEST_XML = """<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" <testsuites tests="1" failures="0" disabled="0" errors="0" time="*"
timestamp="*" name="AllTests" ad_hoc_property="42"> timestamp="*" name="AllTests" ad_hoc_property="42">
<testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0"
errors="0" time="*"> errors="0" time="*" timestamp="*">
<testcase name="Succeeds" status="run" result="completed" time="*" classname="SuccessfulTest"/> <testcase name="Succeeds" status="run" result="completed" time="*" timestamp="*" classname="SuccessfulTest"/>
</testsuite> </testsuite>
</testsuites>""" </testsuites>"""
EXPECTED_SHARDED_TEST_XML = """<?xml version="1.0" encoding="UTF-8"?> EXPECTED_SHARDED_TEST_XML = """<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="3" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests" ad_hoc_property="42"> <testsuites tests="3" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests" ad_hoc_property="42">
<testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*"> <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="Succeeds" status="run" result="completed" time="*" classname="SuccessfulTest"/> <testcase name="Succeeds" status="run" result="completed" time="*" timestamp="*" classname="SuccessfulTest"/>
</testsuite> </testsuite>
<testsuite name="PropertyRecordingTest" tests="1" failures="0" disabled="0" errors="0" time="*" SetUpTestSuite="yes" TearDownTestSuite="aye"> <testsuite name="PropertyRecordingTest" tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" SetUpTestSuite="yes" TearDownTestSuite="aye">
<testcase name="TwoValuesForOneKeyUsesLastValue" status="run" result="completed" time="*" classname="PropertyRecordingTest"> <testcase name="TwoValuesForOneKeyUsesLastValue" status="run" result="completed" time="*" timestamp="*" classname="PropertyRecordingTest">
<properties> <properties>
<property name="key_1" value="2"/> <property name="key_1" value="2"/>
</properties> </properties>
</testcase> </testcase>
</testsuite> </testsuite>
<testsuite name="Single/ValueParamTest" tests="1" failures="0" disabled="0" errors="0" time="*"> <testsuite name="Single/ValueParamTest" tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*">
<testcase name="AnotherTestThatHasValueParamAttribute/0" value_param="33" status="run" result="completed" time="*" classname="Single/ValueParamTest" /> <testcase name="AnotherTestThatHasValueParamAttribute/0" value_param="33" status="run" result="completed" time="*" timestamp="*" classname="Single/ValueParamTest" />
</testsuite> </testsuite>
</testsuites>""" </testsuites>"""

View File

@ -169,7 +169,7 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
* The stack traces are removed. * The stack traces are removed.
""" """
if element.tagName == 'testsuites': if element.tagName in ('testsuites', 'testsuite', 'testcase'):
timestamp = element.getAttributeNode('timestamp') timestamp = element.getAttributeNode('timestamp')
timestamp.value = re.sub(r'^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d$', timestamp.value = re.sub(r'^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d$',
'*', timestamp.value) '*', timestamp.value)