juin
2009
Dans l’article précédent nous avons vu comment faire du TDD simplement.
Les 2 tests que nous avons écrit nous permettent de tester les cas d’utilisations, mais il est important de tester les extrêmes pour limiter les exécutions non contrôlées de l’application.
Pour cela nous devons déjà les définir.
Reprenons l’exemple de l’article précédent avec GetTTCPrice
- Nous devons vérifier que si le prix HT est 0 Euros alors le prix TTC reste 0
- Que ce passe t-il si le prix HT est inferieur 0 ?
Pour le premier point, un test unitaire suffira, mais pour le 2 eme point, nous devons demander a notre analyste.
Notre analyste nous répond tout simplement qu’un prix négatif, ca n’existe pas.
La peste, ca n’existait pas avant qu’on la découvre.
Si ca n’existe pas faut-il tester ce cas ?
Bien sur que oui, ca prend 5 minutes et ca ne mange pas de pain.
Ok, on test, mais quel doit être le comportement d’un cas qui n’existe pas ?
Le choix doit âtre pris par le développeur, donc par nous.
Fonctionellement ce cas est impossible, mais techniquement c’est tout a fait possible de passer un nombre negatif a la class Price.
Si nous faisons rien pour éviter qu’un prix soit négatif, notre application a un risque de partir dans un comportement incontrôlé, nous devons intérompre se comportement le plus rapidement, mais comment ?
- En mettant le prix a 0
- En claquant une exception
Beaucoup de personnes vont penser que la première solution est suffisante, mais NON arrêtez d’être stupide, pourquoi 0 ? pourquoi pas 5 ou 22 ou 42 ? decimal.MaxValue, c’est pas mal non plus non ?
Il faut avertir l’application qu’il y a un problème en claquant une exception, le Framework .NET a une exception du type ArgumentException, plutôt cool non ?
Modifions la class Price pour gérer ce cas:
public class Price
{
private decimal _price;public Price(decimal price)
{
if (price < 0)
throw new ArgumentException(« Price cannot be negative »);_price = price;
}public decimal GetTTCPrice()
{
decimal TTCPrice;TTCPrice = _price * 1.196m;
return TTCPrice;
}
}
Et voila les 2 nouveaux tests unitaires pour tester les limites :
[TestMethod]
public void Price_PriceTTCIs0_WhenPriceHTIs0()
{
#region Actors
Price price;
decimal HTPrice = 0;
decimal TTCPrice;
decimal expectedTTCPrice = 0;
#endregion#region Activities
price = new Price(HTPrice);
TTCPrice = price.GetTTCPrice();
#endregion#region Asserts
Assert.AreEqual(expectedTTCPrice, TTCPrice, « The TTC expected price is not correct »);
#endregion
}[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void Price_ThrowArgumentException_WhenPriceHTIsNegative()
{
#region Actors
Price price;
decimal HTPrice = -56;
#endregion#region Activities
price = new Price(HTPrice);
#endregion}