"BDD uses Context/Specification test style in its TDD practice to arrive at smaller, simpler, and more focused test groupings that more readily document the system. Context/Specification tests focus on how the system and its modules and units behave in specific usage contexts rather than on how individual classes and methods have been implemented.Nedan har jag använt MSpec för att skriva tre specifikationer för bloggen, specifikationerna är mest för att känna på MSpec-syntaxen.
The contextual perspective more naturally reflects the system’s user stories, and often leads to a more fluent understanding of the customer’s expectations of the system. Contextual specification helps keep developers focused on the desired user experience, and produces test code that is more navigable, more discoverable, and generally more understandable-which is itself a boon to agility, raising productivity and quality to a yet higher level." (http://www.code-magazine.com/Article.aspx?quickid=0805061)
Det är lite struligt att komma igång med MSpec (den nyaste syntaxen), mer om detta längst ner.
Det jag skall specificera är att startsidan på bloggen skall ha en länk för rss-feed och en länk för atom-feed. Jag skall även speca att man kan söka på ett visst ämne. Koden ser lite knepig ut innan man kommer in i det hela:
using Machine.Specifications;
using WatiN.Core;
namespace Blog.Specs
{
[Subject("Start page")]
public class when_viewing_start_page : open_blog_with_ie_context
{
Establish context = () =>
{
ie = new IE("http://andersjonsson.blogspot.com/");
};
It should_have_a_link_to_the_rss_feed = () =>
{
ie.Links.ShouldHaveALinkWithUrl(@"/feeds/posts/default?alt=rss");
};
It should_have_a_link_to_the_atom_feed = () =>
{
ie.Links.ShouldHaveALinkWithUrl(@"/feeds/posts/default");
};
Cleanup close_ie = () =>
{
ie.Dispose();
};
}
public class open_blog_with_ie_context
{
Establish context = () =>
{
Settings.MakeNewIeInstanceVisible = false;
};
public static IE ie = null;
}
}
using Machine.Specifications;
using WatiN.Core;
namespace Blog.Specs
{
[Subject("Search")]
public class when_searching_for_a_specific_topic : open_blog_with_ie_context
{
Establish context = () =>
{
ie = new IE("http://andersjonsson.blogspot.com/");
};
Because of = () =>
{
Frame frameWithSearchBox = ie.Frame("navbar-iframe");
frameWithSearchBox.TextField(Find.ById("b-query")).Value = "WatiN";
frameWithSearchBox.Div("b-search-this").Click();
};
It should_retrieve_posts_with_specified_topic = () =>
{
ie.ContainsText("Visar inlägg för frågan WatiN").ShouldBeTrue();
};
Cleanup close_ie = () =>
{
ie.Dispose();
};
}
}
Kör dessa via TestDriven.Net

Av specifikationerna skapar man en rapport (html) som säger:
Blog.Specs
---------------------------------------------
Start page specifications
when viewing start page
* should have a link to the rss feed
* should have a link to the atom feed
---------------------------------------------
Search specifications
when searching for a specific topic
* should retrieve posts with specified topic

Nyckelbegreppen som används är:
- Subject
- Establish
- Because
- It
Det är med dessa jag sätter upp vad som skall specificeras och hur, samtidigt som att dessa defineras på ett visst sätt och därigenom kan konverteras till html-rapporter. Läs mer om begreppen på MSpec.
Det som strulade initialt var att de dll som fanns på MSpecs hemsida inte fungerade med den nyare syntaxen (som jag såg på Scotts demo). Sedan fungerade inte bat-scriptet för att få igång TestDrive.Net-runnern samt att det inte gick att köra nyaste versonen av NUnit. Detta löste jag genom att:
1. Hämta den senaste koden från http://github.com/machine/machine.specifications/
2. Ändra så att en nyare NUnit version användes i projektet Machine.Specifications.NUnit.
3. Bygga allt
4. Ändra InstallTDNetRunner.bat så att den lägger in nyckeln i "HKEY_LOCAL_MACHINE"
Vill ni slippa göra detta så är det bara att ladda hem projektet:
0 comments:
Post a Comment