[fpc-pascal] Testing applications with FPCUnit

Graeme Geldenhuys graemeg.lists at gmail.com
Mon Dec 19 09:26:52 CET 2011


On 17 December 2011 18:03, Luciano de Souza  wrote:
> The idea of FPCUnit is really wonderful. I really would like to use it, but
> Lazarus dependencies can complicate a lot.

I have been a long time user of FPCUnit and even helped to maintain
and improve it over the years. It has some design flaws and
limitations though, so is good for smaller projects and less
complicated test suites.

For a more feature complete testing suite, I would recommend the
FPTest (Free Pascal Testing Framework) project instead. I am the
current maintainer of FPTest - which is a fork/continuation of the
DUnit2 testing framework created by the late Peter McNabb, but
specifically tailored for the Free Pascal compiler. FPTest fixes all
of the problems I experienced with FPCUnit. It supports Text and GUI
(only fpGUI at the moment, but a LCL UI will follow shortly) test
projects out of the box. No dependencies on any IDE (Lazarus IDE or
otherwise), and no GUI toolkits are required either. The GUI UI does
make the usage (and advanced features) much easier though - but it is
by no means a requirement. The Text runner can do everything the GUI
runner can.

FPTest has a many more features than FPCUnit: multiple projects
support, extended CheckXXX calls (known as AssertXXX in FPCUnit),
improved error reporting, warning support, huge self-test testing
frameworking, improved decorator tests (which are flawed in FPCUnit),
improved Setup/TearDown and SetupOnce/TearDownOnce support etc.

Here is a console sample testing project

---------------------[ project1.pas ]------------------------
program project1;

{$mode objfpc}{$H+}

uses
  Classes,
  TextTestRunner,
  sample_tests;

begin
  // Register all tests
  sample_tests.RegisterTests;

  RunRegisteredTests;
end.
---------------------------------[ end ]----------------------------------

and the unit containing the actual tests...

-------------------------[ sample_tests.pas ]----------------------
unit sample_tests;

{$mode objfpc}{$H+}

interface

uses
  TestFramework;

type
  TTestCaseFirst = class(TTestCase)
  published
    procedure TestWarning;
    procedure TestOne;
    procedure TestTwo;
    procedure TestThree;
  end;

  TClassA = class(TTestCase)
  published
    procedure TestClassA1;
    procedure TestClassA2; virtual;
  end;

  TClassB = class(TClassA)
  published
    procedure TestClassA2; override;
    procedure TestClassB1;
    procedure TestError;
  end;


procedure RegisterTests;


implementation

uses
  sysutils;


procedure RegisterTests;
begin
  TestFramework.RegisterTest(TTestCaseFirst.Suite);
  TestFramework.RegisterTest(TClassB.Suite);
end;

{ TTestCaseFirst }

procedure TTestCaseFirst.TestWarning;
begin
  // Do nothing here - should cause a Warning
end;

procedure TTestCaseFirst.TestOne;
begin
  Check(1 + 1 = 3, 'Catastrophic arithmetic failure!');
end;

procedure TTestCaseFirst.TestTwo;
begin
  Check(1 + 1 = 2, 'Catastrophic arithmetic failure!');
end;

procedure TTestCaseFirst.TestThree;
var
  s: string;
begin
  s := 'hello';
  CheckEquals('Hello', s, 'Failed CheckEquals');
end;

{ TClassA }

procedure TClassA.TestClassA1;
begin
  fail('TClassA.TestClassA1');
end;

procedure TClassA.TestClassA2;
begin
  Fail('This virtual method should never appear.');
end;

{ TClassB }

procedure TClassB.TestClassA2;
begin
  Fail('Test overridden method');
end;

procedure TClassB.TestClassB1;
begin
  sleep(2264);
  Fail('Test sleep() causing extra time');
end;

procedure TClassB.TestError;
var
  x, y: integer;
begin
  x := 10;
  y := 0;
  Check(x / y = 0, 'Failed on 1');
end;

end.
---------------------------------[ end ]----------------------------------


The source code is freely available from Github using the following command.

  git clone git://github.com/graemeg/fptest.git

or

  git clone https://github.com/graemeg/fptest.git


If you don't have git installed, you can always grab a source tarball
too, using the following URL.

  https://github.com/graemeg/fptest/tarball/master


FPTest documentation can be found in the 'docs' directory as HTML
files. The FPTest project is still under active development, so things
are constantly improved. For this reason I highly recommend you get
the source code via git, instead of as a tarball.

Good news is that you are not forced to choose either or testing
frameworks.  Years ago I included a DUnit/FPTest compatibility
interface to FPCUnit. This gives you a nice upgrade path from FPCUnit
to FPTest. So if you design your test suites using the CheckXXX calls
and not the AssertXXX calls, then later you can easily switch to the
FPTest framework without any need for changing your testing code.


-- 
Regards,
  - Graeme -


_______________________________________________
fpGUI - a cross-platform Free Pascal GUI toolkit
http://fpgui.sourceforge.net



More information about the fpc-pascal mailing list