- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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.
当你运行它时,你的测试看起来像这样:
由于 Delphi 中的属性只接受常量,因此属性只将参数作为字符串,其中值之间用分号分隔。但是没有什么可以阻止您创建自己的属性类,这些属性类采用正确类型的多个参数来防止“魔术”字符串。无论如何,您只能使用 const 类型。
您还可以在方法的每个参数上指定 Values 属性,并以任何可能的组合调用它(如 NUnit )。
就我个人而言,我希望在编写单元测试时编写尽可能少的代码。另外,我想看看当我查看接口(interface)部分而不深入研究实现部分时测试会做什么(我不会说:“让我们做BDD”)。这就是为什么我更喜欢声明式方式。
关于delphi - 我可以在 DUnit 中编写 'parameterized' 测试吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8999945/
如何从 IDE 运行 TestCase? 我创建了一个新项目,具有一个简单的表单: unit Unit1; interface uses Windows, Messages, SysUtils,
目前我在 DUnit 中使用 2 级测试层次结构(测试项目 -> 测试用例 -> 测试方法;请参见下面的示例)。是否可以引入第三级甚至更多级别? 最佳答案 我通过在“SuitePath”中添加反斜杠来
有没有办法比较两个文本文件,如果它们在 dunit 中不相同,则显示差异? 最简单的开始是将它们读取到 TStringList,但是比较两个文本文件的代码要复杂得多,DUnitGui 中的 gui 不
如何在应用程序控制台的 DUnit 中确定哪些层次结构将被测试和未测试?当我在 GUI 模式下工作时,我可以检查和取消选中层次结构。 最佳答案 ITest DUnit 中的接口(interface)包
对于集成测试,我创建了一个 DUnit 测试套件,该套件为第三方组件(消息代理)的每个版本运行一次。不幸的是,由于被测试组件的某些版本中存在已知错误,某些测试总是失败。 这意味着测试套件永远不会 10
我有一个 dunit 测试项目,我正在尝试在控制台模式下运行它。当我执行该项目时,它会运行两次(它只打开一个控制台窗口,我看到它执行了两次测试),并且比在 GUI 模式下运行它时花费的时间要多得多。有
在 DUnit 中,SetUp 和 TearDown 分别在执行每个测试方法之前(和之后)调用。 在 SetUp 中,我创建了一个从文件加载数据的对象。这很慢,尤其是当我有很多测试时。 在执行所有测试
我使用的是 Delphi 7。 我是 DUnit 的新手,我的疑问是我可以使用 DUnit 编写什么样的测试用例以及如何编写(这对我来说非常重要)。 是否可以为特定的按钮单击事件编写测试用例?因为在这
DUnit 通常的工作方式是编写一些已发布的方法,DUnit 将它们作为测试运行。我想做的有点不同。我想在运行时基于数据创建测试。我正在尝试测试一个处理输入文件以创建输出文件的特定模块。我有一组测试输
翻遍了Delphi安装的文件后,我发现了一个文件 “C:\Program Files\Embarcadero\RAD Studio\7.0\ObjRepos\en\UnitTestFrameworks
我正在测试用 CEF4Delphi 创建的一些进程通过 DUnit 在我的应用程序中。 以下是重现该问题的 MCVE: unit MyUnit; interface {$I cef.inc} uses
你会推荐什么工具在 Delphi 中进行单元测试。 我使用 FastMM4 进行内存泄漏测试。 和 MadExcept,两者都是规则,但它不能帮助我测试我的程序中的逻辑。 我想要一些替代品,所以不要急
TGUITestRunner 表单表示 DUnit 测试结果,由 GUITestRunner.RunTest 过程创建一次: procedure RunTest(test: ITest); begin
您可以使用 TAbstractTest.Status 过程在测试期间在 DUnit GUI 中显示一些调试消息。 但是当我运行这组测试时,我只能看到上次执行的测试的状态消息。我可以在不选择要运行的每个
我正在使用Hudson作为 Delphi 2010 项目的 CI 服务器。 XMLTestRunner.pas 单元将 DUnit 测试结果写入 xml 文件,hudson xUnit 插件使用该文件
我正在比较 DUnit 中的一些货币值,但它在我的机器上根本不起作用(在其他机器上起作用,但在我的机器上不起作用)。 一个例子: CheckEquals(16.65, SomeCurrencyFiel
如何为 Delphi DUnit 中的单元测试提供数据?例如,在 PHP 中,您可以执行以下操作: public function URLProvider() { return [
我正在使用 DUnit 和 FastMM 来捕获未完成的内存块,但似乎有一个错误。我不知道它是在 FastMM、DUnit 还是在 Delphi 本身中,但这里有: 当我的测试用例有内部字符串时,测试
下面的代码工作正常, calc... 生成异常,将其注释掉或更改 calc... 以不引发异常并且测试失败。 StartExpectingException(exception); calcM
嘿,我在 Delphi XE3 中的单元测试有问题,我有一个由 1 个 MDIForm 和分配的 MDIChild 表单组成的项目,那么问题是,当我在 MDIChild 表单上运行测试时,我收到此错误
我是一名优秀的程序员,十分优秀!