Presentation is loading. Please wait.

Presentation is loading. Please wait.

FitNesse.NET tips and tricks Gojko Adzic

Similar presentations


Presentation on theme: "FitNesse.NET tips and tricks Gojko Adzic"— Presentation transcript:

1 FitNesse.NET tips and tricks Gojko Adzic http://gojko.net gojko@gojko.com http://twitter.com/gojkoazic

2 FitNesse.NET allows you to save lots of time by writing fixture code efficiently and by not writing fixture code when you don’t really need it.

3 Simple Sample Domain

4 Example: define + list links Define Links NameUrl Googlehttp://www.google.com Yahoohttp://www.yahoo.com List Links NameUrl Googlehttp://www.google.com Yahoohttp://www.yahoo.com

5 Automatic collection wrapping Instead of creating your own row/array fixtures, use a flow fixture and just return an array out from a method - it gets mapped to array fixture Works in do/sequence flow mode Works on IEnumerable

6 Automatic collection wrapping public class FlowCollections: DoFixture { private ILinkRepository repo = new MemoryLinkRepository(); public Fixture DefineLinks() { return new LinkSetupFixture(repo); } public IEnumerable ListLinks() { return repo.FindAll(); }

7 System under test If the call does not map to anything in the fixture, flow fixtures check a “system under test” Set the system under test and map domain service/repository/factory calls directly to tables Perhaps best on Sequence fixtures

8 System under test public class FlowSystemUnderTest : DoFixture { private ILinkRepository repo = new MemoryLinkRepository(); public FlowSystemUnderTest() { SetSystemUnderTest(repo); } public Fixture DefineLinks() { return new LinkSetupFixture(repo); }

9 System under test info.fitnesse.FlowSystemUnderTest Define Links NameUrl Googlehttp://www.google.com Yahoohttp://www.yahoo.com Find All NameUrl Googlehttp://www.google.com Yahoohttp://www.yahoo.com

10 With keyword Set the system under test from the test page |with|method call| |with|new|class name| |with|new|class name|constr arg1|arg2|…| Use this to switch between systems under test dynamically

11 With Keyword info.fitnesse.WithSystemUnderTest withnewinfo.fitnesse.MemoryLinkRepository Define Links NameUrl Googlehttp://www.google.com Yahoohttp://www.yahoo.com Find All NameUrl Googlehttp://www.google.com Yahoohttp://www.yahoo.com

12 With Keyword public class WithSystemUnderTest : DoFixture { public Fixture DefineLinks() { return new LinkSetupFixture((ILinkRepository) this.mySystemUnderTest); }

13 Naming SUTs |name|foo|with|… with phrase| |name|bar|with|… with phrase| |use|foo| … |use|bar|

14 Naming SUTs namegooglewithnewLinkGooglehttp://www.google.com nameyahoowithnewLinkYahoohttp://www.yahoo.com usegoogle checkvalidtrue useyahoo checkvalidtrue

15 System under test in other fixtures From recently, you can use system under test for other fixtures as well! Eg for a column fixture as a much more flexible target object! Allows you to define only test-specific methods in fixtures!

16 Column fixture SUT public class LinkValidityCheck:fit.ColumnFixture { public LinkValidityCheck() { SetSystemUnderTest(new Link()); } public String comment; }

17 Column fixture SUT Link validity check nameurlvalid?comment googlehttp://www.google.comtrueboth set, correct blankhttp://www.google.comfalsename not set googleblankfalseurl not set googlewww.google.comfalseurl not in correct format

18 Alternating system under test Switch SUT in runtime to load up other objects Use Reset() to clean up before new row This is a very efficient way to implement a subset fixture for huge data sets

19 Alternating SUT Define Links NameUrlId? Googlehttp://www.google.com>>google Yahoohttp://www.yahoo.com>>yahoo Microsofthttp://www.microsoft.com>>msft Check Links IdName?Url? <<googleGooglehttp://www.google.com

20 Alternating SUT public class LinkCheckFixture : ColumnFixture { private ILinkRepository repo; public LinkCheckFixture(ILinkRepository repo) { this.repo = repo; } public int Id { set { SetSystemUnderTest(repo.FindById(value));} }

21 Automatic domain object wrapping Don’t use a fixture – use your domain class in the table header FitNesse.NET automatically creates a DoFixture and sets the system under test to a new instance of your class

22 Cell Handlers Tell FitNesse how to interpret a set of cells –Match by cell content –Match by object type Extend AbstractCellHandler Load by using Cell Handler Loader loadSavedFixtureHandlerFitLibrary loadSavedFixtureHandlerFit

23 Example: Regex public class RegExHandler: AbstractCellHandler { public override bool Match(string searchString, System.Type type) { return searchString.StartsWith("/") && searchString.EndsWith("/") && typeof(string).Equals(type); } public override bool HandleEvaluate(Fixture fixture, Parse cell, Accessor accessor) { object actualValue=accessor.Get(fixture); if (actualValue == null) return false; Regex expected =new Regex(cell.Text.Substring(1,cell.Text.Length-2)); return expected.IsMatch(actualValue.ToString()); }

24 Regex to the rescue Named SUTs can’t be used as parameters –This isn’t possible: –|name|google|with|new|…| –|save|google| But that would be really cool! So let’s implement it using a cell handler!

25 Saved fixture handler public class SavedFixtureHandler:AbstractCellHandler { public override bool Match(string searchString, System.Type type) { return searchString.StartsWith("\"") && searchString.EndsWith("\""); } public override void HandleInput(Fixture fixture, Parse cell, Accessor accessor) { String innerText=cell.Text.Substring(1, cell.Text.Length-2); accessor.Set(fixture, ((FlowFixtureBase) fixture).NamedFixture(innerText)); }

26 We can now use it like this! namegooglewithnewLinkGooglehttp://www.google.com nameyahoowithnewLinkYahoohttp://www.yahoo.com save"google" save"yahoo" find all nameurl Googlehttp://www.google.com Yahoohttp://www.yahoo.com info.fitnesse.MemoryLinkRepository

27 Suite config files Extract all technical information into a file Keep test pages nice and tidy, easily readable Set up with !define COMMAND_PATTERN=%m –c mySuite.config %p See all options on http://syterra.com/FitnesseDotNet/SuiteConfigurationFile.html

28 Suite config files D:\work\netfit2\fixtures\fixtures\bin\debug\fixtures.dll info.fitnesse info.fitnesse.SavedFixtureHandler info.fitnesse.SavedFixtureHandler

29 Now we can do this! Memory Link Repository namegooglewithnewLinkGooglehttp://www.google.com nameyahoowithnewLinkYahoohttp://www.yahoo.com save"google" save"yahoo" find all nameurl Googlehttp://www.google.com Yahoohttp://www.yahoo.com

30 We can write tests with no fixture code! But “can” is not the same as “should”!

31 FitNesse Pages tell us “what” Fixtures tell us “how”

32 Bridging the Communication Gap learn how to improve communication between business people and software implementation teams find out how to build a shared and consistent understanding of the domain in your team learn how to apply agile acceptance testing to produce software genuinely fit for purpose discover how agile acceptance testing affects your work whether you are a programmer, business analyst or a tester learn how to build in quality into software projects from the start, rather than control it later http://www.acceptancetesting.info

33 Upcoming events Games in the cloud: March 5 th Next.NET event: March 23rd Web Tech Exchange: May 11-15

34 Where next? http://gojko.net http://www.syterra.com http://www.fitnesse.info


Download ppt "FitNesse.NET tips and tricks Gojko Adzic"

Similar presentations


Ads by Google