gpt4 book ai didi

delphi - 我可以在 DUnit 中编写 'parameterized' 测试吗

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

我正在使用 DUnit 来测试 Delphi 库。我有时会遇到这样的情况,我编写几个非常相似的测试来检查函数的多个输入。

有没有办法在 DUnit 中编写(类似于)参数化测试?例如,为合适的测试过程指定输入和预期输出,然后运行测试套件并获取关于多次运行测试失败的反馈?

(编辑:示例)

例如,假设我有两个这样的测试:

procedure TestMyCode_WithInput2_Returns4();
var
Sut: TMyClass;
Result: Integer;
begin
// Arrange:
Sut := TMyClass.Create;

// Act:
Result := sut.DoStuff(2);

// Assert
CheckEquals(4, Result);
end;

procedure TestMyCode_WithInput3_Returns9();
var
Sut: TMyClass;
Result: Integer;
begin
// Arrange:
Sut := TMyClass.Create;

// Act:
Result := sut.DoStuff(3);

// Assert
CheckEquals(9, Result);
end;

我可能有更多这样的测试,它们做完全相同的事情,但具有不同的输入和期望。我不想将它们合并到一个测试中,因为我希望它们能够独立地通过或失败。

最佳答案

您可以使用 DSharp 来改进您的 DUnit 测试。尤其是新单位DSharp.Testing.DUnit.pas (在 Delphi 2010 及更高版本中)。

只需在 TestFramework 之后将其添加到您的用途中,您就可以向您的测试用例添加属性。那么它可能看起来像这样:

unit MyClassTests;

interface

uses
MyClass,
TestFramework,
DSharp.Testing.DUnit;

type
TMyClassTest = class(TTestCase)
private
FSut: TMyClass;
protected
procedure SetUp; override;
procedure TearDown; override;
published
[TestCase('2;4')]
[TestCase('3;9')]
procedure TestDoStuff(Input, Output: Integer);
end;

implementation

procedure TMyClassTest.SetUp;
begin
inherited;
FSut := TMyClass.Create;
end;

procedure TMyClassTest.TearDown;
begin
inherited;
FSut.Free;
end;

procedure TMyClassTest.TestDoStuff(Input, Output: Integer);
begin
CheckEquals(Output, FSut.DoStuff(Input));
end;

initialization
RegisterTest(TMyClassTest.Suite);

end.

当你运行它时,你的测试看起来像这样:

enter image description here

由于 Delphi 中的属性只接受常量,因此属性只将参数作为字符串,其中值之间用分号分隔。但是没有什么可以阻止您创建自己的属性类,这些属性类采用正确类型的多个参数来防止“魔术”字符串。无论如何,您只能使用 const 类型。

您还可以在方法的每个参数上指定 Values 属性,并以任何可能的组合调用它(如 NUnit )。

就我个人而言,我希望在编写单元测试时编写尽可能少的代码。另外,我想看看当我查看接口(interface)部分而不深入研究实现部分时测试会做什么(我不会说:“让我们做BDD”)。这就是为什么我更喜欢声明式方式。

关于delphi - 我可以在 DUnit 中编写 'parameterized' 测试吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8999945/

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