[英]Data-driven DUnit testing
DUnit 通常的工作方式是編寫一些已發布的方法,然后 DUnit 將它們作為測試運行。 我想做的有點不同。 我想在運行時根據數據創建測試。 我正在嘗試測試處理輸入文件以創建 output 文件的特定模塊。 我有一組測試輸入文件,其中包含相應的已知良好 output 文件。 這個想法是動態創建測試,每個輸入文件一個,處理輸入並根據已知的好文件檢查輸出。
然而,這里的實際數據來源並不重要。 困難在於使 DUnit 以數據驅動的方式運行。 為了這個問題,假設數據源只是一個隨機數生成器。 這是一個觸及困難核心的具體問題示例:
在運行時創建一些測試對象(TTestCase 或其他),比如 10 個,其中每個
從 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.