Skip to content

Commit cfef99e

Browse files
authored
Merge pull request #1010 from itavero/ojunit-update
Extended JUnit output
2 parents cb82186 + 7e14df2 commit cfef99e

File tree

2 files changed

+137
-15
lines changed

2 files changed

+137
-15
lines changed

src/CppUTest/JUnitTestOutput.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,26 +34,30 @@
3434
struct JUnitTestCaseResultNode
3535
{
3636
JUnitTestCaseResultNode() :
37-
execTime_(0), failure_(0), ignored_(false), next_(0)
37+
execTime_(0), failure_(0), ignored_(false), lineNumber_ (0), checkCount_ (0), next_(0)
3838
{
3939
}
4040

4141
SimpleString name_;
4242
long execTime_;
4343
TestFailure* failure_;
4444
bool ignored_;
45+
SimpleString file_;
46+
int lineNumber_;
47+
int checkCount_;
4548
JUnitTestCaseResultNode* next_;
4649
};
4750

4851
struct JUnitTestGroupResult
4952
{
5053
JUnitTestGroupResult() :
51-
testCount_(0), failureCount_(0), startTime_(0), groupExecTime_(0), head_(0), tail_(0)
54+
testCount_(0), failureCount_(0), totalCheckCount_(0), startTime_(0), groupExecTime_(0), head_(0), tail_(0)
5255
{
5356
}
5457

5558
int testCount_;
5659
int failureCount_;
60+
int totalCheckCount_;
5761
long startTime_;
5862
long groupExecTime_;
5963
SimpleString group_;
@@ -108,6 +112,7 @@ void JUnitTestOutput::printCurrentTestEnded(const TestResult& result)
108112
{
109113
impl_->results_.tail_->execTime_
110114
= result.getCurrentTestTotalExecutionTime();
115+
impl_->results_.tail_->checkCount_ = result.getCheckCount();
111116
}
112117

113118
void JUnitTestOutput::printTestsEnded(const TestResult& /*result*/)
@@ -136,6 +141,8 @@ void JUnitTestOutput::printCurrentTestStarted(const UtestShell& test)
136141
impl_->results_.tail_ = impl_->results_.tail_->next_;
137142
}
138143
impl_->results_.tail_->name_ = test.getName();
144+
impl_->results_.tail_->file_ = test.getFile();
145+
impl_->results_.tail_->lineNumber_ = test.getLineNumber();
139146
if (!test.willRun()) {
140147
impl_->results_.tail_->ignored_ = true;
141148
}
@@ -185,15 +192,22 @@ void JUnitTestOutput::writeProperties()
185192
void JUnitTestOutput::writeTestCases()
186193
{
187194
JUnitTestCaseResultNode* cur = impl_->results_.head_;
195+
188196
while (cur) {
189197
SimpleString buf = StringFromFormat(
190-
"<testcase classname=\"%s%s%s\" name=\"%s\" time=\"%d.%03d\">\n",
198+
"<testcase classname=\"%s%s%s\" name=\"%s\" assertions=\"%d\" time=\"%d.%03d\" file=\"%s\" line=\"%d\">\n",
191199
impl_->package_.asCharString(),
192200
impl_->package_.isEmpty() == true ? "" : ".",
193201
impl_->results_.group_.asCharString(),
194-
cur->name_.asCharString(), (int) (cur->execTime_ / 1000), (int)(cur->execTime_ % 1000));
202+
cur->name_.asCharString(),
203+
cur->checkCount_ - impl_->results_.totalCheckCount_,
204+
(int) (cur->execTime_ / 1000), (int)(cur->execTime_ % 1000),
205+
cur->file_.asCharString(),
206+
cur->lineNumber_);
195207
writeToFile(buf.asCharString());
196208

209+
impl_->results_.totalCheckCount_ = cur->checkCount_;
210+
197211
if (cur->failure_) {
198212
writeFailure(cur);
199213
}

tests/JUnitOutputTest.cpp

Lines changed: 119 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -157,12 +157,13 @@ class JUnitTestOutputTestRunner
157157
UtestShell* currentTest_;
158158
bool firstTestInGroup_;
159159
int timeTheTestTakes_;
160+
unsigned int numberOfChecksInTest_;
160161
TestFailure* testFailure_;
161162

162163
public:
163164

164165
JUnitTestOutputTestRunner(TestResult result) :
165-
result_(result), currentGroupName_(0), currentTest_(0), firstTestInGroup_(true), timeTheTestTakes_(0), testFailure_(0)
166+
result_(result), currentGroupName_(0), currentTest_(0), firstTestInGroup_(true), timeTheTestTakes_(0), numberOfChecksInTest_(0), testFailure_(0)
166167
{
167168
millisTime = 0;
168169
theTime = "1978-10-03T00:00:00";
@@ -185,6 +186,14 @@ class JUnitTestOutputTestRunner
185186
return *this;
186187
}
187188

189+
JUnitTestOutputTestRunner& endGroupAndClearTest()
190+
{
191+
endOfPreviousTestGroup();
192+
delete currentTest_;
193+
currentTest_ = 0;
194+
return *this;
195+
}
196+
188197
void endOfPreviousTestGroup()
189198
{
190199
runPreviousTest();
@@ -223,6 +232,22 @@ class JUnitTestOutputTestRunner
223232
return *this;
224233
}
225234

235+
JUnitTestOutputTestRunner& inFile(const char* fileName)
236+
{
237+
if(currentTest_) {
238+
currentTest_->setFileName(fileName);
239+
}
240+
return *this;
241+
}
242+
243+
JUnitTestOutputTestRunner& onLine(int lineNumber)
244+
{
245+
if(currentTest_) {
246+
currentTest_->setLineNumber(lineNumber);
247+
}
248+
return *this;
249+
}
250+
226251
void runPreviousTest()
227252
{
228253
if (currentTest_ == 0) return;
@@ -234,6 +259,10 @@ class JUnitTestOutputTestRunner
234259
result_.currentTestStarted(currentTest_);
235260

236261
millisTime += timeTheTestTakes_;
262+
for(unsigned int i = 0; i < numberOfChecksInTest_; i++) {
263+
result_.countCheck();
264+
}
265+
numberOfChecksInTest_ = 0;
237266

238267
if (testFailure_) {
239268
result_.addFailure(*testFailure_);
@@ -244,6 +273,12 @@ class JUnitTestOutputTestRunner
244273
result_.currentTestEnded(currentTest_);
245274
}
246275

276+
JUnitTestOutputTestRunner& thatHasChecks(unsigned int numOfChecks)
277+
{
278+
numberOfChecksInTest_ = numOfChecks;
279+
return *this;
280+
}
281+
247282
JUnitTestOutputTestRunner& thatTakes(int timeElapsed)
248283
{
249284
timeTheTestTakes_ = timeElapsed;
@@ -333,7 +368,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestOutputsValidXMLFiles)
333368
STRCMP_EQUAL("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n", outputFile->line(1));
334369
}
335370

336-
TEST(JUnitOutputTest, withOneTestGroupAndOneTestoutputsTestSuiteStartAndEndBlocks)
371+
TEST(JUnitOutputTest, withOneTestGroupAndOneTestOutputsTestSuiteStartAndEndBlocks)
337372
{
338373
testCaseRunner->start()
339374
.withGroup("groupname").withTest("testname")
@@ -383,7 +418,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneTestFileShouldContainsATestCaseBlock
383418

384419
outputFile = fileSystem.file("cpputest_groupname.xml");
385420

386-
STRCMP_EQUAL("<testcase classname=\"groupname\" name=\"testname\" time=\"0.000\">\n", outputFile->line(5));
421+
STRCMP_EQUAL("<testcase classname=\"groupname\" name=\"testname\" assertions=\"0\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(5));
387422
STRCMP_EQUAL("</testcase>\n", outputFile->line(6));
388423
}
389424

@@ -396,9 +431,9 @@ TEST(JUnitOutputTest, withOneTestGroupAndTwoTestCasesCreateCorrectTestgroupBlock
396431
outputFile = fileSystem.file("cpputest_twoTestsGroup.xml");
397432

398433
STRCMP_EQUAL("<testsuite errors=\"0\" failures=\"0\" hostname=\"localhost\" name=\"twoTestsGroup\" tests=\"2\" time=\"0.000\" timestamp=\"1978-10-03T00:00:00\">\n", outputFile->line(2));
399-
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"firstTestName\" time=\"0.000\">\n", outputFile->line(5));
434+
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"firstTestName\" assertions=\"0\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(5));
400435
STRCMP_EQUAL("</testcase>\n", outputFile->line(6));
401-
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"secondTestName\" time=\"0.000\">\n", outputFile->line(7));
436+
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"secondTestName\" assertions=\"0\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(7));
402437
STRCMP_EQUAL("</testcase>\n", outputFile->line(8));
403438
}
404439

@@ -423,9 +458,9 @@ TEST(JUnitOutputTest, withOneTestGroupAndMultipleTestCasesWithElapsedTime)
423458

424459
outputFile = fileSystem.file("cpputest_twoTestsGroup.xml");
425460
STRCMP_EQUAL("<testsuite errors=\"0\" failures=\"0\" hostname=\"localhost\" name=\"twoTestsGroup\" tests=\"2\" time=\"0.060\" timestamp=\"1978-10-03T00:00:00\">\n", outputFile->line(2));
426-
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"firstTestName\" time=\"0.010\">\n", outputFile->line(5));
461+
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"firstTestName\" assertions=\"0\" time=\"0.010\" file=\"file\" line=\"1\">\n", outputFile->line(5));
427462
STRCMP_EQUAL("</testcase>\n", outputFile->line(6));
428-
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"secondTestName\" time=\"0.050\">\n", outputFile->line(7));
463+
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"secondTestName\" assertions=\"0\" time=\"0.050\" file=\"file\" line=\"1\">\n", outputFile->line(7));
429464
STRCMP_EQUAL("</testcase>\n", outputFile->line(8));
430465
}
431466

@@ -438,7 +473,7 @@ TEST(JUnitOutputTest, withOneTestGroupAndOneFailingTest)
438473

439474
outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml");
440475
STRCMP_EQUAL("<testsuite errors=\"0\" failures=\"1\" hostname=\"localhost\" name=\"testGroupWithFailingTest\" tests=\"1\" time=\"0.000\" timestamp=\"1978-10-03T00:00:00\">\n", outputFile->line(2));
441-
STRCMP_EQUAL("<testcase classname=\"testGroupWithFailingTest\" name=\"FailingTestName\" time=\"0.000\">\n", outputFile->line(5));
476+
STRCMP_EQUAL("<testcase classname=\"testGroupWithFailingTest\" name=\"FailingTestName\" assertions=\"0\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(5));
442477
STRCMP_EQUAL("<failure message=\"thisfile:10: Test failed\" type=\"AssertionFailedError\">\n", outputFile->line(6));
443478
STRCMP_EQUAL("</failure>\n", outputFile->line(7));
444479
STRCMP_EQUAL("</testcase>\n", outputFile->line(8));
@@ -455,7 +490,7 @@ TEST(JUnitOutputTest, withTwoTestGroupAndOneFailingTest)
455490
outputFile = fileSystem.file("cpputest_testGroupWithFailingTest.xml");
456491

457492
STRCMP_EQUAL("<testsuite errors=\"0\" failures=\"1\" hostname=\"localhost\" name=\"testGroupWithFailingTest\" tests=\"2\" time=\"0.000\" timestamp=\"1978-10-03T00:00:00\">\n", outputFile->line(2));
458-
STRCMP_EQUAL("<testcase classname=\"testGroupWithFailingTest\" name=\"FailingTestName\" time=\"0.000\">\n", outputFile->line(7));
493+
STRCMP_EQUAL("<testcase classname=\"testGroupWithFailingTest\" name=\"FailingTestName\" assertions=\"0\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(7));
459494
STRCMP_EQUAL("<failure message=\"thisfile:10: Test failed\" type=\"AssertionFailedError\">\n", outputFile->line(8));
460495
}
461496

@@ -582,7 +617,7 @@ TEST(JUnitOutputTest, TestCaseBlockWithAPackageName)
582617

583618
outputFile = fileSystem.file("cpputest_groupname.xml");
584619

585-
STRCMP_EQUAL("<testcase classname=\"packagename.groupname\" name=\"testname\" time=\"0.000\">\n", outputFile->line(5));
620+
STRCMP_EQUAL("<testcase classname=\"packagename.groupname\" name=\"testname\" assertions=\"0\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(5));
586621
STRCMP_EQUAL("</testcase>\n", outputFile->line(6));
587622
}
588623

@@ -595,7 +630,80 @@ TEST(JUnitOutputTest, TestCaseBlockForIgnoredTest)
595630

596631
outputFile = fileSystem.file("cpputest_groupname.xml");
597632

598-
STRCMP_EQUAL("<testcase classname=\"packagename.groupname\" name=\"testname\" time=\"0.000\">\n", outputFile->line(5));
633+
STRCMP_EQUAL("<testcase classname=\"packagename.groupname\" name=\"testname\" assertions=\"0\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(5));
599634
STRCMP_EQUAL("<skipped />\n", outputFile->line(6));
600635
STRCMP_EQUAL("</testcase>\n", outputFile->line(7));
601636
}
637+
638+
TEST(JUnitOutputTest, TestCaseWithTestLocation)
639+
{
640+
junitOutput->setPackageName("packagename");
641+
testCaseRunner->start()
642+
.withGroup("groupname")
643+
.withTest("testname").inFile("MySource.c").onLine(159)
644+
.end();
645+
646+
outputFile = fileSystem.file("cpputest_groupname.xml");
647+
648+
STRCMP_EQUAL("<testcase classname=\"packagename.groupname\" name=\"testname\" assertions=\"0\" time=\"0.000\" file=\"MySource.c\" line=\"159\">\n", outputFile->line(5));
649+
}
650+
651+
TEST(JUnitOutputTest, MultipleTestCaseWithTestLocations)
652+
{
653+
testCaseRunner->start()
654+
.withGroup("twoTestsGroup")
655+
.withTest("firstTestName").inFile("MyFirstSource.c").onLine(846)
656+
.withTest("secondTestName").inFile("MySecondSource.c").onLine(513)
657+
.end();
658+
659+
outputFile = fileSystem.file("cpputest_twoTestsGroup.xml");
660+
661+
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"firstTestName\" assertions=\"0\" time=\"0.000\" file=\"MyFirstSource.c\" line=\"846\">\n", outputFile->line(5));
662+
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"secondTestName\" assertions=\"0\" time=\"0.000\" file=\"MySecondSource.c\" line=\"513\">\n", outputFile->line(7));
663+
}
664+
665+
TEST(JUnitOutputTest, TestCaseBlockWithAssertions)
666+
{
667+
junitOutput->setPackageName("packagename");
668+
testCaseRunner->start()
669+
.withGroup("groupname")
670+
.withTest("testname")
671+
.thatHasChecks(24)
672+
.end();
673+
674+
outputFile = fileSystem.file("cpputest_groupname.xml");
675+
676+
STRCMP_EQUAL("<testcase classname=\"packagename.groupname\" name=\"testname\" assertions=\"24\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(5));
677+
}
678+
679+
TEST(JUnitOutputTest, MultipleTestCaseBlocksWithAssertions)
680+
{
681+
testCaseRunner->start()
682+
.withGroup("twoTestsGroup")
683+
.withTest("firstTestName").thatHasChecks(456)
684+
.withTest("secondTestName").thatHasChecks(567)
685+
.end();
686+
687+
outputFile = fileSystem.file("cpputest_twoTestsGroup.xml");
688+
689+
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"firstTestName\" assertions=\"456\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(5));
690+
STRCMP_EQUAL("<testcase classname=\"twoTestsGroup\" name=\"secondTestName\" assertions=\"567\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(7));
691+
}
692+
693+
TEST(JUnitOutputTest, MultipleTestCasesInDifferentGroupsWithAssertions)
694+
{
695+
testCaseRunner->start()
696+
.withGroup("groupOne")
697+
.withTest("testA").thatHasChecks(456)
698+
.endGroupAndClearTest()
699+
.withGroup("groupTwo")
700+
.withTest("testB").thatHasChecks(678)
701+
.end();
702+
703+
outputFile = fileSystem.file("cpputest_groupOne.xml");
704+
STRCMP_EQUAL("<testcase classname=\"groupOne\" name=\"testA\" assertions=\"456\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(5));
705+
706+
outputFile = fileSystem.file("cpputest_groupTwo.xml");
707+
STRCMP_EQUAL("<testcase classname=\"groupTwo\" name=\"testB\" assertions=\"678\" time=\"0.000\" file=\"file\" line=\"1\">\n", outputFile->line(5));
708+
}
709+

0 commit comments

Comments
 (0)