java.util.Random ?

Triangulation

  • création de 2 assertions pour tester un même code
  • permet l'écriture progressive d'une implémentation générique

Fake code

Fake code

Generic code

Assert 2

Assert 1

Assert 2

Assert 1

Assert 1

Tests Randoms

  • ne permet pas l'émergence de l'implémentation
  • pas de rejeu possible
  • si un cas ne passe pas et qu'on identifie la valeur :
    • pas de non-régression à exhiber via du test random

Inconvénients

Avantages

  • permet de tester différentes valeurs non arbitraires
  • évite de se préoccuper des valeurs de test

Refactoring de tests

Exemple de test simple et succinct :

@Test
fun `given products, when get for a category, then obtain the products of this category`() {
  givenProducts(
    ProductEntity(id = 1, name = "Envelope", category = "Office", description = "An Envelope", stockAmount = 1),
    ProductEntity(id = 2, name = "Pen", category = "Office", description = "An Pen", stockAmount = 1),
    ProductEntity(id = 3, name = "Notebook", category = "Hardware", description = "A Notebook", stockAmount = 2)
  )

  val actualProducts = whenGetProductsForCategory("Office")
    
  assertProductIdsAre(listOf(1, 2), actualProducts)
}

Après extraction de méthode pour la création des products :

@Test
fun `given products, when get for a category, then obtain the products of this category`() {
  givenProducts(
    createProductWithCategory(1, "Office"),
    createProductWithCategory(2, "Office"),
    createProductWithCategory(3, "Hardware")
  )

  val actualProducts = whenGetProductsForCategory("Office")
    
  assertProductIdsAre(listOf(1, 2), actualProducts)
}

Constat

  • certaines valeurs ne nous intéressent pas
  • on ne va pas trianguler dessus
  • on va se concentrer sur trianguler sur les autres valeurs
    (ici différent set de products + choix de category différente)
  • on a choisi name/description/amount de manière arbitraire
    (sinon nous aurions des tests spécifiques associés)

Bonne pratique en test

 

  • ne pas cacher les valeurs vérifiées dans les tests
    on doit pouvoir identifier immédiatement ce qui est en given et qui va être vérifié en then
     
  • ne pas faire apparaître des valeurs qui ne sont pas utilisées
    ces valeurs ne nous intéressent pas et polluent la lecture du test qui doit rester simple
     

 

  • exemple d'implémentation de la méthode extraite
fun createProductWithCategory(id: Int, category: String) = 
  ProductEntity(id,
                "Something",
                category,
                "This is something",
                5)
fun createProductWithCategory(id: Int, category: String) = 
  ProductEntity(id,
                aName,
                category,
                aDescription,
                anAmount)
                
val aName = "a name"
val aDescription = "a description"
val anAmount = 5
  • les valeurs non-testées ne nous intéressent pas, on pourrait les cacher...
  • on pourrait même les générer sans faire de choix arbitraire
fun createProductWithCategory(id: Int, category: String) = 
  ProductEntity(id,
                aName(),
                category,
                aDescription(),
                anAmount())
                
fun aName() = aString(maxSize = 10)
fun aDescription() = aString(maxSize = 32)
fun anAmount() = anInt(min = 1)
https://phauer.com/2019/modern-best-practices-testing-java/

https://phauer.com/2018/best-practices-unit-testing-kotlin/

https://kotest.io/docs/proptest/property-test-generators.html

 

 

 

 

Randomization

By jeremee

Randomization

  • 84