我正在使用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;
我可能会有更多的这样的测试,它们做的是完全相同的事情,但有不同的输入和期望,我不想把它们合并到一个测试中,因为我希望它们能够独立地通过或失败。
5条答案
按热度按时间xt0899hw1#
你可以使用DSharp来改进你的DUnit测试,特别是新的单元DSharp.Testing.DUnit.pas(在 Delphi 2010及更高版本中)。
只需将其添加到TestFramework之后的使用中,您就可以将属性添加到测试用例中。然后它可能看起来像这样:
当你运行它时,你的测试看起来像这样:
由于 Delphi 中的属性只接受常量,属性只接受参数作为字符串,其中值由分号分隔。但是没有什么可以阻止你创建自己的属性类,它接受多个正确类型的参数以防止“魔术”字符串。无论如何,你只限于可以是常量的类型。
您还可以在方法的每个参数上指定Values属性,并使用任何可能的组合调用它(如NUnit)。
就我个人而言,我想在编写单元测试时尽可能少地编写代码。此外,我想看看当我查看接口部分而不深入实现部分时测试会做什么(我不会说:“let's do BDD“)。这就是为什么我更喜欢声明式的方式。
a1o7rhls2#
我想你正在寻找这样的东西:
它在GUI测试运行器中看起来像这样:
我很想知道我是否用了一种次优的方法来解决这个问题。DUnit是如此的通用和灵活,以至于每当我使用它时,我总是觉得我错过了一种更好、更简单的解决问题的方法。
xyhw6mcr3#
如果DUnit允许编写这样的代码,即每次调用AddTestForDoStuff都会创建一个类似于您的示例中的测试用例,这就足够了吗?
我将尝试张贴一个例子如何这可以做到今天晚些时候...
对于.Net,已经有类似的东西:流利的Assert
http://www.codeproject.com/Articles/784791/Introduction-to-Unit-Testing-with-MS-tests-NUnit-a
xqnpmsa84#
下面是一个使用通用参数化测试方法的示例,该方法从TTestCase后代实际(已发布)测试方法(:
是的,有一些重复,但主要的代码重复是从这些方法中取出的,进入祖先类中的SendAndReceive和CheckDestinationAgainstSource方法:
CheckDestinationAgainstSource中的参数也允许这种类型的用途:
最后一个测试也可以使用TRepeatedTest类进行编码,但我发现该类使用起来相当不直观。上面的代码在编码检查和生成可理解的失败消息方面给了我更大的灵活性。然而,它确实有在第一次失败时停止测试的缺点。
falq053o5#
至少在 Delphi XE8中,刚开箱即用的DUnitX具有类似的属性:
(See也称为https://docwiki.embarcadero.com/RADStudio/Seattle/en/DUnitX_Overview和https://web.archive.org/web/20150504232249/http://docwiki.embarcadero.com/RADStudio/XE8/en/DUnitX_Overview)
它也可用于 Delphi 从2010年版本在https://github.com/VSoftTechnologies/DUnitX