11

DUnit が通常動作する方法は、いくつかの公開されたメソッドを記述し、DUnit がそれらをテストとして実行することです。やりたいことはちょっと違う。データに基づいて実行時にテストを作成したい。入力ファイルを処理して出力ファイルを作成する特定のモジュールをテストしようとしています。テスト入力ファイルのセットと、対応する既知の良好な出力ファイルがあります。アイデアは、入力を処理し、既知の適切なものに対して出力をチェックする、入力ファイルごとに 1 つのテストを動的に作成することです。

ただし、ここでの実際のデータ ソースは重要ではありません。難しいのは、DUnit をデータ駆動型の方法で動作させることです。この問題のために、データ ソースが単なる乱数ジェネレーターであると仮定します。以下に、問題の核心に迫る具体的な問題の例を示します。

実行時にいくつかのテスト オブジェクト (TTestCase など) を作成します。たとえば、10 個のテスト オブジェクトを作成します。

  1. ランダムに生成された整数から実行時に名前が付けられます。(「名前」とは、テストランナー ツリーに表示されるテストの名前を意味します。)
  2. ランダムな整数に基づいて成功または失敗します。偶数なら合格、奇数なら不合格。

DUnit の設計からは、このようなことが可能になるように十分な柔軟性を考慮して設計されているように見えます。私はそれがそうであるかどうかはわかりません。TAbstractTest と ITest から継承して独自のテスト クラスを作成しようとしましたが、いくつかの重要なメソッドにアクセスできませんでした。私も TTestCase から継承しようとしましたが、そのクラスは公開されたメソッドを実行するという考えと密接に結びついています (そして、テストはメソッドにちなんで名付けられているので、たとえば「go」と呼ばれるものを 1 つだけ持つことはできませんでした。すべてのテストは「go」と呼ばれ、すべてのテストに個別に名前を付けたい)。

または、代わりに、私がやりたいことができる DUnit に代わるものはありますか?

4

2 に答える 2

18
program UnitTest1;

{$IFDEF CONSOLE_TESTRUNNER}
{$APPTYPE CONSOLE}
{$ENDIF}

uses
  Forms, Classes, SysUtils,
  TestFramework,
  GUITestRunner,
  TextTestRunner;

{$R *.RES}

type
  TIntTestCase = class(TTestCase)
  private
    FValue: Integer;
  public
    constructor Create(AValue: Integer); reintroduce;
    function GetName: string; override;
  published
    procedure Run;
  end;

{ TIntTestCase }

constructor TIntTestCase.Create(AValue: Integer);
begin
  inherited Create('Run');
  FValue := AValue;
end;

function TIntTestCase.GetName: string;
begin
  Result := Format('Run_%.3d', [FValue]);
end;

procedure TIntTestCase.Run;
begin
  Check(FValue mod 2 = 0, Format('%d is not an even value', [FValue]));
end;

procedure RegisterTests;
const
  TestCount = 10;
  ValueHigh = 1000;
var
  I: Integer;
begin
  Randomize;
  for I := 0 to TestCount - 1 do
    RegisterTest(TIntTestCase.Create(Random(ValueHigh) + 1));
end;

begin
  Application.Initialize;
  RegisterTests;
  if IsConsole then
    TextTestRunner.RunRegisteredTests
  else
    GUITestRunner.RunRegisteredTests;
end.
于 2009-04-01T11:58:03.463 に答える
2

基本的には、データ ファイルごとに 1 つずつ、他のテストを呼び出す単一の「スーパー テスト」関数が必要だと思います。これは、DUnit テストの 1 つで行うことです。使用可能な各ファイルをループで順番にロードし、必要に応じてチェックを使用してテストを実行するだけです。

最終的なアプリとそのデータの読み込みと分析をテストするために同じプロジェクトでも使用する別の方法は、FinalBuilder のようなものを使用してアプリケーションをループすることです (おそらく、DUnit アプリでもループしてパラメーターを使用できます)。さまざまな異なるデータ ファイル。その後、アプリが実行され、分析が行われ、保存後に終了します。次に、別のアプリが結果のデータを理想的なデータと比較し、適切な場合は失敗を報告します。

于 2009-04-01T11:47:53.253 に答える