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