10

有没有办法编写单元测试,以便可以使用 Delphi 和 Free Pascal 编译和运行它们?

Delphi 和 Free Pascal 有不同的单元测试框架,这会导致针对这两种编译器的开发人员(例如,库和框架开发人员)的重复工作。

所以也许有一种方法,使用 DUnit 或 FPCUnit 框架并调整测试用例源代码(或框架本身),以便它也可以与其他编译器一起使用。

所以本质上问题是:

  • 哪个框架(DUnit 或 FPCUnit)可以用两种编译器(Delphi 和 Free Pascal)编译,并且尽可能少地修改?

或者

  • 是否有与 Delphi 和 FPC 一起使用的第三个框架(感谢 Arnaud 提到 TSynTest)?
4

3 回答 3

10

请参阅这篇非常不错的博客文章——关于 FPCUnit 测试的新鲜内容。

简而言之,据我所知,如果您与 DUnit 进行比较

  • 大多数 Check*() 方法被重命名为 Assert*();
  • SetUp / TearDown 方法在两个框架中都按功能调用;
  • 其他一些想法可能会有所不同。

因此,我认为通过在 FPCUnit 实现上创建一个小型包装类,让 FPCUnit “模仿” DUnit 很容易,从而拥有与 DUnit 相同的确切方法。因此,您可以在两个目标之间共享代码,甚至可以重用现有的 DUnit 测试。恕我直言,这样的包装类比这里建议的使用更方便{$ifdef FPC}。条件编译往往会使代码难以调试、冗长、冗余,仅应在必要时使用。

另一个潜在的解决方案可能是使用其他测试框架。我们的小型TSynTest 类更轻,但我目前正在将框架转换为 FPC。因此,两个编译器都可以使用相同的代码。它有一些我会从 DUnit / FPCUnit 中错过的功能(比如带有精细分析的可选日志记录,以及失败时的完整堆栈 strace)。它没有 GUI 或向导,但老实说,作为我的程序员,我更喜欢纯文本,我可以轻松地将其包含在我的技术发布文档中,以证明没有发生回归。

于 2012-08-31T06:34:41.060 回答
7

Free Pascal 的默认单元测试框架是 FPCUnit,它与 DUnit 具有相同的设计,但在细节上有所不同。您可以通过绕过差异来为 FPCUnit 和 DUnit 编写通用单元测试{$IFDEF FPC}。我刚刚测试了 FPCUnit,它是一个可用的框架,并在博客中介绍了它

于 2012-08-31T06:25:40.957 回答
4

我刚刚制作了一个适用于 DUnit (delphi) 和 FPCUnit 的示例(最接近 DUnit 的 Freepascal 等价物,恰好在 lazarus 1.0 中已经“装在盒子里”,其中包括 freepascal 2.6 ):

一点点 IFDEF,你就在那里。

unit TestUnit1;

{$IFDEF FPC}
{$mode objfpc}{$H+}
{$ENDIF}

interface

uses
  Classes,
  {$ifdef FPC}
  fpcunit, testutils, testregistry,
  {$else}
  TestFramework,
  {$endif}
  SysUtils;

type
  TTestCase1= class(TTestCase)
  published
    procedure TestHookUp;
  end;

implementation

procedure TTestCase1.TestHookUp;
begin
   Self.Check(false,'value');
end;

initialization
  RegisterTest(TTestCase1{$ifndef FPC}.Suite{$endif});
end.
于 2012-08-31T01:45:58.517 回答