有没有办法编写单元测试,以便可以使用Delphi和Free Pascal编译和运行它们?
Delphi和Free Pascal有不同的单元测试框架,这会导致针对两个编译器(例如,库和框架开发人员)的开发人员重复工作。
所以也许有一种方法,使用DUnit或FPCUnit框架并调整测试用例源代码(或框架本身),以便它也可以与其他编译器一起使用。
基本上问题是:
或
答案 0 :(得分:10)
请参阅此very nice blog article - 关于FPCUnit测试的新鲜事。
简而言之,据我所知,如果你compare to DUnit:
所以,我认为通过在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.