Vos tests ont besoin d'amour

Benoit Sautel

Développeur passionné

Tester

Quand tester devient une corvée

Tester, ça s'apprend

Tester du code testable

Réutilisable

SOLID

Les 5 principes fondamentaux de la programmation orientée objet

Single Responsibility Principle

Une classe ne doit faire qu'une seule chose

Dependency Inversion Principle

Une classe ne doit pas avoir de couplage avec les implémentations de ses dépendances (délégation)

Liskov Substitution Principle

Un type doit toujours pouvoir être remplacé par un sous-type sans changer la sémantique du code

Carré / Rectangle

public class Rectangle {
    private final int width;
    private final int length;

    public Rectangle(int width, int length) {
        this.width = width;
        this.length = length;
    }

    public int getLength() {
        return length;
    }

    public int getWidth() {
        return width;
    }
}

Carré / Rectangle

public class Square extends Rectangle {
    public Square(int length) {
        super(length, length);
    }
}

Carré / Rectangle

public class Rectangle {
    private int width;
    private int length;

    public Rectangle(int width, int length) {
        this.width = width;
        this.length = length;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }
}

Carré / Rectangle

public class Square extends Rectangle {
    public Square(int length) {
        super(length, length);
    }

    @Override
    public void setWidth(int width) {
        super.setWidth(width);
        // What about the length?
    }

    @Override
    public void setLength(int length) {
        super.setLength(length);
        // What about the width?
    }
}

Comportement / état

Interface segregation principle

Un client d'une classe ne doit pas dépendre de méthodes qu'il n'utilise pas

Open Closed Principle

Une classe doit être ouverte à l'extension mais fermée à la modification

Design patterns

Des tests efficaces

FIRST

Fast

Independant

Repeatable

Self-validating

Timely

Test Driven Development

Au plus près du code

Simples et bien nommés

  • Should return the user when the user exists
  • Should return a not found error when the user does not exist

Faire échouer le test

Mock ou pas mock ?

Code asynchrone

Exploitez les outils

Assertions

assertThat(france.getCapital()).isEqualTo("Paris");
assertThat(france.getPopulation())
        .isGreaterThan(65000000)
        .isLessThan(70000000);
List<String> biggestCities = france.getThreeBiggestCities();

// At least
assertThat(biggestCities).contains("Paris", "Marseille");

// Exactly
assertThat(biggestCities).containsExactly("Paris", "Marseille", "Lyon");

// Only but in any order
assertThat(biggestCities).containsOnly("Marseille", "Lyon", "Paris");

Couverture de code

Mutation de code

Et dans la vraie vie ?

Nettoyer au fur et à mesure

Présentation

Réalisée avec Reveal.js

Code source sur Github

Visible en ligne sur http://files.fierdecoder.fr/your-tests-need-love/

Références externes

Liens vers des pages web citées pendant la présentation.

Crédits photos

1/3

2/3

3/3