100% de couverture de test avec ASP.Net

Dans ma quête de la couverture de test absolue, j’ai décider de tester mon application ASP.Net avec des tests fonctionnels.
Pour cela, j’utilise le combo: Specflow+Selenium.

En terme de rédaction du test, cela donne ça:

Feature: Test with ASP.net
	In order to get test coverage of my ASP.Net Application
	As a developper
	I want to run an embeded ASP.Net server in my NUnit test

@selenium
Scenario: Say Hello to Michel
	Given I'm on the default page
	When I enter the name "Michel"
	And I click the "SayHello" button
	Then the message is "Hello Michel"

Grâce à Specflow, je peux donc rédiger mon scénario en anglais, très lisible par l’utilisateur qui va pouvoir ainsi exprimer son besoin.
Ces phrases sont ensuite couplées à des méthodes C# qui effectuent une partie du test. Exemple:

[When("I click the \"SayHello\" button")]
public void IClickTheSayHelloButton()
{
    selenium.Click("SayHelloButton");
    selenium.WaitForPageToLoad((1 * 60 * 1000).ToString());
}

On remarque ici que j’utilise Selenium pour simuler le scénario et effectuer un click sur un bouton de la page.

Petite astuce: le scénario est "tagué" @selenium. Grâce à ce tag, je peux indiquer qu’il faut initialiser Selenium à chaque début de scénario tagué ainsi.

[BeforeScenario("selenium")]
public void BeforeScenario()
{
    var firefoxPath = Path.GetFullPath(
        Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\Libs\Firefox\firefox.exe"));
    var selenium = new DefaultSelenium("localhost",
                                       4444,
                                       @"*firefox " + firefoxPath,
                                       "http://localhost:8123");
    ScenarioContext.Current["selenium"] = selenium;
    selenium.Start();
}

OK, je suis content avec ça, je peux maintenant rédiger des tests fonctionnels lisibles et les automatiser à l’aide de Selenium.
Mais cela ne me donne pas la couverture du code de mon application .Net qui se trouve hébergée sur un serveur IIS :(

Afin d’avoir la couverture du code de toute l’application, j’ai alors décider d’exécuter l’application ASP.Net à l’intérieur du processus du test unitaire!
Afin d’héberger l’application ASP.net, j’utilise pour cela la librairie de Mono: XSP.
Pour cela, quelques lignes de codes suffisent:

[BeforeTestRun]
public static void BeforeTestRun()
{
    const int port = 8123;
    string path = Path.GetFullPath(@"..\..\..\MyApp.Web");
    const string webServerFileName = "Mono.WebServer2.dll";

    string sourcePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, webServerFileName);
    string destinationPath = Path.Combine(Path.Combine(path, "bin"), webServerFileName);

    File.Copy(sourcePath, destinationPath, true);

    var websource = new XSPWebSource(IPAddress.Any, port);
    webAppServer = new ApplicationServer(websource);
    webAppServer.AddApplication("localhost", port, "/", path);
    webAppServer.Start(true);
}

[AfterTestRun]
public static void AfterTestRun()
{
    webAppServer.Stop();
}

Simple non?

Voila alors le résultat:

Afin de pouvoir tester par vous même, vous pouvez télécharger les sources depuis http://bitbucket.org/grozeille/testwithaspdotnet/src/, lancer le serveur Selenium à l’aide de "SeleniumServer.bat", lancer les tests avec "Test.bat", et voir le rapport de couverture de code avec Libs\PartCover .NET 2\PartCover.Browser.exe en ouvrant le fichier Coverage.Xml.
Ça, ça rox du poney!

Spring.Net, ASP.Net, Session et multithreadind

Pour commencer, je vous préviens, ce billet s’adresse à ceux qui savent développer en ASP.Net.
Je ne plaisante pas! J’ai vu un trop grand nombre de gens prétendre savoir faire des applications Web sans savoir m’expliquer le protocole HTTP!
Donc voici un petit test d’entré:

  • Comment fonctionne un HttpHandler?
  • Pourquoi ne pas utiliser les UpdatePanels?
  • A quoi sert un MembershipProvider et comment s’en servir?

Si ces questions vous paressent obscures et que vous êtes plutôt un développeur “glisser-déposer”, alors je vous propose de vous “glisser-déposer” sur un autre blog ;)

Pour les autres, j’ai un aveu à vous faire: je viens de découvrir qu’il n’est pas possible d’afficher 2 pages ASP.Net en simultané si elles accèdent à la Session.

Lire la suite

Episode Bonus: Microsoft m’a entendu? ou pas.

J’interromps mes épisodes car la news est quand même de taille: Microsoft lance WebMatrix

J’avais dit qu’il manquait un équivalent à EasyPhp pour .Net, et on m’a fait remarqué d’un "IIS Express" pointait le bout de son nez…
WebMatrix est donc un gros Setup qui t’installe sur ta machine un IIS Express, un base de donnée Express, et un IDE Express (et d’autres trucs Express).

Je n’ai pas encore eu le temps de tester tout ça, mais on voit déjà la grosse machine commerciale!
Le site Web est très bien fait, avec plein de mots à la mode: D.R.Y, MVC, TDD, une petite screenshot de NerdDinner, tout pour plaire :)

Il y a un gros effort sur l’aspect "Communauté", on peut facilement installer une application Web, .Net/PHP/autres, en quelques clicks.
A noter aussi le gros effort sur la documentation, tutoriel et compagnie,  pour que tout le monde puisse "faire du Microsoft rapidement".

J’ai l’air de ne pas aimé? Ça se voit?

Bon, premièrement, je suis sous Ubuntu à cet instant précis ou je vous écris.
Ensuite, les vidéos Silverlight ne fonctionnent pas: Moonlight crash sous Google Chrome, et sous Firefox la vidéo ne se lance pas.
Enfin, si vous faite joue joue avec WebMatrix, vous allez vouloir déployer ça quelque part…
Ça tombe bien, Microsoft recommande pleins de "Hosting partner" avec du Windows Server 2008 R2… et du SQLServer bien sûr.

Revenons à EasyPHP.
Avec EasyPHP, vous avez un vrai Apache (pas une version Express) avec un vrai MySQL (pas une version Express).
Il existe aussi bien sûr des "EasyPHP like" avec du PostgreSQL, tout est possible.
Vous pouvez ensuite héberger cela sur du Windows si vous voulez… ou du Linux.

Bon, c’est vrai, EasyPHP n’installe pas un IDE, il va falloir en trouver un gratuit.
Ca doit être plutôt rareun IDE gratuit, d’après ce que l’on voit sur le site de WebMatrix:
Je cite: "Cerise sur le gâteau, c’est entièrement gratuit."

Allez, parce-que je suis gentil, voici 3 IDE PHP gratuit:

Le gros + de WebMatrix, c’est quand même de pouvoir télécharger n’importe quel application Web (ASP.Net et PHP) en quelques clicks. La, j’avoue, rien à dire.

Je vous laisse maintenant apprécier  la grandeur commerciale de Microsoft, je pense qu’ils vont réussir leur coup avec WebMatrix.

Timeout WCF au bout d’un certain nombre d’appels

Rien de plus stressant que de passer une journée entière sur un bug. Surtout si on n’a aucune idée du problème (pas d’exceptions, ni d’erreurs dans les logs) et que les recherches sur Internet sont infructueuses.
Contexte : une application Web Asp.Net communique avec un service WCF.
Problème : au bout d’un certain nombre d’appels (invariant) l’application Web n’arrive plus à joindre le serveur (Timeout).

Lire la suite

Suivre

Recevez les nouvelles publications par mail.