Certaines personnes soutiennent que les tests d'intégration sont des types de tests incorrects et erronés - tout doit être testé en unité, ce qui signifie que vous devez simuler des dépendances. une option qui, pour diverses raisons, ne me passionne pas toujours.
Je trouve que, dans certains cas, un test unitaire ne prouve simplement rien.
Prenons l'exemple de l'implémentation de référentiel (trivial, naïf) suivant (en PHP):
class ProductRepository
{
private $db;
public function __construct(ConnectionInterface $db) {
$this->db = $db;
}
public function findByKeyword($keyword) {
// this might have a query builder, keyword processing, etc. - this is
// a totally naive example just to illustrate the DB dependency, mkay?
return $this->db->fetch("SELECT * FROM products p"
. " WHERE p.name LIKE :keyword", ['keyword' => $keyword]);
}
}
Supposons que je souhaite prouver par un test que ce référentiel peut réellement trouver des produits correspondant à différents mots clés donnés.
En dehors des tests d'intégration avec un objet de connexion réel, comment puis-je savoir que cela génère en fait de vraies requêtes - et que ces requêtes font réellement ce que je pense qu'elles font?
Si je dois simuler l'objet de connexion dans un test unitaire, je ne peux que prouver que "il génère la requête attendue" - mais cela ne signifie pas qu'il va réellement fonctionner ... c'est-à-dire qu'il génère peut-être la requête. Je m'y attendais, mais peut-être que cette requête ne fait pas ce que je pense.
En d'autres termes, j'ai l'impression qu'un test qui émet des assertions sur la requête générée est essentiellement sans valeur, car il teste la manière dont la findByKeyword()
méthode a été implémentée , mais cela ne prouve pas que cela fonctionne réellement .
Ce problème ne se limite pas aux référentiels ou à l’intégration de bases de données - il semble s’appliquer dans de nombreux cas, où affirmer l’utilisation d’un simulacre de test (double test) ne fait que prouver comment les choses sont mises en œuvre, et non pas si elles vont être utilisées. fonctionne réellement.
Comment gérez-vous de telles situations?
Les tests d'intégration sont-ils vraiment "mauvais" dans un cas comme celui-ci?
Je comprends qu'il est préférable de tester une chose, et je comprends aussi pourquoi les tests d'intégration mènent à une myriade de chemins de code, qui ne peuvent pas tous être testés - mais dans le cas d'un service (tel qu'un référentiel) dont le seul but est Pour interagir avec un autre composant, comment pouvez-vous réellement tester quoi que ce soit sans tester l'intégration?