testreport.pp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. {$mode objfpc}
  2. {$h+}
  3. {
  4. This file is part of the Free Component Library (FCL)
  5. Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
  6. an example of a console test runner of FPCUnit tests.
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. unit testreport;
  14. interface
  15. uses
  16. classes, SysUtils, fpcunit, testutils;
  17. type
  18. TXMLResultsWriter = class(TNoRefCountObject, ITestListener)
  19. public
  20. procedure WriteHeader;
  21. procedure WriteResult(aResult: TTestResult);
  22. {ITestListener}
  23. procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
  24. procedure AddError(ATest: TTest; AError: TTestFailure);
  25. procedure StartTest(ATest: TTest);
  26. procedure EndTest(ATest: TTest);
  27. end;
  28. {
  29. TLatexResultsWriter = class(TNoRefCountObject, ITestListener)
  30. public
  31. procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
  32. procedure AddError(ATest: TTest; AError: TTestFailure);
  33. procedure StartTest(ATest: TTest);
  34. procedure EndTest(ATest: TTest);
  35. end;}
  36. function TestSuiteAsXML(aSuite: TTestSuite): string;
  37. function TestSuiteAsLatex(aSuite:TTestSuite): string;
  38. function GetSuiteAsXML(aSuite: TTestSuite): string;
  39. function GetSuiteAsLatex(aSuite: TTestSuite): string;
  40. function TestResultAsXML(aTestResult: TTestResult): string;
  41. implementation
  42. procedure TXMLResultsWriter.WriteHeader;
  43. begin
  44. writeln('<testresults>');
  45. writeln('<testlisting>');
  46. end;
  47. procedure TXMLResultsWriter.WriteResult(aResult: TTestResult);
  48. begin
  49. writeln('</testlisting>');
  50. writeln(TestResultAsXML(aResult));
  51. writeln('</testresults>');
  52. end;
  53. {TXMLResultsWriter}
  54. procedure TXMLResultsWriter.AddFailure(ATest: TTest; AFailure: TTestFailure);
  55. begin
  56. writeln('<failure ExceptionClassName="', AFailure.ExceptionClassName, '">');
  57. writeln('<message>', AFailure.ExceptionMessage, '</message>');
  58. writeln('</failure>');
  59. end;
  60. procedure TXMLResultsWriter.AddError(ATest: TTest; AError: TTestFailure);
  61. begin
  62. writeln('<error ExceptionClassName="', AError.ExceptionClassName, '">');
  63. writeln('<message>', AError.ExceptionMessage, '</message>');
  64. writeln('<sourceunit>', AError.SourceUnitName, '</sourceunit>');
  65. writeln('<methodname>', AError.FailedMethodName, '</methodname>');
  66. writeln('<linenumber>', AError.LineNumber, '</linenumber>');
  67. writeln('</error>');
  68. end;
  69. procedure TXMLResultsWriter.StartTest(ATest: TTest);
  70. begin
  71. writeln('<test name="' , ATest.TestSuiteName + '.' + ATest.TestName, '">');
  72. end;
  73. procedure TXMLResultsWriter.EndTest(ATest: TTest);
  74. begin
  75. writeln('</test>');
  76. end;
  77. function TestSuiteAsXML(aSuite:TTestSuite): string;
  78. var
  79. i: integer;
  80. begin
  81. Result := '<TestSuite name="' + ASuite.TestName + '">' + System.sLineBreak;
  82. for i := 0 to aSuite.Tests.Count - 1 do
  83. if TTest(aSuite.Tests.Items[i]) is TTestSuite then
  84. Result := Result + TestSuiteAsXML(TTestSuite(aSuite.Tests.Items[i]))
  85. else
  86. if TTest(aSuite.Tests.Items[i]) is TTestCase then
  87. Result := Result +'<test>' + TTestcase(aSuite.Tests.Items[i]).TestName + '</test>' + System.sLineBreak;
  88. Result := Result + '</TestSuite>' + System.sLineBreak;
  89. end;
  90. function TestSuiteAsLatex(aSuite:TTestSuite): string;
  91. var
  92. i,j: integer;
  93. s: TTestSuite;
  94. begin
  95. Result := '\flushleft' + System.sLineBreak;
  96. for i := 0 to aSuite.Tests.Count - 1 do
  97. begin
  98. s := TTestSuite(ASuite.Tests.Items[i]);
  99. Result := Result + s.TestSuiteName + System.sLineBreak;
  100. Result := Result + '\begin{itemize}'+ System.sLineBreak;
  101. for j := 0 to s.Tests.Count - 1 do
  102. if TTest(s.Tests.Items[j]) is TTestCase then
  103. Result := Result + '\item[-] ' + TTestcase(s.Tests.Items[j]).TestName + System.sLineBreak;
  104. Result := Result +'\end{itemize}' + System.sLineBreak;
  105. end;
  106. end;
  107. function GetSuiteAsXML(aSuite: TTestSuite): string;
  108. begin
  109. if aSuite <> nil then
  110. begin
  111. if aSuite.TestName = '' then
  112. aSuite.TestName := 'Test Suite';
  113. Result := TestSuiteAsXML(aSuite)
  114. end
  115. else
  116. Result := '';
  117. end;
  118. function GetSuiteAsLatex(aSuite: TTestSuite): string;
  119. begin
  120. if aSuite <> nil then
  121. begin
  122. Result := '\documentclass[a4paper,12pt]{article}' + System.sLineBreak;
  123. Result := Result + '\usepackage{array}' + System.sLineBreak;
  124. Result := Result + '\usepackage{mdwlist}' + System.sLineBreak + System.sLineBreak;
  125. Result := Result + '\begin{document}' + System.sLineBreak + System.sLineBreak;
  126. if aSuite.TestName = '' then
  127. aSuite.TestName := 'Test Suite';
  128. Result := Result + TestSuiteAsLatex(aSuite);
  129. Result := Result + '\end{document}';
  130. end
  131. else
  132. Result := '';
  133. end;
  134. function TestResultAsXML(aTestResult: TTestResult): string;
  135. var
  136. i: longint;
  137. f: TTestFailure;
  138. begin
  139. with aTestResult do
  140. begin
  141. Result := '<NumberOfRunnedTests>' + intToStr(RunTests) + '</NumberOfRunnedTests>' + System.sLineBreak;
  142. Result := Result + '<NumberOfErrors>' + intToStr(NumberOfErrors) + '</NumberOfErrors>' + System.sLineBreak;
  143. Result := Result + '<NumberOfFailures>' + intToStr(NumberOfFailures) + '</NumberOfFailures>';
  144. if NumberOfErrors <> 0 then
  145. begin
  146. Result := Result + System.sLineBreak;
  147. Result := Result + '<ListOfErrors>';
  148. for i := 0 to Errors.Count - 1 do
  149. begin
  150. Result := Result + System.sLineBreak;
  151. Result := Result + '<Error>' + System.sLineBreak;
  152. f := TTestFailure(Errors.Items[i]);
  153. Result := Result + ' <Message>' + f.AsString + '</Message>' + System.sLineBreak;
  154. Result := Result + ' <ExceptionClass>' + f.ExceptionClassName + '</ExceptionClass>' + System.sLineBreak;
  155. Result := Result + ' <ExceptionMessage>' + f.ExceptionMessage + '</ExceptionMessage>' + System.sLineBreak;
  156. Result := Result + ' <SourceUnitName>' + f.SourceUnitName + '</SourceUnitName>' + System.sLineBreak;
  157. Result := Result + ' <LineNumber>' + IntToStr(f.LineNumber) + '</LineNumber>' + System.sLineBreak;
  158. Result := Result + ' <FailedMethodName>' + f.FailedMethodName + '</FailedMethodName>' + System.sLineBreak;
  159. Result := Result + '</Error>' + System.sLineBreak;
  160. end;
  161. Result := Result + '</ListOfErrors>';
  162. end;
  163. if NumberOfFailures <> 0 then
  164. begin
  165. Result := Result + System.sLineBreak;
  166. Result := Result + '<ListOfFailures>' + System.sLineBreak;
  167. for i := 0 to Failures.Count - 1 do
  168. begin
  169. Result := Result + '<Failure>' + System.sLineBreak;
  170. f := TTestFailure(Failures.Items[i]);
  171. Result := Result + ' <Message>' + f.AsString + '</Message>' + System.sLineBreak;
  172. Result := Result + ' <ExceptionClass>' + f.ExceptionClassName + '</ExceptionClass>' + System.sLineBreak;
  173. Result := Result + ' <ExceptionMessage>' + f.ExceptionMessage + '</ExceptionMessage>' + System.sLineBreak;
  174. Result := Result + '</Failure>' + System.sLineBreak;
  175. end;
  176. Result := Result + '</ListOfFailures>';
  177. end;
  178. end;
  179. end;
  180. end.