delphi – 我可以在DUnit中写’参数化’测试

前端之家收集整理的这篇文章主要介绍了delphi – 我可以在DUnit中写’参数化’测试前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用DUnit测试一个Delphi库。我有时遇到情况,我写了几个非常类似的测试来检查功能的多个输入。

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

(编辑:一个例子)

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

  1. procedure TestMyCode_WithInput2_Returns4();
  2. var
  3. Sut: TMyClass;
  4. Result: Integer;
  5. begin
  6. // Arrange:
  7. Sut := TMyClass.Create;
  8.  
  9. // Act:
  10. Result := sut.DoStuff(2);
  11.  
  12. // Assert
  13. CheckEquals(4,Result);
  14. end;
  15.  
  16. procedure TestMyCode_WithInput3_Returns9();
  17. var
  18. Sut: TMyClass;
  19. Result: Integer;
  20. begin
  21. // Arrange:
  22. Sut := TMyClass.Create;
  23.  
  24. // Act:
  25. Result := sut.DoStuff(3);
  26.  
  27. // Assert
  28. CheckEquals(9,Result);
  29. end;

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

解决方法

您可以使用DSharp来改进您的DUnit测试。特别是新单位 DSharp.Testing.DUnit.pas(在德尔福2010及以上)。

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

  1. unit MyClassTests;
  2.  
  3. interface
  4.  
  5. uses
  6. MyClass,TestFramework,DSharp.Testing.DUnit;
  7.  
  8. type
  9. TMyClassTest = class(TTestCase)
  10. private
  11. FSut: TMyClass;
  12. protected
  13. procedure SetUp; override;
  14. procedure TearDown; override;
  15. published
  16. [TestCase('2;4')]
  17. [TestCase('3;9')]
  18. procedure TestDoStuff(Input,Output: Integer);
  19. end;
  20.  
  21. implementation
  22.  
  23. procedure TMyClassTest.SetUp;
  24. begin
  25. inherited;
  26. FSut := TMyClass.Create;
  27. end;
  28.  
  29. procedure TMyClassTest.TearDown;
  30. begin
  31. inherited;
  32. FSut.Free;
  33. end;
  34.  
  35. procedure TMyClassTest.TestDoStuff(Input,Output: Integer);
  36. begin
  37. CheckEquals(Output,FSut.DoStuff(Input));
  38. end;
  39.  
  40. initialization
  41. RegisterTest(TMyClassTest.Suite);
  42.  
  43. end.

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

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

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

另外,在写单元测试的时候,我想写个尽可能少的代码。此外,我想看看测试在看到界面部分时没有挖掘实现部分(我不会说:“让我们做BDD”)做什么。这就是为什么我更喜欢声明性的方式。

猜你在找的Delphi相关文章