【发布时间】:2012-02-18 11:22:07
【问题描述】:
我正在使用 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;
我可能有更多这样的测试,它们做的事情完全相同,但输入和期望不同。我不想将它们合并到一个测试中,因为我希望它们能够独立通过或失败。
【问题讨论】:
-
您的意思是为列表中的所有输入值动态创建测试用例吗?我的(小)OpenCTF 测试框架包含用于动态创建测试用例的代码。它基于 DUnit。
-
您总是可以在测试类中编写一个通用的参数化方法,并从一个或多个特定(已发布)的测试方法中调用它。 TestCase 的 Check(Not)Equals 方法在这里也可以提供帮助,以帮助保持代码简洁,并且仍然为每个测试提供特定的失败消息。
-
@Marjan 测试方法将在第一个 Check(Not)Equals 失败后立即停止执行 - 动态创建测试用例解决了这个问题,所有其他值仍将被测试
-
@mjn : OpenCTF 似乎是用于以黑盒方式测试组件和表单......这似乎不适用于这里......
-
@MarjanVenema :我猜这不是一个坏方法。我会试试那个...
标签: delphi delphi-xe dunit parameterized-unit-test