DUnit通常的工作方式是编写一些已发布的方法,而DUnit将它们作为测试运行.我想做的是有点不同.我想在运行时根据数据创建测试.我正在尝试测试处理输入文件的特定模块以创建输出文件.我有一组测试输入文件,其中包含相应的已知良好输出文件.我们的想法是为每个输入文件动态创建一个测试,处理输入并根据已知的好输出检查输出.
然而,这里的实际数据来源并不重要.困难在于使DUnit以数据驱动的方式运行.为了解决这个问题,假设数据源只是一个随机数生成器.这是一个解决困难核心的示例具体问题:
在运行时创建一些测试对象(TTestCase或其他),比如10个,每个测试对象
在运行时从随机生成的整数中命名.('name'我的意思是测试运行树中出现的测试名称.)
基于随机整数传递或失败.通过甚至,奇怪的失败.
从DUnit的设计来看,它的设计看起来具有足够的灵活性,使这些事情成为可能.我不确定它是不是.我试图通过继承TAbstractTest和ITest来创建我自己的测试类,但是一些关键的方法无法访问.我也尝试从TTestCase继承,但是这个类与运行已发布方法的想法密切相关(并且测试以方法命名,所以我不能只调用一个,比如'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.