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.
Atlassian, a leader in software for accelerating product development and collaboration, announced on March 2, 2011 the company will mark $1 million in donations to Room to Read, a global non-profit that seeks to transform the lives of millions of children in developing countries by focusing on literacy and gender equality in education. The company raised the funds with the help of their customers through the sale of $10 software licenses, one of the first broad-based cause-for-marketing (“causium”) programs.
Funds from the Atlassian donation have been used to establish libraries and schools in developing nations, publish local language literature, and fund holistic educational opportunities for girls who are at high-risk of dropping out of school.
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);
if AExclude.IndexOf(ATest.Name) <> -1 then
ATest.Enabled := False;
for I := 0 to ATest.Tests.Count - 1 do
DisableTests(ATest.Tests[I] as ITest, AExclude);
Example usage (the TStringlist ‘Excludes’ is created in the Setup method):
// fill test suite
// exclude some tests
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.
Version 0.3 of the tool has been released and introduced Hudson support.
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
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.
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.
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.
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.
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.
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.
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.