Fest assert : les assertions plus lisibles

Preview:

DESCRIPTION

Présentation Fest Assert que j'ai faites au bof Sfeir du 10 juin 2011

Citation preview

FestAssert : les assertions plus lisible

Assertion ?

• assertion : (nom féminin) Proposition qu'on affirme

• Dans un contexte de test, c'est pareil.Si l'affirmation n'est pas vérifiée => ECHEC

Avec quoi les écrire ?

• JUnit • Je fais mes assertions avec parce qu'on s'en sert pour les test.• TestNG

Je fais mes assertions avec parce qu'on s'en sert pour les test.• FestAssert

Ce qu'on va voir• Hamcrest

Ce qui a inspiré FestAssert

JUnit - Ecrire assertion

Peu de vocubulaire :• assertTrue(maProposition)

assertFalse(maProposition)• assertEquals(objAttendu, objAVerifier)• assertSame(objAttendu, objAVerifier)• assertNull(monObjet)

assertNotNull(monObjet)

JUnit - Ecrire assertion

Ah bon, je croyais que je devais formuler une proposition ?

JUnit - Ecrire assertion

Ben si, regarde :

List<Employe> partipants = bof.getParticipants(); assertNotNull(participants); assertEquals(20, partipants.size());

La syntaxe de la 2ème assertions est bizarre...Ca me fait penser à quelqu'un.... mais qui ?

JUnit - Yoda assertions

assertEquals(20, partipants.size()); Je souhaite que égal à 20 soit le nombre de participants

JUnit

Oulah, je vais devoir parler comme Yoda. Et si jamais, j'ai besoin d'un assertTrue, ça va être compliqué....

Je veux seulement vérifier que le nombre de partipants est de 20.

FestAssert

Heureusement non :assertThat(participants).hasSize(20);

FestAssert - Junit

Je dois changer mon framework de test alors ?

Non, pas du tout, FestAssert fait s'occupe seulement des assertions.

FestAssertLexique plus riche, plus simpleassertThat(partipants).doesNotHaveDuplicate(); Et en plus, je peux chainer tout ça :assertThat(partipants).isNotNull().hasSize(20).doesNotHaveDuplicate();

FestAssert - SyntaxeAssertions <= je m'en passe avec les imports statiques

.assertThat(monObjet) <= Fournit un xxxAssert

.methode(...) <= Méthode spécifique

Et j'ai un bon nombre de xxxAssert :• ListAssert• FileAssert• FloatAssert• MapAssert• StringAssert• ObjectAssert• ....

Si pas mon objet n'a pas de xxxAssert, c'est le ObjectAssert

Vérifier présence de certains ?

List<Employe> partipants = bof.getParticipants();Employe nicolas = sfeir.getXXXEmploye fabien = sfeir.getXXX

assertThat(partipants).contains(nicolas, fabien);

Pas super...

Vérification liste

Fournit un ListAssert d'une liste transformée : List<A> => List<B>

assertThat(partipants).onProperty("prenom").contains("Nicolas", "Fabien");

onProperty

Failure 1/2

Parfois l'assertion est fausse :@Test public void junitListe() { assertEquals(20, liste.size()); }

@Test public void festassertListe() { Assertions.assertThat(liste).hasSize(20); }

Failure 2/2

Des fois l'assertion est fausse :@Test public void junitString() { assertNotNull(nom); }

@Test public void festAssertString() { assertThat(nom).isNotNull(); }

FestAssert - Extension

Y'a même pas la méthode que je veux dans le xxxAssert

FestAssert - Syntaxe

J'écris ma condition !private class IsListeTailleImpaireCondition extends Condition<List<?>> { @Override public boolean matches(List value) { if(value == null){ return false; } else { return value.size()%2==1; } } }

Et je m'en sers : assertThat(maListe).satifies(new IsListeTailleImpaireCondition());

assertThat(maListe).doesNotsatify(new IsListeTailleImpaireCondition());

FestAssert - Extension

Y'a même pas le xxxAssert pour mon objet métier

FestAssert - Mon xxxAssert à moi

J'écris mon xxxAssert :public class DateTimeAssert extends GenericAssert<DateTimeAssert, DateTime> { public DateTimeAssert(DateTime actual) {        super(DateTimeAssert.class, actual);  }

 public DateTimeAssert isBetween(DateTime begin, DateTime end){     isNotNull();    if(actual.compareTo(begin) >= 0 && actual.compareTo(end) <= 0) {          return this;        } throw failure(inBrackets(actual), " should be between :", inBrackets(begin), " and ", inBrackets(end)));     }  }

Et je m'en sers :MyAssertions.assertThat(maDate).isBeetwen(debutPeriode,finPeriode);

Recommended