Things I Have Actually Used

Monday, March 31st, 2008

Robby Russell is a constant source of information on Ruby and Rails, I have used his instruction on how to set up Rails and PostgreSQL on Mac a number of times. It is therefore fun to see that I have actually used 3 out of the 5 things he wants to know more about::

RSpec User Stories

We were very early adopters of this one, we started using it the same day it hit trunk in a useable form. Everyone should start using it today - I cannot speak highly enough of it. The only thing I miss is a Fit-style table approach to rules, but I have my own thoughts about that one.

Using Selenium with RSpec

We have used the now outdated spec/ui library at WeMind. Today we use RSpec Stories almost exclusively for acceptance testing. My position is to use Selenium only where you really need it, for example to test Javascript functionality.

JQuery

I have used it for the dynamic hiding of speaker info for Agila Sverige. Not at all enough to judge a library by, but it feels a lot sweeter than Prototype/RJS.

JSSpec (BDD for Javascript)

Yeah, I wanna know more about this as well.

Using the Google Charts API with Rails

Same here.

Other than that I would love to try out:

  • Seaside - I have dabbled with it but nothing worth mentioning.
  • CouchDB

RSpec 1.1 is out!

Friday, December 14th, 2007

RSpec 1.1: “The RSpec Development Team is pleased as glug (that’s kind of like punch, but more festive) to announce RSpec-1.1.0.”

Woohoo! We’ve used RSpec since the 0.7-ies and I personally could not be happier with it. The RSpec community is really pushing the boundaries for testing/speccing frameworks and is now the standard for all others to follow.

(Via David Chelimsky)

Smidig2007

Thursday, November 29th, 2007

I came back last night after two great days of conferencing at Smidig2007 in Oslo, Norway. The mornings where all lightning talks and the afternoons where reserved for open space discussions. I gave a lighnting talk on the experiences we have had at WeMind trying to implement a lean enterprise, and I initiated two open space sessions, one on the GUI artists role in an agile process and the other on what makes different languages have so different communities and cultures. I will expand on those in later posts.

During the two days I had the pleasure of hooking up with Niclas Nilsson, Aslak Hellesøy and a bunch og other great people. It was very stimulating discussions and I am really motivated into doing a few new things with our own testing/speccing.

It was all in norwegian, so all you non-scandinavian speakers out there are really missing out on something - finally a reason to take that class in swedish or norwegian you always thought about.

Photos and a few deeper comments are due later, but for now: a big thanks to my norwegian friends for a great time.

Fit is a Requirements Tool, Not a Testing Tool

Thursday, October 5th, 2006

Mike Ratliff did a very good presentation on Fit/Fitnesse at Valtech Days. While praising the effects it can have on a development project, he also highlighted some of its quirks such as the ones I’ve complained about earlier.

The main point he made in my mind was when he said that Fit is not a testing tool but a requirements tool. It does not replace your regular acceptance testing tools. According to Mike, the main advantage Fitnesse brings is an increased, and executable, dialogue between customers and developers, and the possibility for customers to work with the spec in a “what if” manner.

I have been going over that thought for two days now and I think I really like it. And it makes me revalue Fitnesse, I definitely see the value of customers being able to work with the tests dynamically. I might just end up writing a blog post these days titled “Why I like Fit” :).

Cedric Still Doesn’t Get Agile

Friday, June 9th, 2006

Update: Martin Fowler pointed to . It seems Cedric did not give us the full picture. I have edited my post accordingly

After attending a less than stellar presentation on TDD, Cedric Beust confuses TDD with “Agile” and goes on to tell the world that agile is not good. Let’s have a look, shall we?

First of all, tests are not specs.  Not even close.  Somebody in the audience was quick to give a counter-example to this absurd claim by using a numeric example (’how do you specify an exponentiation function with a test?’)

I would not use unit tests for specs. Automatic acceptance tests on the other hand is really nice if you have a customer/product owner that will work with you. Now Cedric has previously stated that he does not really care for the labelling of tests (“However, when I write a test, I don’t really care if it’s a unit test or a functional test”) so that of course makes it harder for him.

And hey, testing an exponentiation function? How about providing test data with given parameters and answers? It would be a prime candidate for a FIT-test by the way.

Relying on tests as a design specification is lazy and unprofessional because you are only testing a very small portion of the solution space of your application (and of course, your tests can have bugs). 

Why would you only test “a very small portion of the solution space of your application”?

Tests also fall extremely short of having the expressiveness needed to articulate the subtle shades that a real specification need to cover to be effective.

This is my main gripe with Cedrics rant. He seems to be completely oblivious to the great emphasis on customer interaction that agile methods make, which promotes a two way dialogue.

A specification written in a document is a one way communication. Even in high school psychology I learned how much more information was conveyed in a spoken dialogue than in writing.

This claim is part of a broader and more disturbing general Agilist attitude that is usually articulated like ‘Your code is your spec’, along with some of its ridiculous corollaries such as ‘Documentation gets out of date, code never does’.

What is so ridiculous with the last statement? I have never been involved in a large scale project where the documentation did not get out date.

As for the code being your spec: when you have code and documentation, and the latter does not correctly describe the former, it is out of date, which will you trust? And what do you read to know what the real world looks like? Map, meet terrain.

I am currently getting acquainted with a brand new project that is not even very big, and while I understand Java fairly well, there is no doubt in my mind that for ten minutes I spend trying to understand how a certain part of the application works, a five-line comment would have given me this knowledge in ten seconds.

Sure, if it is up to date, which you will have to read the code to find out. My general rule: if you feel the need, comment on why the code does what it does if it is not obvious. If you feel the need to comment on what the code does, the code is not clear enough. Refactor until done.

Very often, Agilists simply forget that their job is to produce software that satisfies customers, not software that meets some golden software engineering scale.

Again, this is simply ridiculous - all agile methods try to get customers as close as possible to produce just what they want. Anyone even remotely knowledgeable with agile methods knows that.

Frankly, it takes all of ten minutes to explain Test-Driven Development to a developer who’s never heard of it:  ‘Write a test that fails and doesn’t compile.  Make it compile.  Then make it pass.  Repeat’.

I actually find it quite hard to get developers to grasp TDD; people find testing something that does not exist confusing. This is of course the basis for behavior driven development, but let’s just be happy for Cedric now.

Some might find it picky, but leaving out ‘refactor’ in the TDD loop tells me that you somehow has not grasped the concept completely. But then Cedric might throw in a comment instead :).

‘What should we test now?’

‘How about:  if we pop an empty stack, we get an exception’

‘Mmh, no, let’s not do that’

This is quite easy to test, so I do not see why he could not add it. Read Jeffs answer

 
Stack s = new Stack();
try {
  s.pop();
  fail("Should not get here");
}
catch (Exception e){
  //Ignore
}
 

But I am dead sure Cedric knows this , too bad the presenter did not.

To be honest, I am becoming quite suspicious of Agile practices for that reason:  all the presentations I have attended and books that I have read are always using toy implementations as examples.  Stack, List, Money, Bowling…  enough already!

Ignoring the fact that Cedric again confuses TDD and agile, he does have a point. Too many TDD presentations uses examples that are way too simplistic. They should point out the need of a modular architecture, and the fact that using TDD actually helps you get a clean, high cohesion - low coupling architecture.

And please, avoid smug and useless answers such as:

‘A lot of the classes I have to test are hard to isolate, do you have any advice regarding mocks?’

‘Well, if you had started with TDD in the first place, you wouldn’t be having this problem today’.

It is certainly not a helpful answer, but it is true nonetheless.

Fundamentally, I am disturbed by the Agilists’ dishonesty when it comes to presenting their arguments.  They offer you all these nice ideas such as Test-Driven Development and Pair Programming but they never — ever — disclose the risks and the downsides.  To them, Agility is a silver bullet that is applicable in all cases with no compromises.

Just to give one example, “Practices of an Agile Programmer” clearly states that agile is not for everyone.

The truth is that these practices come at a price, and for a lot of organizations, the price gets high very quickly.  Agile development will never go far if its proponents keep ignoring these organizations and make condescending comments to its members.

Here Cedric is spot on. Yay!

I like Test-Driven Development.  I really do, and I’m fortunate enough to work on a project that lets me use TDD most of the time.  But the truth is:  at times, I don’t do TDD because implementing a feature quickly is more important than a fuzzy feeling.  And I’m also aware that TestNG is an open source project with less than five developers, all of them on the bleeding edge and aware of the latest advances in software engineering.

And this is my main beef with Agilists:  I strongly suspect that most of them are spending their time on open source projects with like-minded fellows, but none of them have any experience what companies whose survival depends on shipping software have to go through to organize huge code bases growing thousands of lines of code every day under the combined push of hundreds of a developers, all with their personal background, education and bias.

My main beef with people opposing agility is that they basically say that too many of the developers out there are morons who cannot perform unless closely supervised and given clear instructions, and that there is no hope that that will ever change. It is a weird combination of pessimism and elitism

Now Cedric has a history of not liking agile methods, and that is fine with me. Whatever makes him happy. But his retoric in this case is like watching somebody who does not know karate perform a round house kick - lots of power and effort but misses the target completely.

Ruby on Rails on Ubuntu

Thursday, April 14th, 2005

I feel I just have to try Ruby on Rails, I mean everybody else is doing it and I don’t want to feel left out.

So I started setting it up on my X40 which runs Ubuntu. There is still no deb available for it, you have to use the Ruby Gems system to set it up. I dont know if this is good or bad - it seems like a Ruby CPAN and my feelings towards Perls CPAN are mixed. I once ended up with two Perls on a Red Hat box when using it to set up Request Tracker. Let’s hope Gems works better.

To start out I had to apt-get rdoc and libzlib-ruby. After that it is installed. Whohoo. What now?

Ok rails ~/work/rortest … Bang. Some dependency is missing. Let’s search Synaptic to see what could possibly make it tick.

libwebrick maybe? Nope.
libmysql-ruby? Nope.
eruby? No.
libdbi-mysql. Noo.
libwhatever-ruby. Nothing works.

Maybe there’s some info on their site? Hmm … there are instructions on how to install it on Debian unstable which involves apt-getting the all ruby libraries known to man - but who cares - let’s try that.

Whohoo! It works. Let’s see some of the Ruby love in the browser then - it is indeed there.

Ok. Now for the database tweaking. Why three databases? I guess I’l find out.

Yaml is really, really nice.

Ok, according to the site, all I have left is to develop my Rails application, so I guess that is what I will do. Wish me luck.

Update: There are now instructions for how to set up Rails on Ubuntu.

Fit Testing - how to translate it to Swedish?

Friday, April 8th, 2005

I’m spending some time getting into Fit style acceptance testing and I’m liking what I see. My biggest problem so far is translation.

For all you non-Swedish-speaking out there, most techie lingo gets a very crude translation, basically by not translating it at all and using the english word as is. So a unit test in english is also a unit test in swedish.

But I’ve bit my tongue at least 10 times today saying “Fit tests” in swedish. Basically by not translating it I’m saying what I believe is considered the dirtiest word in the swedish langauge.

Any ideas for translations, swedish people out there?

Testing mo:Blog

Saturday, February 19th, 2005

I’m in the subway on my way to my moms boyfriends daughters birthday party, using the time to test blogging from my Palm. Seems to work quite decently actually.

Testing BloGTK

Wednesday, February 9th, 2005

Testing to blog from BloGTK. I’m not sure that I really see the point of this. It maybe good for off line use, but then I’d probably use JEdit and save it as a .txt file anyway. Oh well.

Unit Testing Performance

Tuesday, January 13th, 2004

Yesterday we discovered a small but annoying performance bug: when getting a list of languages from the JVM we did not cache them but kept on retrieving them, which turned out to be quite slow.

So, like the good guys we are we wanted to have a test that ensured that the error was not reintroduced. We looked at JUnitPerf which seemed to be appropriate - it decorates a unit test and times it. The only problem here was that we were talking about that good performance was 800 ms, and bad performance was 1800 ms. Such timings can randomly fail on a slower computer or a computer that was busy doing something else. We do not like that kind of tests.

So instead my colleague Jimmy came up with a much better idea: Make the test a Runnable, and run it a large number of times. In our case the good performance was 800 ms the first time and virtually nothing after, but the initial bad performance was 1800 ms every time. Then we set the timeout to 5 seconds, giving enough slack for slow, bogged down test machines, but still catching the bug if reintroduced. Good stuff indeedy.

Functional Testing Revisited

Friday, November 14th, 2003

We have got our functional testsuite working. It currently consists of more than 260 tests doing everything from the simple login to running recorded WebDAV tests and restarting Websphere etc.

We’ve done it in the way that Testing Extreme Programming prescribes, with collection of methods that are implemented both remotely and locally, running the servlets in-process. The methods are pretty high-level for a very high degree of usability.

We’ve used HtmlUnit as the basis of our tests, extending it in the high-level methods. It is a great package as it tests the JavaScript too, as opposed to recorded tests that only tests the servers response to a given HTTP request.

Functional Test Updated

Thursday, September 25th, 2003

After evaluating the previous named contenders for webtest tools, the winner was … none of them.

It dawned upon us that the MaxQ way of doing this, ie. recording tests, really is not the way to go, ever. What you’re really doing is testing the server from a HTTP perspective, without testing button clicking and stuff. For example, all hidden fields must be specified at every request. If you have anything Javascript based you still have no clue if this works after having these funtional tests.

On the other hand, using anything based on HttpUnit actually mimics a webbrowser, so you can click buttons and not have to worry about hidden fields. And yes, Javascript is handled.

jWebUnit is based on HttpUnit, but it has a rather limited API, for example you cannot find a button by its name to click it. We came to the conclusion that it was easier to build our own API on top of HttpUnit.

We also decided to implement the same API in a mock implementation ? la the way it is described in “Testing XP”. This way functional tests can be run very quickly on development machines and the more time consuming remote HTTP tests are done on the integration machines (Yes, we have several, one for every deployment OS).

Functional testing

Monday, September 8th, 2003

We are currently in the process of improving our functional testsuite, some might say getting one. I’ve skimmed the JUnit site and have found two alternatives:

  • jWebUnit. It has a really clear and simple syntax which is why I prefer it over HtmlUnit which I prefer over HttpUnit.
  • MaxQ. Recorded Jython scripts.

I am not really sure what to make of it. The functional test suite must run separately from the rest of the system, which makes it a good candidate for a scripted language. However, being able to use IDEA is always better than any alternative. I am not sure either if recording is a good or bad thing.

I am leaning towards jWebUnit. You could then easily use JUnitPerf for basic load testing.