XMLTestRunner.pas
上传用户:yjb1804
上传日期:2021-01-30
资源大小:3105k
文件大小:8k
源码类别:

Email服务器

开发平台:

Delphi

  1. (*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  *
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  *
  12.  * The Original Code is DUnit.
  13.  *
  14.  * The Initial Developers of the Original Code are Kent Beck, Erich Gamma,
  15.  * and Juancarlo A馿z.
  16.  * Portions created The Initial Developers are Copyright (C) 1999-2000.
  17.  * Portions created by The DUnit Group are Copyright (C) 2000-2003.
  18.  * All rights reserved.
  19.  *
  20.  * Contributor(s):
  21.  * Kent Beck <kentbeck@csi.com>
  22.  * Erich Gamma <Erich_Gamma@oti.com>
  23.  * Juanco A馿z <juanco@users.sourceforge.net>
  24.  * Chris Morris <chrismo@users.sourceforge.net>
  25.  * Jeff Moore <JeffMoore@users.sourceforge.net>
  26.  * Kris Golko <neuromancer@users.sourceforge.net>
  27.  * The DUnit group at SourceForge <http://dunit.sourceforge.net>
  28.  *
  29.  *)
  30. {
  31.  Contributor : Laurent Laffont <llaffont@altaiire.fr> 
  32. }
  33. unit XMLTestRunner;
  34. interface
  35. uses
  36.   SysUtils,
  37.   Classes,
  38.   TestFramework;
  39. const
  40.    DEFAULT_FILENAME = 'dunit-report.xml';
  41. type
  42.   TXMLTestListener = class(TInterfacedObject, ITestListener, ITestListenerX)
  43.   private
  44.      FOutputFile : TextFile;
  45.      FFileName : String;
  46.      
  47.   protected
  48.      startTime : TDateTime;
  49.      
  50.      procedure writeReport(str: String);
  51.   public
  52.     // implement the ITestListener interface
  53.     procedure AddSuccess(test: ITest); virtual;
  54.     procedure AddError(error: TTestFailure); virtual;
  55.     procedure AddFailure(failure: TTestFailure); virtual;
  56.     function  ShouldRunTest(test :ITest):boolean; virtual;
  57.     procedure StartSuite(suite: ITest); virtual;
  58.     procedure EndSuite(suite: ITest); virtual;
  59.     procedure StartTest(test: ITest); virtual;
  60.     procedure EndTest(test: ITest); virtual;
  61.     procedure TestingStarts; virtual;
  62.     procedure TestingEnds(testResult: TTestResult); virtual;
  63.     procedure Status(test :ITest; const Msg :string);
  64.     procedure Warning(test :ITest; const Msg :string);
  65.     constructor Create; overload;
  66.     constructor Create(outputFile : String); overload;
  67.     
  68.     class function RunTest(suite: ITest; outputFile:String): TTestResult; overload;
  69.     class function RunRegisteredTests(outputFile:String): TTestResult;
  70.     class function text2sgml(text : String) : String;
  71.     class function StringReplaceAll (text,byt,mot : string ) :string;
  72.     
  73.     //:Report filename. If an empty string, then standard output is used (compile with -CC option)
  74.     property FileName : String read FFileName write FFileName;
  75.   end;
  76. {: Run the given test suite
  77. }
  78. function RunTest(suite: ITest; outputFile:String=DEFAULT_FILENAME) : TTestResult; overload;
  79. function RunRegisteredTests(outputFile:String=DEFAULT_FILENAME) : TTestResult; overload;
  80. implementation
  81. const
  82.    CRLF = #13#10;
  83.    MAX_DEEP = 5;
  84. { TXMLTestListener }
  85.    
  86. constructor TXMLTestListener.Create;
  87. begin
  88.    inherited Create;
  89.    FileName := DEFAULT_FILENAME;
  90. end;
  91. constructor TXMLTestListener.Create(outputFile : String);
  92. begin
  93.    inherited Create;
  94.    FileName := outputFile;
  95. end;
  96. {:
  97.  Write F in the report file or on standard output if none specified
  98. }
  99. procedure TXMLTestListener.writeReport(str : String);
  100. begin
  101.    if TTextRec(FOutputFile).Mode = fmOutput then
  102.       writeln(FOutputFile, str)
  103.    else
  104.       writeln(str);
  105. end;
  106. procedure TXMLTestListener.AddSuccess(test: ITest);
  107. begin
  108.    if test.tests.Count<=0 then
  109.    begin
  110.       writeReport('<Test name="'+test.GetName+'" result="PASS">'+CRLF+
  111.                   '</Test>');
  112.    end;
  113.    
  114. end;
  115. procedure TXMLTestListener.AddError(error: TTestFailure);
  116. begin
  117.    writeReport('<Test name="'+error.FailedTest.GetName+'" result="ERROR">'+CRLF+
  118.                   '<FailureType>'+error.ThrownExceptionName+'</FailureType>'+CRLF+
  119.                   '<Location>'+error.LocationInfo+'</Location>'+CRLF+
  120.                   '<Message>'+text2sgml(error.ThrownExceptionMessage)+'</Message>'+CRLF+
  121.                   '</Test>');
  122. end;
  123. procedure TXMLTestListener.AddFailure(failure: TTestFailure);
  124. begin
  125.    writeReport('<Test name="'+failure.FailedTest.GetName+'" result="FAILS">'+CRLF+
  126.                   '<FailureType>'+failure.ThrownExceptionName+'</FailureType>'+CRLF+
  127.                   '<Location>'+failure.LocationInfo+'</Location>'+CRLF+
  128.                   '<Message>'+text2sgml(failure.ThrownExceptionMessage)+'</Message>'+CRLF+
  129.                   '</Test>');
  130. end;
  131. procedure TXMLTestListener.StartTest(test: ITest);
  132. begin
  133. end;
  134. procedure TXMLTestListener.EndTest(test: ITest);
  135. begin
  136. end;
  137. procedure TXMLTestListener.TestingStarts;
  138. begin
  139.    startTime := now;
  140.    
  141.    if FFileName<>'' then
  142.    begin
  143.      AssignFile(FOutputFile, FFileName);
  144.      Rewrite(FOutputFile);
  145.    end;
  146.    
  147.    writeReport('<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>'+CRLF+
  148.                   '<TestRun>');
  149. end;
  150. procedure TXMLTestListener.TestingEnds(testResult: TTestResult);
  151. var
  152.    runTime : TDateTime;
  153.    successRate : Integer;
  154. begin
  155.    runTime := now-startTime;
  156.    successRate :=  Trunc(
  157.       ((testResult.runCount - testResult.failureCount - testResult.errorCount)
  158.        /testResult.runCount)
  159.       *100);
  160.    
  161.    writeReport('<Statistics>'+CRLF+
  162.                   '<Stat name="Tests" result="'+intToStr(testResult.runCount)+'" />'+CRLF+
  163.                   '<Stat name="Failures" result="'+intToStr(testResult.failureCount)+'" />'+CRLF+
  164.                   '<Stat name="Errors" result="'+intToStr(testResult.errorCount)+'" />'+CRLF+
  165.                   '<Stat name="Success Rate" result="'+intToStr(successRate)+'%" />'+CRLF+
  166.                   '<Stat name="Finished At" result="'+DateTimeToStr(now)+'" />'+CRLF+
  167.                   '<Stat name="Runtime" result="'+timeToStr(runTime)+'" />'+CRLF+
  168.                   '</Statistics>'+CRLF+
  169.               '</TestRun>');
  170.    
  171.    if TTextRec(FOutputFile).Mode = fmOutput then
  172.       Close(FOutputFile);
  173. end;
  174. class function TXMLTestListener.RunTest(suite: ITest; outputFile:String): TTestResult;
  175. begin
  176.    Result := TestFramework.RunTest(suite, [TXMLTestListener.Create(outputFile)]);
  177. end;
  178. class function TXMLTestListener.RunRegisteredTests(outputFile:String): TTestResult;
  179. begin
  180.   Result := RunTest(registeredTests, outputFile);
  181. end;
  182. function RunTest(suite: ITest; outputFile:String=DEFAULT_FILENAME): TTestResult;
  183. begin
  184.    Result := TestFramework.RunTest(suite, [TXMLTestListener.Create(outputFile)]);
  185. end;
  186. function RunRegisteredTests(outputFile:String=DEFAULT_FILENAME): TTestResult;
  187. begin
  188.    Result := RunTest(registeredTests, outputFile);
  189. end;
  190. procedure TXMLTestListener.Status(test: ITest; const Msg: string);
  191. begin
  192.   writeReport(Format('INFO: %s: %s', [test.Name, Msg]));
  193. end;
  194. procedure TXMLTestListener.Warning(test :ITest; const Msg :string);
  195. begin
  196.   writeReport(Format('WARNING: %s: %s', [test.Name, Msg]));
  197. end;
  198. function TXMLTestListener.ShouldRunTest(test: ITest): boolean;
  199. begin
  200.   Result := test.Enabled;
  201. end;
  202. procedure TXMLTestListener.EndSuite(suite: ITest);
  203. begin
  204.      writeReport('</TestSuite>');
  205. end;
  206. procedure TXMLTestListener.StartSuite(suite: ITest);
  207. begin
  208.    writeReport('<TestSuite name="'+suite.getName+'">');
  209. end;
  210. {:
  211.  Replace byt string by mot in text string
  212.  }
  213. class function TXMLTestListener.StringReplaceAll (text,byt,mot : string ) :string;
  214. var
  215.    plats : integer;
  216. begin
  217. While pos(byt,text) > 0 do
  218.       begin
  219.       plats := pos(byt,text);
  220.       delete (text,plats,length(byt));
  221.       insert (mot,text,plats);
  222.       end;
  223. result := text;
  224. end;
  225. {:
  226.  Replace special character by sgml compliant characters
  227.  }
  228. class function TXMLTestListener.text2sgml(text : String) : String;
  229. begin
  230.   text := stringreplaceall (text,'<','&lt;');
  231.   text := stringreplaceall (text,'>','&gt;');
  232.   result := text;
  233. end;
  234. end.