Code du jour: Mais ça marchait pendant la démo (T)

Publié le 07 mai 2008 par Wtf

On est tous passé par là : tous nos tests unitaires fonctionnaient la veille mais quand il s'agit de lancer la démo vous réalisez que vous avez oublié quelque chose. Depuis, on a inventé la revue de code. Non pas qu'il y ait moins de bug, vous vous sentez juste mieux puisque quelqu'un d'autre a raté le problème.

Par chance pour les amis de Christian, il a l'œil. Quand un de ses collègues atterrit dans une équipe projet assignée aléatoirement, Christian jeta un coup d'œil au code. Apparemment, "Karl", la personne en charge du module d'authentification n'était pas attentif aux critiques du moment que son test unitaire passait.

S'il avait seulement un utilisateur "utilisateurtest" dans la base de données, le test en question fonctionnait, et rapidement en plus.

  public void Authenticate( string username, string passhash )
{
SqlDataReader source = _Database.Query("SELECT * FROM users;");
while ( source.Read() )
{
if ( source["user"].ToString() == username
& source["pass"].ToString() == passhash )
{
this.authenticated = true;
}
else
{
this.authenticated = false;
}

}
}

Quand notre héros ajouta 10K lignes aléatoires dans la base de données, le test unitaire était certes très lent, mais passait toujours et la démo fonctionnait. Karl fut mieux éclairé sur le problème seulement lorsque Christian s'assura que "utilisateurtest" n'était pas la dernière entrée dans la base de données. Après ça, lui et Karl ont passé quelque temps à discuter du concept de la clause WHERE.