Archive

Articles taggués ‘Junit’

Tests unitaires pour Google App Engine

google-app-engine Les développeurs Cloud le savent, tests unitaires et Google App Engine ne sont pas franchement compatibles : si on veut exécuter les tests unitaires sur le GAE depuis un script ou son IDE préféré, on est obligé de les invoquer via http (ou xmpp) et on est vite limité par le timeout de 30 secondes.

Le projet App Engine Unit tente de combler le vide. Le principe est de découper une suite de tests JUnit en tâches asynchrones et de les empiler ensuite dans la Task Queue.

Sur le papier, ça semble plutôt prometteur. Mais le projet en est encore à ses balbutiements (version 0.0.6 !). A suivre de près néanmoins.

JUnit Rules

L’équipe de Kent Beck a récemment publié JUnit 4.7 qui n’apporte pas grand chose hormis la notion de Rule. Une Rule ressemble énormément à la notion d’intercepteur de l’AOP Alliance ou de TestExecutionListeners dans Spring.

A quoi celà peut-il servir en pratique? Dans les précédentes versions de JUnit 4, pour exécuter un traitement avant/après chaque méthode de test, on utilisait une méthode annotée @Before ou @After. Pour factoriser ce traitement sur plusieurs classes de tests, il fallait passer par une classe mère commune.

Dorénavant, on pourra isoler ce traitement dans une classe:

public class LogRule implements MethodRule {
    public Statement apply(final Statement base, final FrameworkMethod method, final Object target) {
        return new Statement() {
            public void evaluate() throws Throwable {
                try {
                    System.out.println("Begin " + method.getName() + " on " + target);
                    base.evaluate();
                    System.out.println("End " + method.getName() + " on " + target);
                } catch (Throwable ex) {
                    System.out.println("Exception " + method.getName() + " on " + target+": "+ex.getMessage());
                }
            }
        };
    }
}

puis le référencer dans un test, on ajoute un attribut public annoté @Rule:

public class ComplexTest {
    @Rule
    public LogRule logRule=new LogRule();
    @Test
    public void testAdd() { ... }
}

JUnit inclut quelques Rules basiques:

  • ExpectedException: vérifie qu’une exception est levée (généralise @Test(expected=...) à une classe de test)
  • Timeout: vérifie qu’un test ne dépasse pas une certaine durée (généralise @Test(timeout=...) à une classe de test
  • ExternalResource: base pour gérer une ressource: ouvrir/fermer une connexion par exemple
    • TemporaryFolder: créer/détruit un dossier temporaire pour les tests qui produisent des fichiers
  • TestWatchman: base pour observer l’exécution d’un test sans intervenir
    • TestName: donne accès au nom du test depuis la méthode de test
  • Verifier: base pour vérifier l’état de l’objet de test
    • ErrorCollector: recueille les erreurs sans interrompre un test

Gageons que des projets connexes à JUnit, comme DBUnit, tireront profit de cette notion.