This is a short and quick tutorial to get you started on Fitnesse and I will list down the steps below.

The tutorials on Fitnesse.org should do the trick,

Prerequisites: Why Fitnesse is used(if you are here, I am guessing, you already know this, and you want to get your hands dirty :) )

Code repository: https://github.com/anirbanchowdhury/anirbans_playspace.git

1. Fitness is available at http://fitnesse.org/FitNesseDownload/ . Download and setup

Upon successful setup, you should see the customary http://localhost/FitNesse.UserGuide.TwoMinuteExample (Your port might differ, I am using the default 80)

2. Once, you are at the 2 minute example, an easy way to test your setup would be to edit and add a sample test case, for eg. denominator is 1. The below pic is a before pic, and if you notice, there is no denominator with 1 and no Edit button.

Lets edit this wiki page, and add numerator = 10, denominator = 1, and quotient ? = 10

http://localhost/FitNesse.UserGuide.TwoMinuteExample?edit

Search for the table below and add the last row.

| eg.Division | | numerator | denominator | quotient? | | 10 | 2 | 5.0 | | 12.6 | 3 | 4.2 | | 22 | 7 | ~=3.14 | | 9 | 3 | <5 | | 11 | 2 | 4<_<6 | | 100 | 4 | 33 | | 10 | 1 | 10 |

Save and Test. The last assertion should fail, which is expected..

3. Now, lets customize. Lets put up

- New test page
- Add Fixture which sits between System Under Test(SUT)
- Create a very simple biz logic class which mimics the SUT)

4. Test Page

Edit http://localhost/FitNesse.UserGuide.TwoMinuteExample?edit

and add next line at the end and save the page.

>SampleExample

Once you save the page, click on the [?] which should open up a new test page. Edit it. Replace everything with below:

!define TEST_SYSTEM {slim} !path D:\workspace\FitnesseBusinessApplication\bin |import| |com.fitnesse.fixture| !define COLLAPSE_SETUP {true} !define COLLAPSE_TEARDOWN {true} !|Division Program | |Numerator|Denominator|quotient?| | 10 | 2 | 5.0 | | 12.6 | 3 | 4.2 | | 22 | 7 | ~=3.14 | | 9 | 3 | <5 | | 11 | 2 | <6 | | 10 | 1 | 10.0 |

From here onwards, it is a Java implementation, and the below steps should be customized for your end system (.Net etc)

Everything below is coded on Eclipse and finally the class files are generated under :

D:\workspace\FitnesseBusinessApplication\bin

5. SUT (Business Logic)

package com.biz.calculator; public class Calculator { private float numerator; private float denominator; private float quotient; public Calculator(float numerator, float denominator) { super(); this.numerator = numerator; this.denominator = denominator; } public float getNumerator() { return numerator; } public void setNumerator(float numerator) { this.numerator = numerator; } public float getDenominator() { return denominator; } public void setDenominator(float denominator) { this.denominator = denominator; } public float getQuotient() { return numerator/denominator; } }

6. Fixture class which communicates between the SUT and the Fitnesse HTML.

(Actually, this is compiled to D:\workspace\FitnesseBusinessApplication\bin which is present under !path on the Fitnesse page)

package com.fitnesse.fixture; import com.biz.calculator.Calculator; public class DivisionProgram { private float numerator; private float denominator; private float quotient; public void setNumerator(float numerator) { this.numerator = numerator; } public void setDenominator(float denominator) { this.denominator = denominator; } public float quotient() { Calculator calculator = new Calculator(numerator, denominator); this.quotient = calculator.getQuotient(); return this.quotient; } }

**Few common problems:
**

a. Could not invoke constructor for DivisionProgram[0]

This means, Fitnesse is not able to resolve the Fixtures class, check the below settings on your Fitnesse page

Division Program should point to DivisionProgram class in fixture.

!path D:\workspace\FitnesseBusinessApplication\bin |import| |com.fitnesse.fixture| !|Division Program |

b. Method Quotient[0] not found in com.fitnesse.fixture.DivisionProgram.

This will not come if you follow the instructions properly, but if you customize, then this might happen. Basically, Quotient? searches for a getter named Quotient() on the Fixture, but if you check again, you have a getter method named quotient() [Case sensitive]