データ駆動型の DUnit テスト
-
22-08-2019 - |
質問
DUnit の通常の動作方法は、公開されたメソッドをいくつか作成し、DUnit がそれらをテストとして実行することです。やりたいことは少し違います。データに基づいて実行時にテストを作成したいと考えています。入力ファイルを処理して出力ファイルを作成する特定のモジュールをテストしようとしています。一連のテスト入力ファイルと、対応する既知の良好な出力ファイルがあります。このアイデアは、入力ファイルごとに 1 つずつ、入力を処理し、既知の良好な出力と比較して出力をチェックするテストを動的に作成することです。
ただし、ここでの実際のデータソースは重要ではありません。難しいのは、DUnit をデータ駆動型で動作させることです。この問題を解決するために、データ ソースが単なる乱数ジェネレーターであると仮定します。以下に、問題の核心を突いた具体的な問題の例を示します。
実行時にいくつかのテスト オブジェクト (TTestCase など) を作成します (たとえば 10 個)。
- 実行時にランダムに生成された整数から名前が付けられます。(「名前」とは、テスト ランナー ツリーに表示されるテストの名前を意味します。)
- ランダムな整数に基づいて成功または失敗します。偶数の場合は合格、奇数の場合は不合格です。
DUnitの設計から、 見た目 まるで、そのようなことを可能にする十分な柔軟性を念頭に置いて設計されているかのようです。そうかどうかは分かりませんが。TAbstractTest と ITest を継承して独自のテスト クラスを作成しようとしましたが、いくつかの重要なメソッドにアクセスできませんでした。TTestCase から継承することも試みましたが、そのクラスは公開されたメソッドを実行するという考えと密接に結びついています (そして、テストにはメソッドの名前が付けられているため、単一のテストをたとえば「go」と呼ぶことはできません。すべてのテストは「go」という名前になり、すべてのテストに個別に名前を付けたいと考えています)。
それとも、私が望むことを実行できるDUnitの代替手段はありますか?
解決
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.
他のヒント
私はあなたが基本的には、他のテスト、各データファイルのための1つを呼び出す1つの「スーパーテスト」機能を持つようにしたいと思います。これは、我々のDUnitテストのいずれかで何をすべきかです。あなただけのループで順番に各可能なファイルをロードし、チェックインのような適切なでテストを実行します。
私たちは、最終的なアプリとそのデータの読み込みと解析をテストするために、同じプロジェクトで使用代替は、あまりにもDUnitのアプリ上のアプリケーション(おそらくあなたができたループにループするFinalBuilderのようなものを使用し、使用することです様々な異なるデータ・ファイルとパラメータ)。アプリは、その後に実行、分析を行い、その後、保存した後に終了します。別のアプリは、理想的なデータと結果のデータを比較し、適切な場合には失敗を報告します。