数据驱动的DUnit测试

dan*_*gph 11 delphi dunit dynamic data-driven-tests

DUnit通常的工作方式是编写一些已发布的方法,而DUnit将它们作为测试运行.我想做的是有点不同.我想在运行时根据数据创建测试.我正在尝试测试处理输入文件的特定模块以创建输出文件.我有一组测试输入文件,其中包含相应的已知良好输出文件.我们的想法是为每个输入文件动态创建一个测试,处理输入并根据已知的好输出检查输出.

然而,这里的实际数据来源并不重要.困难在于使DUnit以数据驱动的方式运行.为了解决这个问题,假设数据源只是一个随机数生成器.这是一个解决困难核心的示例具体问题:

在运行时创建一些测试对象(TTestCase或其他),比如10个,每个测试对象

  1. 在运行时从随机生成的整数中命名.('name'我的意思是测试运行树中出现的测试名称.)
  2. 基于随机整数传递或失败.通过甚至,奇怪的失败.

从DUnit的设计来看,它的设计看起来具有足够的灵活性,使这些事情成为可能.我不确定它是不是.我试图通过继承TAbstractTest和ITest来创建我自己的测试类,但是一些关键的方法无法访问.我也尝试从TTestCase继承,但是这个类与运行已发布方法的想法密切相关(并且测试以方法命名,所以我不能只调用一个,比如'go',因为那时候我所有的测试都会被称为'go',我希望我的所有测试都被单独命名).

或者,是否有一些替代DUnit可以做我想要的?

Ond*_*lle 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.
Run Code Online (Sandbox Code Playgroud)