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