fitnesse net tips and tricks l.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
FitNesse.NET tips and tricks PowerPoint Presentation
Download Presentation
FitNesse.NET tips and tricks

Loading in 2 Seconds...

play fullscreen
1 / 34

FitNesse.NET tips and tricks - PowerPoint PPT Presentation


  • 348 Views
  • Uploaded on

FitNesse.NET tips and tricks. Gojko Adzic http://gojko.net gojko@gojko.com http://twitter.com/gojkoazic. 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. Simple Sample Domain.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'FitNesse.NET tips and tricks' - kristy


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
fitnesse net tips and tricks

FitNesse.NET tips and tricks

Gojko Adzic

http://gojko.net

gojko@gojko.com

http://twitter.com/gojkoazic

slide2

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.

automatic collection wrapping
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<T>
automatic collection wrapping6
Automatic collection wrapping

public class FlowCollections: DoFixture

{

private ILinkRepository repo = new MemoryLinkRepository();

public Fixture DefineLinks()

{

return new LinkSetupFixture(repo);

}

public IEnumerable<Link> ListLinks()

{

return repo.FindAll();

}

}

system under test
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
system under test8
System under test

public class FlowSystemUnderTest : DoFixture

{

private ILinkRepository repo = new MemoryLinkRepository();

public FlowSystemUnderTest()

{

SetSystemUnderTest(repo);

}

public Fixture DefineLinks()

{

return new LinkSetupFixture(repo);

}

}

with keyword
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
with keyword12
With Keyword

public class WithSystemUnderTest : DoFixture

{

public Fixture DefineLinks()

{

return newLinkSetupFixture((ILinkRepository)

this.mySystemUnderTest);

}

}

naming suts
Naming SUTs
  • |name|foo|with|… with phrase|
  • |name|bar|with|… with phrase|
  • |use|foo|
  • |use|bar|
system under test in other fixtures
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!
column fixture sut
Column fixture SUT

public class LinkValidityCheck:fit.ColumnFixture

{

public LinkValidityCheck()

{

SetSystemUnderTest(new Link());

}

public String comment;

}

alternating system under test
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
alternating sut20
Alternating SUT

public class LinkCheckFixture : ColumnFixture

{

private ILinkRepository repo;

public LinkCheckFixture(ILinkRepository repo)

{

this.repo = repo;

}

public int Id

{

set { SetSystemUnderTest(repo.FindById(value));}

}

}

automatic domain object wrapping
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
cell handlers
Cell Handlers
  • Tell FitNesse how to interpret a set of cells
    • Match by cell content
    • Match by object type
  • Extend AbstractCellHandler
  • Load by using
example regex

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());

}

}

regex to the rescue
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!
saved fixture handler
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));

}

}

suite config files
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
suite config files28
Suite config files

<suiteConfig>

<fit.Assemblies>

<add>D:\work\netfit2\fixtures\fixtures\bin\debug\fixtures.dll</add>

</fit.Assemblies>

<fit.Namespaces>

<add>info.fitnesse</add>

</fit.Namespaces>

<fit.CellHandlers>

<add>info.fitnesse.SavedFixtureHandler</add>

</fit.CellHandlers>

<fitlibrary.CellHandlers>

<add>info.fitnesse.SavedFixtureHandler</add>

</fitlibrary.CellHandlers>

</suiteConfig>

we can write tests with no fixture code

We can write tests with no fixture code!

But “can” is not the same as “should”!

fitnesse pages tell us what

FitNesse Pages tell us “what”

Fixtures tell us “how”

bridging the communication gap
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

upcoming events
Upcoming events
  • Games in the cloud: March 5th
  • Next .NET event: March 23rd
  • Web Tech Exchange: May 11-15
where next
Where next?
  • http://gojko.net
  • http://www.syterra.com
  • http://www.fitnesse.info