gpt4 book ai didi

delphi - 数据驱动的 DUnit 测试

转载 作者:行者123 更新时间:2023-12-03 14:39:50 25 4
gpt4 key购买 nike

DUnit 通常的工作方式是编写一些已发布的方法,DUnit 将它们作为测试运行。我想做的有点不同。我想在运行时基于数据创建测试。我正在尝试测试一个处理输入文件以创建输出文件的特定模块。我有一组测试输入文件以及相应的已知良好输出文件。这个想法是动态创建测试,每个输入文件一个,处理输入并根据已知的良好输出检查输出。

然而,这里的实际数据来源并不重要。困难在于使 DUnit 以数据驱动的方式运行。对于这个问题,假设数据源只是一个随机数生成器。下面是一个具体问题的示例,它触及了困难的核心:

在运行时创建一些测试对象(TTestCase 或其他),比如说 10 个,其中每个对象

  1. 在运行时根据随机生成的整数命名。 (“名称”是指出现在测试运行程序树中的测试的名称。)
  2. 根据随机整数通过或失败。偶数通过,奇数失败。

从 DUnit 的设计来看,它看起来在设计时就考虑到了足够的灵 active ,使得这样的事情成为可能。我不确定是不是这样。我尝试通过继承 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.

关于delphi - 数据驱动的 DUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/705114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com