DUnit通常的工作方式是编写一些已发布的方法,DUnit将它们作为测试运行。我想做的是有点不同。我想要基于数据在运行时创建测试。我正在尝试测试一个处理输入文件以创建输出文件的特定模块。我有一套测试输入文件与相应的已知的良好输出文件。其思想是动态创建测试,为每个输入文件创建一个测试,以处理输入,并根据已知的良好输出检查输出。
然而,这里的实际数据来源并不重要。困难在于让DUnit以一种数据驱动的方式运行。为了解决这个问题,假设数据源只是一个随机数生成器。下面是一个具体的问题,它触及了困难的核心:
在运行时创建一些测试对象(TTestCase或其他什么),比如其中的10个,每个对象都在其中
从DUnit的设计来看,它的设计考虑到了足够的灵活性,使得这样的事情成为可能。不过,我不确定是真的。我试图通过继承TAbstractTest和ITest来创建自己的测试类,但是一些关键的方法无法访问。我也尝试过继承TTestCase,但是这个类与运行已发布方法的想法密切相关(而且测试是以方法命名的,所以我不能只让一个名为‘go’的测试,因为这样我的所有测试都将被称为'go',并且我希望所有的测试都被单独命名)。
或者,有什么替代DUnit的方法可以做我想做的事呢?
发布于 2009-04-01 11:58:03
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.发布于 2009-04-01 11:47:53
我想说的是,您基本上希望有一个“超级测试”函数,然后调用其他测试,每个数据文件一个。这就是我们使用DUnit测试之一所做的。您只需在一个循环中依次加载每个可用文件,并在适当的情况下使用Check运行测试。
在同一个项目中,我们还使用了另一种方法来测试最终的应用程序及其数据加载和分析,它是使用类似于FinalBuilder的东西在应用程序上循环(想必您也可以在DUnit应用程序上循环并使用一个参数)来处理各种不同的数据文件。然后应用程序运行,进行分析,然后在保存后退出。然后,另一个应用程序将结果数据与理想数据进行比较,并在适当情况下报告失败。
https://stackoverflow.com/questions/705114
复制相似问题