Behaviour-driven development (BDD) frameworks

Behaviour-driven development (BDD) is an agile development technique, and is a subtle reworking of test-driven development (TDD). Learning about it finally made the concept of TDD "click" for me. People often use the term "test-infected" or "bitten by the testing bug" to describe the feeling that comes from appreciating the power of BDD/TDD, and I'd certainly say that I'm a "sufferer".

The purpose of this post is to compile a list of BDD and TDD frameworks that I've come across, covering several different programming languages. I hope to write up some simple examples of using a few of the frameworks at a later date.

I've heard it said that if you're doing TDD right, then you're already practising BDD, and this made a lot of sense once I understood the reasoning behind BDD. I'll leave further explanation of the differences to the experts.

Without further ado, here's the list:

PHP

  • PHPSpec, a fledgling BDD framework for PHP5.2+. The manual is well-organised, and gives a good overview of writing BDD specifications. Its development seems to have stalled at present, unfortunately.
  • Marcus Baker's SimpleTest (TDD). This is the framework for PHP that I have most experience with, and it seems to be the most popular at present. It has a plethora of features, including strong support for mock objects. The manual gives a good overview of the major features.
  • PHPUnit (TDD). I have no experience with this one, but it's one of the most established PHP testing frameworks, and it still seems to be popular. Like SimpleTest, it has plenty of features, and the manual appears to be very thorough.

JavaScript

C

  • Cgreen (TDD), which is by the same author as SimpleTest. It has a five-minute example of test-driven development with the framework. It was heavily influenced by...
  • The Check framework (TDD), which has a fairly friendly manual. I know even less about this one than Cgreen, sadly.

Both of these projects seem to have been dormant since 2006. The Check manual lists a number of similar projects, but I've not even glanced at those, as I'm still a C newbie.

Python

  • PySpec is the only BDD Python framework I could find, and while it appears to have a good amount of features, development is slow. It has a decent one-page usage guide, a reasonable tutorial, and a code reference with examples.
  • Doctests. I absolutely love these little things. The Python manual section on them is pretty comprehensive. They have a very low barrier to entry, and virtually no learning curve. The advanced features of independent testing frameworks aren't present, however.
  • nose (TDD), as I understand it, wraps Python's included unittest module to provide an interface similar to py.test, which I have no experience with. nose has a mini-manual on its homepage, and a wiki on its Google Code project site.

Ruby

  • RSpec. I don't really do Ruby (yet), but judging by what I've seen of RSpec, I seriously doubt whether anything else is even worth considering. The Rubyists really seem to get BDD.

STOP PRESS: Microsoft to make IE8 standards-compliant by default!

I'm stunned. This is not what I expected. Some sort of concession, maybe, but nothing like this. Way to go, Microsoft!*

From the IEBlog post:

We’ve decided that IE8 will, by default, interpret web content in the most standards compliant way it can.

I personally consider this fantastic news. I was broadly opposed to the version targeting idea as presented, i.e. that it would be an "opt-in" system, but had largely resigned myself to either ignoring it, or suffering it if I deemed the new CSS/JavaScript shinies in IE8 worth the effort.

Any site needing IE8 to render in IE7 mode (for whatever reason) need only apply a one-line fix: the meta version targeting method originally proposed to work the other way around (or the HTTP header equivalent).

In summary, this is the good news, as I see it:

  • Developers need do nothing beyond using current standards to get the best standards-compliance from IE8.
  • The change should encourage developers to adhere more strictly to existing standards, particularly if doing so enables more advanced CSS and JavaScript capabilities in IE8.

This should also mean that IE8 will automatically pass the Acid2 test, rather than requiring a nudge to do so. From the Microsoft press release:

IE8 has been significantly enhanced, and was designed with great support for current Internet standards. This is evidenced by the fact that even in its first beta, IE8 correctly renders the popular test known as 'Acid2', which was created by the Web community to promote real-world interoperability [...] Our initial plan had been to use IE7-compatible behavior as the default setting for IE8, to minimize potential impact on the world's existing Web sites. We have now decided to make our most current standards-based mode the default in IE8.

And this is the potentially bad:

  • Anyone requiring, for some reason, IE8 to behave as IE7 will need to add the meta switch or the HTTP header to their code.
  • More inconvenience in the short term for anyone supporting legacy documents.

I'm very impressed by Microsoft's move, and hope that it doesn't somehow get overruled or watered-down before IE8 is released.

(*I can honestly say that I never thought I'd write that - "never say 'never'", I guess!)

Fixing <abbr> in IE with one line of JavaScript

One positive side-effect of the recent sugarstorm surrounding the announcement that IE8 will, as things stand, require developers to opt in to its new standards mode is this comment by Sjoerd Visscher, which I read several days ago but have been too preoccupied to post about until now. The (in)famous Ian Hickson referred to Sjoerd's revelation as "...probably the most noteworthy news of the day."

As soon as I saw Sjoerd's comment, I realised that the quirk could potentially provide a cruft-free and extremely simple, albeit JavaScript-dependent, solution to Internet Explorer's (pre-IE7) refusal to acknowledge the abbr element. One could of course use Dean Edwards' impressive IE7 library to haul IE into line regarding abbr and a great many other things, but I've always considered it overkill, and prefer to patch IE on a case-by-case basis. My preferred way to fix abbr in IE (with conditional comments):

<!--[if lt IE 7]>
<script type="text/javascript">document.createElement('abbr');</script>
<![endif]-->

Put that in your document's head section, et voilà, IE6 and IE5.5 now respect CSS styles for abbrs. The fix even makes IE display the title attribute tooltip on hover. Unfortunately, it seems not to work in IE5.01 - I can live with that limitation. The conditional comments should be optional, as I don't believe that the JavaScript would have any ill effect in other browsers (provided that they support document.createElement). It could also replace an existing script-based FOUC fix that developers may have employed.

Apparently, few people seem to have known about this fascinating IE quirk before, and as of the time I wrote this, I'd not seen anyone else mention its potential application to IE's abbr problem. I'm certain it's occurred to many people by now, but I'm noting it here explicitly because - quite honestly - it amuses me more than it should that such an annoying bug can be fixed in such a simple way. It also has interesting implications for "encouraging" IE to recognise new elements in HTML5.

Happy coding. :-)

 1

About

I'm a web developer with a passion for standards, and a strong belief in quality-over-quantity and using the right tool for the job.

User