jeudi 22 mars 2012

JUnit 4 en 60 secondes

junit-logo.png

Comme l'actualité est calme, voici la traduction un peu enrichie d'un article d'introduction à JUnit 4 à consulter ici.

JUnit 4 apporte à JUnit la gestion des annotations pour les tests Java. Voyons-en quelques unes....

@Test

Permet de marquer vos tests. Vous n'avez alors plus besoin de préfixer vos cas de tests avec "test". De plus, votre classe n'a plus besoin d'hériter de la classe “TestCase”.

  @Test
  public void addition() {
     assertEquals(12, simpleMath.add(7, 5));
  }
  
  @Test
  public void subtraction() {
     assertEquals(9, simpleMath.substract(12, 3));
  }

@Before et @After

Utilisez respectivement les annotations @Before et @After pour les méthodes “setup” et “tearDown”. Ces méthodes sont exécutées respectivement avant et après chaque cas de test.

  @Before
  public void executerAvantChaqueTest() {
     simpleMath = new SimpleMath();
  }

Ici, on vient de préparer le "monde" du test.

  @After
  public void executerApresChaqueTest() {
     simpleMath = null;
  }

Et là, on nettoie une fois le test exécuté.



@BeforeClass et @AfterClass

Utiliser respectivement les annotations @BeforeClass et @AfterClass pour les méthodes “setup” et “tearDown” s'appliquant à la classe toute entière. Pnsez à ces méthodes comme étant à usage unique. Elles s'exécutent respectivement et une seule fois avant le premier cas de test et après le dernier cas de test.

  @BeforeClass
  public static void executeBeforeClass() {
     // s'exécute une unique fois 
     //avant le premier cas de tests
  }
  @AfterClass
  public static void executeAfterClass() {
     // s'exécute une unique fois pour toute
     //  après le dernier cas de tests
  }

Gestion des exceptions



Utilisez le paramètre “expected” avec l'annotation @Test pour indiquer que le cas de test s'attend à une exception. Donnez le nom de l'exception qui va être lancée.

  @Test(expected = ArithmeticException.class)
  public void divisionAvecException() {
     // division par zero
     simpleMath.divide(1, 0);
  }

@Ignore



Ajouter l'annotation @Ignore pour les cas de tests que vous voulez ignorer. Vous pouvez ajouter comme paramètre une chaîne de caractères qui indique la raison pour laquelle vous ignorez le test.

  @Ignore(“Pas prêt à fonctionner”)
  @Test
  public void multiplication() {
     assertEquals(15, simpleMath.multiply(3, 5));
  }

Timeout



Définit un délai d'expiration en millisecondes avec le paramètre “timeout”. Le test échouera si le délai est atteint.

  @Test(timeout = 1000)
  public void infinity() {
     while (true)
     ;
  }

Nouvelles affirmations

Ces nouvelles affirmations permettent de comparer des tableaux. Deux tableaux sont égaux seulement s'ils ont la même longueur et si chaque élément de l'un est égal à l'élément correspondant de l'autre.

  public static void assertEquals(Object expected, Object actual);
  public static void assertEquals(String message, Object expected, Object actual);
  @Test
  public void listEquality() {
     List expected = new ArrayList();
     expected.add(5);
     
     List actual = new ArrayList();
     actual.add(5);
     
     assertEquals(expected, actual);
  }

JUnit4Adapter

Permet d'exécuter vos tests JUnit 4 dans les lanceurs de tests JUnit 3 avec le JUnit4Adapter

  public static junit.framework.Test suite() {
     return new JUnit4TestAdapter(SimpleMathTest.class);
  }

mercredi 22 février 2012

Hamcrest, tutoriel pour Java

Java

Hamcrest est une bibliothèque d'objets de correspondance ('matchers' ou contraintes ou encore prédicats) permettant de définir des règles de 'correspondance' de façon déclarative, utilisables dans d'autres frameworks. Typiquement, on l'utilisera avec des frameworks de test, des bibliothèques d'objets bouchons (mock objects) et des règles de validation d'interface utilisateur.Par exemple, au lieu d'écrire:

   assertEquals("bleu", couleur);

On écrira:

   assertThat(couleur,is("bleu"));

On note ici le gain immédiat de lisibilité (surtout en anglais)...

Hamcrest a été implémenté pour Java, PHP mais aussi C++, Objective-C, Python et Erlang. Naturellement, avec Java, on pourra gérer cette dépendance via Maven.

Une version d'Hamcrest est fournie avec JUnit. Cependant, elle date un peu et les versions plus récentes d'Hamcrest offrent un tas de nouvelles fonctionnalités, en particuliers pour travailler avec les collections. Vous pouvez utiliser la dernière version d'Hamcrest en utilisant la dépendance junit-dep à la place de junit, comme suit:

  <dependency>
      <groupId>junit</groupId>
      <artifactId>junit-dep</artifactId>
      <version>4.10</version>
      <scope>test</scope>
      <exclusions>
         <exclusion>
              <groupId>org.hamcrest</groupId>
              <artifactId>hamcrest-core</artifactId>
          </exclusion>
      </exclusions>
  </dependency>
  <dependency>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-library</artifactId>
      <version>1.3.RC2</version>
  </dependency>

junit-dep est exactement la même bibliothèque que junit, exception faite que ses dépendances sont explicitement déclarées et non incluse dans le bundle.....

Notez enfin que Hamcrest n'est pas une bibliothèque de test comme JUnit ou TestNG, mais bien une bibliothèque d'objets de correspondance destinés à rendre les tests implémentés avec les bibliothèques précédentes beaucoup plus lisibles.

Ce qui suit est la traduction du tutoriel Java que l'on peut lire sur le wiki du site de Hamcrest. On pourra également lire ce billet de John Smart.

Lire la suite...

mardi 14 février 2012

La version 1.2.3 de PHPUnit_Selenium est sortie

selenium-logo.png PHP

PHPUnit est l'équivalent pour PHP de JUnit pour Java. Framework très abouti, utilisant même des annotations, il permet de plus de s'interfacer avec Selenium pour tester des applications Web. Depuis la version 1.2.0, il prend maintenant en compte l'API WebDriver en ajoutant la classe PHPUnit_Extensions_Selenium2TestCase ainsi que:

  • le partage de session pour l'API WebDriver
  • l'ouverture d'URL et la sélection d'élément pour l'API WebDriver
  • le clic d'éléments et le raccourci clickOnElement($id) pour l'API WebDriver
  • le support partiel de 'alert()' pour l'API WebDriver
  • la manipulation d'éléments pour l'API WebDriver: accesseur de test, modificateurs de valeurs
  • les sélecteurs raccourcis `by*()` pour l'API WebDriver
  • l'extraction d'une classe de commande de base pour étendre les commandes gérées des sessions et des éléments pour l'API WebDriver

Viennent donc de sortir coup sur coup les versions 1.2.2 et 1.2.3 qui vient réparer un petit oubli de la 1.2.2.

Lire la suite...

lundi 6 février 2012

Introduction au Behaviour Driven Developement

Traduction de l'article de Dan North: http://dannorth.net/introducing-bdd... paru pour la première fois dans Better Software Magazine en mars 2006 et publié ici avec son aimable autorisation.

J'avais un problème. Quand on utilise ou qu'on enseigne les pratiques agiles telles que le développement dirigé par les tests (TDD) sur des projets dans différents environnements, on rencontre toujours la même confusion et les mêmes difficultés de compréhension. Les programmeurs veulent savoir par où commencer, ce qu'il faut tester et ce qu'il ne faut pas tester, combien de tests doivent être exécutés en une fois, ce qui lance leurs tests et comment comprendre pourquoi un test échoue.

Plus on va profondément dans TDD, plus on a l'impression que le processus d'apprentissage est moins un processus d'amélioration progressive de sa maîtrise qu'une suite de tâtonnement et d'essais/erreurs. On arrive plus fréquemment à se dire : "si seulement quelqu'un m'avait dit ça avant" que "Eureka, une porte s'est ouverte". D'où la décision qu'il doit être possible de présenter le TDD d'une façon qui va directement aux bonnes choses et évite les écueils.

Une réponse est le Behaviour Driven Development (BDD). Il a émergé des pratiques agiles établies et est conçu pour les rendre plus accessibles et efficaces pour les équipes peu aguerries à la livraison de code agile. Au fil du temps, BDD a grandi pour englober une vision plus large de l'analyse agile et du test d'acceptation (de recette) automatisé.

Lire la suite...

samedi 4 février 2012

Test d'une application Web avec Thucydides

Thucydides

L'objet de cet article, inspiré fortement par le guide utilisateur de Thucydides, et de mettre en place des tests de validation fonctionnelle sur une application Web à l'aide de Thucydides, donc, et de WebDriver/Selenium 2. Thucydides est une bibliothèques OpenSource destinée à faciliter ces tests de recette, en utilisant, soit JUnit, soit EasyB.

Lire la suite...