I tried creating DUnit tests for ScroogeXHTML with AI assistance, and the first result was already quite acceptable.
Continue reading “DUnit test suite generation for a RTF to HTML converter — with AI assistance”OpenCTF 1.6.0 component test framework released
The Open Component Test Framework (OpenCTF) is a test case generator framework for Delphi VCL applications, which creates DUnit tests at run time.
The new version 1.6.0 is a maintenance release and is now available on GitHub at https://github.com/michaelJustin/openctf
Example project
program FormTests; uses OpenCTF, ctfStandardTests, GUITestRunner, TestForm in 'TestForm.pas' {Form1}; begin OpenCTF.RegisterFormClasses([TForm1]); RunRegisteredTests; end.
When run, the FormTests example project dynamically creates tests for visual and non-visual components of the form and reports bad property values and other “errors”.
Note
- to run the project, the path ‘..\..\source’ to the OpenCTF source directory must be added to the project search path
- developed and tested with Delphi 2009, newer Delphi versions might need an older version of DUnit (9.3.0 or 9.4.0)
Daraja Framework unit test enhancements
The Daraja Framework unit tests (DUnit/FPCUnit based) are now more self-documenting. A new HTTPTestCase test base class provides methods CheckGETResponseEquals, CheckPOSTResponseEquals, CheckGETResponseContains, CheckGETResponse404, and others, which allow to write more concise unit test methods.
The changes are available in the master branch, a snapshot is available for download here.
How can I disable DUnit tests programmatically?
For integration tests of Habari ActiveMQ Client libraries, I created a DUnit test suite which runs once for every version of the message broker. Unfortunately, some of the tests always fail because of known bugs in the tested version of the message broker (not the client library).
This means the test suites will never complete with 100%. For automated tests however, I need a 100% success score, otherwise, continous integration tools will detect a failed build.
DUnit does not offer a ready-made method to disable tests in a test suite by name. So I wrote a procedure which takes a test suite and a list of test names, and then disables all tests with a matching name, and also performs a recursion into nested test suites.
Here is the code, feel free to use it:
procedure DisableTests(const ATest: ITest; const AExclude: TStrings); var I: Integer; begin if AExclude.IndexOf(ATest.Name) <> -1 then begin ATest.Enabled := False; end; for I := 0 to ATest.Tests.Count - 1 do begin DisableTests(ATest.Tests[I] as ITest, AExclude); end end;
Example usage (the TStringlist ‘Excludes’ is created in the Setup method):
procedure TActiveMQ541Suite.SetUp; begin // fill test suite inherited; // exclude some tests Excludes.Add('TestBytesMessages'); Excludes.Add('TestBigMessages'); DisableTests(Self, Excludes); LaunchActiveMQ('5.4.1'); end;
New Code Coverage Report Tool for Delphi
Delphi Code Coverage is a tool by Christer Fahlgrren which generates HTML reports for “line coverage” of Delphi applications. This project was inspired by great tools in the Java world such as Emma.
Download
The source code and binary is available online at http://code.google.com/p/delphi-code-coverage/
Output
For each unit there will be a unit.html with a summary of the coverage, followed by the source marked up. Green lines were covered. Red lines were not covered lines. The other lines didn’t have code generated for it. There is also a Coverage_summary.html file that summarizes the coverage and has links to the generated unit reports.
Hudson Support
Version 0.3 of the tool has been released and introduced Hudson support.
Read more: Delphi Code Coverage in Hudson
Why 1.99 suddenly no longer equals 1.99
A strange problem suddenly occurs in all my Delphi 7 and Delphi 2009 unit tests.
I used DUnit CheckEquals to compare two Currency values, like
CheckEquals(1.99, SomeCurrencyValue)
This worked fine in the IDE and in our build scripts, which run using the same version of DUnit for two years. Now, all of a sudden, all tests fail with strange error messages like
Expected: <1.99> - Found: <1.99>
With some newsgroup help I found that something has changed a processor flag which is responsible for floating point operations. Digging deeper in my unit tests, I found the root cause in the IBX component TIBDatabase, which seems to modify this flag.
TIBDataBase.Create(nil) changes the value of Get8087CW from $1372 to $1272, a very strange value.
procedure TForm2.Button1Click(Sender: TObject); begin Memo1.Lines.Add(Format('FPU CW = $%4.4X',[Get8087CW])); TIBDataBase.Create(nil); Memo1.Lines.Add(Format('FPU CW = $%4.4X',[Get8087CW])); end;
Tested on two systems running Windows 2000 SP 4, InterBase 7.5.1 and 2007 libraries (gds32.dll), Delphi 7 and Delphi 2009
Delphi tool box: a starter kit
Tests
First things first: unit tests. Before you start to write a program, think about testing. Download DUnit if it is not already included in your version of Delphi. DUnit is Open Source. New versions of DUnit include automatic memory leak detection for all test cases, using FastMM4.
There are also add ons available for DUnit, for example the OpenCTF component test framework. If you are new to the idea of unit testing and DUnit, you should read this article. The Wikipedia also contains information about Test Driven Development.
Speed
Now it’s time to “turbo charge” your IDE with DelphiSpeedUp, a free plugin for Delphi/BCB/BDS/CodeGear RAD Studio. It speeds up the time to load the IDE and it also improves the whole speed of the IDE. Note that it does not improve the speed of compiled applications – but you can skip to the section More Speed below if this issue is very urgent.
Comfort
Next in the list are the GExperts, an almost incredible set of tools built to increase the productivity of Delphi and C++Builder programmers by adding several features to the IDE. GExperts is Open Source and supports all editions of Delphi down to version 3. It offers a procedure list, grep search, to do lists, tab order and component replace wizards and many many more.
Another collection of useful IDE extensions, including a ‘uses list cleaner’, are the cnPack IDE Wizards (CnWizards), a Free Plug-in Tool Set for Delphi/C++ Builder. The list of wizards includes for example a “Uses Unit Cleaner” and “Source Codes Statistics”.
Some IDE extensions are also included in the Jedi Code Library package. For example, they can add a favorite folders combo box to the Delphi Open File dialog.
Style
Waste no time to format your source code manually – use DelForExp, a freeware Pascal source code formatter for Delphi 2/3/4/5/6/7/9/2007 written by Egbert van Nes. At default, the style of the Borland source code is followed closely. For Delphi 2009, DelForExp is included in an experimental version of GExperts.
More Speed
Your Delphi applications need more speed? One of the first things you can do (besides checking the code for the usual performance bottlenecks), is to use a faster memory manager. Newer versions of Delphi use FastMM4 by default, a lightning fast replacement memory manager for Borland Delphi Win32 applications. For older versions of Delphi, you can download it from SourceForge. FastMM4 is very easy to use and can also help to identify memory leaks.
Safety First
In the software development circus, source version control is your safety net. If you do not have a preferred version control system, try the open source version control system Subversion. A Windows Explorer integration for Subversion, TortoiseSVN, is also available. It includes many useful tools, including a diff and merge application.
Automatic Component Tests for Delphi VCL Applications
The OpenCTF component test framework helps to build automatic tests for all (visual and non-visual) VCL components in a Delphi application. It is based on the DUnit framework.
How does it work?
- OpenCTF iterates over the Forms and DataModules and dynamically creates test cases for the components
- Customized test classes detect which components have to be tested, and configure the test steps
Continue reading “Automatic Component Tests for Delphi VCL Applications”
You must be logged in to post a comment.