Feeds

Driving on the right side of the code

Test-driven development

Choosing a cloud hosting partner with confidence

Column Perhaps one of the most interesting things about TDD is not the specification-oriented and design-centred role in which testing is employed, but the amount of explanation it requires as a term. And I don't just mean expanding the abbreviation to Test-Driven Development or Test-Driven Design, as opposed to, say, Telecommunications Device for the Deaf (That said, I have heard it mistaken for Top-Down Design.)

One illustration of the problem of explanation can be found in the abstract for the session "Are Your Tests Really Driving Your Development?", run by Nat Pryce and Steve Freeman at the XP Day 2006 conference:

Everybody knows that TDD stands for Test Driven Development. However, people too often concentrate on the words "Test" and "Development" and don't consider what the word "Driven" really implies. For tests to drive development they must do more than just test that code performs its required functionality: they must clearly express that required functionality to the reader. That is, they must be clear specifications of the required functionality. Tests that are not written with their role as specifications in mind can be very confusing to read. The difficulty in understanding what they are testing can greatly reduce the velocity at which a codebase can be changed.

One of the common misinterpretations of TDD is that it is no more than getting developers involved in testing. Developers are responsible for their work, which includes the idea that code is tested at the code level, as opposed to just having it tested indirectly in the software system as a whole. This responsibility defines a foundation on which TDD is built, but it is not itself TDD: there is no sense in which the tests are driving an aspect of development. In a traditional developer-based testing approach, tests are employed to discover defects in code, whereas the emphasis of TDD is that tests are also used for specification and design.

The need for terminology explanation, however, often goes further than just clarifying the distinction between traditional developer-based testing and TDD. Not only do many people stop listening after the first word, they follow through by applying one particular interpretation to that word. They hear test and make assumptions and projections about the whole approach based on a limited understanding of what that word might entail.

Presenting a concept by examining the individual words in its name is effective as pedagogy, as the previous quote demonstrates, but such a literal analysis of a jargon term is hopeless if you are trying to read anything much deeper into a concept — instead of depth, you are likely to end up with an understanding that is at best superficial and at worst just plain wrong.

For another example of misinterpreted jargon, let's consider a related term: Test-First Programming. Historically, the term Test-First Programming predates Test-Driven Development.

Many developers treat them as synonyms, but in practice they have slightly different usage: Test-First Programming is normally used in the context of Extreme Programming and emphasises the practice that code that tests for a behaviour should be written before — as opposed to alongside or after — the code that fulfils the behaviour; Test-Driven Development often refers to a slightly broader set of the practices, often when considered outside the context of Extreme Programming, and although a test-first style may be employed, strictness of timing is emphasised less than the role of tests as a form of feedback. Both terms embody the notion that testing is continuous and integrated with development, rather than separated, or even divorced. The Pragmatic Programmers' tips "Test Early. Test Often. Test Automatically." and "Coding Ain't Done 'Til All the Tests Run" capture the essence.

And yet it is possible to miss all of these clues and connotations to misinterpret the idea of Test-First Programming as writing all of the test code for a module or major subsystem before writing any of the code — in other words, do the tests first. Yes, this would be a naïve interpretation of the practice according to its name, but that doesn't stop people making such literalist interpretations. So, inevitably, a few have tried to pursue this mutated style doggedly and dogmatically in the name of buzzword compliance.

A little embarrassingly, one of the software testing classics, Glenford Myers' The Art of Software Testing, was updated by authors who appeared to use this coarse-grained interpretation as the basis of a whole chapter on Extreme Testing. Claims such as "In XP, you must create the unit tests first, then you create the code to pass the tests" and "All code modules must have unit tests before coding begins" are enough to make you cringe and hanker for the unadulterated first edition.

Business security measures using SSL

More from The Register

next story
'Windows 9' LEAK: Microsoft's playing catchup with Linux
Multiple desktops and live tiles in restored Start button star in new vids
Not appy with your Chromebook? Well now it can run Android apps
Google offers beta of tricky OS-inside-OS tech
New 'Cosmos' browser surfs the net by TXT alone
No data plan? No WiFi? No worries ... except sluggish download speed
SUSE Linux owner Attachmate gobbled by Micro Focus for $2.3bn
Merger will lead to mainframe and COBOL powerhouse
iOS 8 release: WebGL now runs everywhere. Hurrah for 3D graphics!
HTML 5's pretty neat ... when your browser supports it
Greater dev access to iOS 8 will put us AT RISK from HACKERS
Knocking holes in Apple's walled garden could backfire, says securo-chap
NHS grows a NoSQL backbone and rips out its Oracle Spine
Open source? In the government? Ha ha! What, wait ...?
Google extends app refund window to two hours
You now have 120 minutes to finish that game instead of 15
Intel: Hey, enterprises, drop everything and DO HADOOP
Big Data analytics projected to run on more servers than any other app
prev story

Whitepapers

Providing a secure and efficient Helpdesk
A single remote control platform for user support is be key to providing an efficient helpdesk. Retain full control over the way in which screen and keystroke data is transmitted.
Saudi Petroleum chooses Tegile storage solution
A storage solution that addresses company growth and performance for business-critical applications of caseware archive and search along with other key operational systems.
Security and trust: The backbone of doing business over the internet
Explores the current state of website security and the contributions Symantec is making to help organizations protect critical data and build trust with customers.
Reg Reader Research: SaaS based Email and Office Productivity Tools
Read this Reg reader report which provides advice and guidance for SMBs towards the use of SaaS based email and Office productivity tools.
Security for virtualized datacentres
Legacy security solutions are inefficient due to the architectural differences between physical and virtual environments.