簡體   English   中英

數據驅動的 DUnit 測試

[英]Data-driven DUnit testing

DUnit 通常的工作方式是編寫一些已發布的方法,然后 DUnit 將它們作為測試運行。 我想做的有點不同。 我想在運行時根據數據創建測試。 我正在嘗試測試處理輸入文件以創建 output 文件的特定模塊。 我有一組測試輸入文件,其中包含相應的已知良好 output 文件。 這個想法是動態創建測試,每個輸入文件一個,處理輸入並根據已知的好文件檢查輸出。

然而,這里的實際數據來源並不重要。 困難在於使 DUnit 以數據驅動的方式運行。 為了這個問題,假設數據源只是一個隨機數生成器。 這是一個觸及困難核心的具體問題示例:

在運行時創建一些測試對象(TTestCase 或其他),比如 10 個,其中每個

  1. 在運行時從隨機生成的 integer 中命名。 (“名稱”是指出現在測試運行器樹中的測試名稱。)
  2. 根據隨機 integer 通過或失敗。 偶數通過,奇數失敗。

從 DUnit 的設計來看,它的設計似乎考慮到了足夠的靈活性以使這些事情成為可能。 我不確定是不是這樣。 我嘗試通過從 TAbstractTest 和 ITest 繼承來創建自己的測試 class,但無法訪問一些關鍵方法。 我也嘗試從 TTestCase 繼承,但是 class 與運行已發布方法的想法密切相關(並且測試以方法命名,所以我不能只使用一個稱為“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.

我想說你基本上想要一個“超級測試” function 然后調用其他測試,每個數據文件一個。 這就是我們對 DUnit 測試之一所做的事情。 您只需循環加載每個可用文件,並根據需要使用 Check 運行測試。

另一種方法,我們也在同一個項目中用於測試最終應用程序及其數據加載和分析,是使用類似 FinalBuilder 的東西來循環應用程序(假設你也可以循環 DUnit 應用程序並使用參數)各種不同的數據文件。 然后應用程序運行,進行分析,然后在保存后退出。 然后另一個應用程序將結果數據與理想數據進行比較,並在適當時報告失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM