Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Property Based Testing - BBL Lucca 2016

Property Based Testing - BBL Lucca 2016

Arnaud LEMAIRE

December 05, 2016
Tweet

More Decks by Arnaud LEMAIRE

Other Decks in Programming

Transcript

  1. public class FizzBuzzTDD {
 public static String fizzBuzz(int i) {


    if(i%15 == 0) return "FizzBuzz";
 if(i%3 == 0) return "Fizz";
 if(i%5 == 0) return "Buzz";
 
 return String.valueOf(i);
 }
 } Merci à @XDetant & @malk_zameth
  2. public class FizzBuzzTDDTest {
 @Test
 public void it_returns_1_for_1() {
 assertThat(FizzBuzzTDD.fizzBuzz(1)).isEqualTo("1");


    }
 
 @Test
 public void it_returns_2_for_2() {
 assertThat(FizzBuzzTDD.fizzBuzz(2)).isEqualTo("2");
 }
 
 @Test
 public void it_returns_fizz_when_times_3() {
 assertThat(FizzBuzzTDD.fizzBuzz(3)).isEqualTo("Fizz");
 }
 
 @Test
 public void it_returns_buzz_when_times_5() {
 assertThat(FizzBuzzTDD.fizzBuzz(5)).isEqualTo("Buzz");
 }
 
 @Test
 public void it_returns_fizzbuzz_when_times_15() {
 assertThat(FizzBuzzTDD.fizzBuzz(15)).isEqualTo("FizzBuzz");
 }
 }
  3. @RunWith(DataProviderRunner.class)
 public class FizzBuzzParametrizedTest {
 
 @DataProvider
 public static Object[][]

    times3() {
 return new Object[][]{{3},{6}};
 }
 
 @Test
 @UseDataProvider("times3")
 public void it_returns_fizz_when_times_3(int n) {
 assertThat(FizzBuzzTDD.fizzBuzz(n)).isEqualTo("Fizz");
 
 }
 
 @DataProvider
 public static Object[][] times5() {
 return new Object[][]{{5},{10}};
 }
 
 @Test
 @UseDataProvider("times5")
 public void it_returns_buzz_when_times_5(int n) {
 assertThat(FizzBuzzTDD.fizzBuzz(n)).isEqualTo("Buzz");
 
 }
 
 @DataProvider
 public static Object[][] times15() {
 return new Object[][]{{15},{30}};
 }
 
 @Test
 @UseDataProvider("times15")
 public void it_returns_fizzbuzz_when_times_15(int n) {
 assertThat(FizzBuzzTDD.fizzBuzz(n)).isEqualTo("FizzBuzz");
 
 }
 }
  4. @RunWith(JUnitQuickcheck.class)
 public class FizzBuzzPropertiesTest {
 @Property
 public void multiple_of_three_contains_fizz(int n)

    {
 assumeThat(n%3, equalTo(0));
 assertThat(FizzBuzzTDD.fizzBuzz(n)).contains("Fizz");
 }
 @Property
 public void multiple_of_five_contains_buzz(int n) {
 assumeThat(n%5, equalTo(0));
 assertThat(FizzBuzzTDD.fizzBuzz(n)).contains("Buzz");
 }
 }
 
 public class FizzBuzzTDDTest {
 @org.junit.Test
 public void it_returns_1_for_1() {
 assertThat(FizzBuzzTDD.fizzBuzz(1)).isEqualTo("1");
 }
 
 @Test
 public void it_returns_2_for_2() {
 assertThat(FizzBuzzTDD.fizzBuzz(2)).isEqualTo("2");
 }
 }
  5. Pourquoi le TDD ça suffit pas ? Le TDD consiste

    à avoir des tests ultra localisés par rapport au domaine de votre application
  6. Add Commutatif -> l’ordre des entrées ne compte pas Associatif

    -> ajouter 1 deux fois revient à ajouter 2 une fois Avec une identité -> ajouter zéro ne change pas la valeur de l’entrée
  7. Add Commutatif -> 
 add x y == add y

    x Associatif -> 
 add(1, add(x, 1)) == add(x, 2) Avec une identité ->
 add(x, 0) == x
  8. Invariants du domaine Les dates autorisées sont toujours celles de

    l’année en cours Le total des opérations ne peux jamais dépasser un certain plafond Dès que vous avez des termes comme « toujours, jamais » : vous êtes face à un invariant
  9. Invariant vs Validations La validation se fait depuis l’extérieur de

    l’entité L’invariance est construite dans l’entité (souvent à l’aide d’une factory)
  10. Invariants & Propriétés Le property based testing permet de valider

    que ceux-ci ne sont pas violés par votre implémentation
  11. Historique & Définition La définition a longtemps été « ce

    que sait faire quickcheck » Avoir sa propre équipe de QA automatisée Un système de PBT va chercher à faire planter votre système en cherchant les « edge cases »
  12. Ça change quoi par rapport à du Fuzzing ? L’intention

    est différente : Le fuzzing consiste à envoyer des données pseudo-aléatoires : il test la « technique » Le PBT cherche à construire une spécification du SUT : il test le « métier » Le PBT va pouvoir trouver des erreurs qui ne seraient pas apparues avec un outil de fuzzing
  13. Test Oracle Le PBT permet d’effectuer du test « Oracle

    » Il s’agit de vérifier un algorithme complexe à l’aide d’un équivalent
  14. Ça sert à quoi alors ? Permet de réellement tester

    vos invariants Vous oblige à mieux comprendre votre domaine Permet de DRY les tests