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]