Free Pascal和Delphi的单源单元测试

时间:2012-08-30 19:38:01

标签: delphi unit-testing freepascal dunit

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

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

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

基本上问题是:

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

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

3 个答案:

答案 0 :(得分:10)

请参阅此very nice blog article - 关于FPCUnit测试的新鲜事。

简而言之,据我所知,如果你compare to DUnit

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

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

另一个可能的解决方案可能是使用其他测试框架。我们的小TSynTest classes更轻,但我正在将框架转换为FPC。因此,两个编译器可以使用相同的精确代码。它有一些功能(比如可选的日志记录,有精细的分析,以及完整的堆栈故障),我很想念DUnit / FPCUnit。它没有GUI也没有向导,但老实说,作为程序员,我更喜欢纯文本,我可以在技术发布文档中轻松证明没有发生回归。

答案 1 :(得分:7)

Free Pascal的默认单元测试框架是FPCUnit,它与DUnit具有相同的设计,但在细节方面与它不同。您可以通过{$IFDEF FPC}规避差异来为FPCUnit和DUnit编写公共单元测试。我刚刚测试了FPCUnit,它是一个可用的框架,blogged about it

答案 2 :(得分:3)

我刚刚发现了一个可以在DUnit(delphi)和FPCUnit中运行的样本(Freepascal等同于最接近DUnit,恰好已经在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.