10

Delphi と Free Pascal の両方でコンパイルして実行できるように単体テストを作成する方法はありますか?

Delphi と Free Pascal では単体テスト フレームワークが異なるため、両方のコンパイラを対象とする開発者 (たとえば、ライブラリとフレームワークの開発者) の作業が重複します。

したがって、DUnit または FPCUnit フレームワークのいずれかを使用し、テスト ケースのソース コード (またはフレームワーク自体) を調整して、他のコンパイラでも動作するようにする方法があるかもしれません。

したがって、本質的に質問は次のとおりです。

  • 可能な限り変更を加えずに両方のコンパイラ (Delphi と Free Pascal) でコンパイルできるフレームワーク (DUnit または FPCUnit) はどれですか?

また

  • Delphi と FPC で動作する 3 番目のフレームワーク (TSynTest について言及してくれた Arnaud に感謝) はありますか?
4

3 に答える 3

10

この非常に素晴らしいブログ記事を参照してください-FPCUnitテストについての新鮮な肉。

要するに、私の知る限り、DUnit と比較すると:

  • ほとんどの Check*() メソッドの名前は Assert*(); に変更されました。
  • SetUp / TearDown メソッドは、両方のフレームワークで関数ごとに呼び出されます。
  • 他のいくつかの考えは異なる場合があります。

したがって、FPCUnit 実装上に小さなラッパー クラスを作成することで、 FPCUnit が DUnit を「模倣」し、DUnitとまったく同じメソッドを持つようにするのは簡単だと思います。そのため、2 つのターゲット間でコードを共有したり、既存の 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 に相当するもので、 freepascal 2.6 を含む lazarus 1.0 で既に「同梱」されています) の両方で動作するサンプルを作成しました。

些細な 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 に答える