DUnit通常工作的方式是编写一些已发布的方法,DUnit将其作为测试运行.我想做的是有点不一样.我想在运行时根据数据创建测试.我试图测试一个特定的模块来处理输入文件以创建输出文件.我有一组测试输入文件与相应的已知的良好的输出文件.这个想法是动态创建测试,每个输入文件一个,用于处理输入,并根据已知的输入文件检查输出.
然而,这里的实际数据来源并不重要.困难在于使DUnit以数据驱动的方式表现.为了这个问题,假设数据源只是一个随机数发生器.这是一个具体问题的一个具体问题:困难的核心:
在运行时创建一些测试对象(TTestCase或其他),其中10个,每个对象
>在运行时从随机生成的整数命名. (以’name’表示出现在测试者树中的测试名称.)
>根据随机整数传递或失败.通过甚至,失败的奇怪.
从DUnit的设计来看,它的设计考虑到了足够的灵活性,使其成为可能.我不知道是不是.我尝试通过继承TAbstractTest和ITest创建自己的测试类,但是一些关键的方法是不可访问的.我也尝试从TTestCase继承,但这个类与运行已发布的方法的想法密切相关(测试以方法命名,所以我不能只有一个叫“去”,因为那个我所有的测试都会被称为“去”,我想让我所有的测试都被单独命名).
或者,还有一些替代DUnit可以做我想要的东西吗?
解决方法
@H_403_17@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.