代码之家  ›  专栏  ›  技术社区  ›  dan-gph

数据驱动的DUnit测试

  •  11
  • dan-gph  · 技术社区  · 16 年前

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

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

    1. 在运行时从随机生成的整数命名。(我所说的“名称”是指出现在测试运行程序树中的测试名称。)
    2. 根据随机整数通过或失败。通过表示偶数,失败表示奇数。

    就像它的设计考虑到了足够的灵活性,使这些事情成为可能。但我不确定是不是这样。我试图通过继承TAbstractTest和ITest来创建自己的测试类,但一些关键方法无法访问。我还尝试从TTestCase继承,但该类与运行已发布方法的想法密切相关(测试是以方法命名的,所以我不能只让一个测试名为“go”,比如“go”,因为这样我的所有测试都将被称为“go”,我希望我的所有测试都被单独命名)。

    或者,除了DUnit,还有其他什么可以做我想做的事情吗?

    2 回复  |  直到 16 年前
        1
  •  18
  •   Ondrej Kelle    16 年前
    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.
    
        2
  •  2
  •   mj2008    16 年前

    我想说,您基本上希望有一个“超级测试”函数,然后调用其他测试,每个数据文件一个。这就是我们在DUnit测试中所做的。您只需在循环中依次加载每个可用文件,并根据需要使用Check运行测试。

    我们在同一个项目中也使用另一种方法来测试最终的应用程序及其数据加载和分析,即使用类似FinalBuilder的东西在应用程序上循环(假设您也可以在DUnit应用程序上循环并使用参数),使用各种不同的数据文件。然后应用程序运行,进行分析,保存后退出。然后,另一个应用程序将结果数据与理想数据进行比较,并在适当的情况下报告故障。

    推荐文章