432 votes

Tests unitaires et tests fonctionnels

Quelle est la différence entre les tests unitaires et les tests fonctionnels ? Un test unitaire peut-il également tester une fonction ?

0 votes

538voto

Anthony Forloney Points 30083

Les tests unitaires indiquent au développeur que le code fait les bonnes choses ; les tests fonctionnels indiquent au développeur que le code fait les bonnes choses.

Vous pouvez en savoir plus à l'adresse suivante Tests unitaires et tests fonctionnels


Une analogie bien expliquée dans la vie réelle des tests unitaires et des tests fonctionnels peut être décrite comme suit,

Souvent, le développement d'un système est comparé à la construction d'une maison. Bien que cette analogie ne soit pas tout à fait correcte, nous pouvons l'étendre afin de comprendre la différence entre les tests unitaires et fonctionnels.

Les tests unitaires sont analogues à la visite d'un inspecteur du bâtiment sur le chantier d'une maison. Il se concentre sur les différents systèmes internes de la maison, les fondations, la charpente, l'électricité, la plomberie, etc. Il s'assure (teste) que les parties de la maison fonctionneront correctement et en toute sécurité, c'est-à-dire qu'elles respecteront le code du bâtiment.

Les tests fonctionnels dans ce scénario sont analogues à la visite de ce même chantier par le propriétaire. Il suppose que les systèmes internes se comporteront de manière appropriée et que l'inspecteur des bâtiments s'acquitte de sa tâche. Le propriétaire se concentre sur ce qu'il va ressentir en vivant dans cette maison. Il se préoccupe de l'apparence de la maison, de la taille confortable des différentes pièces, de l'adéquation de la maison aux besoins de la famille, de l'emplacement des fenêtres pour profiter du soleil du matin.

Le propriétaire effectue des tests fonctionnels sur la maison. Il a le point de vue de l'utilisateur.

L'inspecteur des bâtiments effectue des tests unitaires sur la maison. Il a le point de vue du constructeur.


En résumé,

Les tests unitaires sont écrits à partir d'un programmeurs perspective. Elles sont faites pour garantir qu'une méthode particulière (ou une unité ) d'une classe effectue un ensemble de tâches spécifiques.

Les tests fonctionnels sont écrits à partir de la de l'utilisateur perspective. Ils veillent à ce que le système soit fonctionnement comme les utilisateurs s'y attendent.

23 votes

La citation est un peu vague pour quelqu'un qui ne connaît pas le concept.

2 votes

@fig-gnuton, j'ai essayé d'élaborer pour espérer ne pas rendre la description aussi vague. Dans le lien, ils fournissent un bon exemple, je pourrais mettre à jour la réponse avec la citation si vous pensez que cela pourrait aider le PO.

166 votes

Une autre façon de le dire serait peut-être : "Les tests unitaires permettent de s'assurer que le code fait ce que le programmeur veut, les tests fonctionnels permettent de s'assurer que le programmeur fait ce que le client veut" ?

270voto

bpapa Points 10188

Test unitaire - test d'une unité individuelle, telle qu'une méthode (fonction) dans une classe, avec toutes les dépendances simulées.

Test fonctionnel - AKA Test d'intégration, testant une tranche de fonctionnalité dans un système. Cela permet de tester de nombreuses méthodes et peut interagir avec des dépendances telles que des bases de données ou des services Web.

191 votes

Permettez-moi de ne pas être d'accord avec "AKA Integration Test". Un test d'intégration vérifie l'intégration entre 2 ou plusieurs systèmes/sous-systèmes dans votre code. Par exemple, vérifier une requête SQL à travers un ORM, vérifie que l'ORM et la base de données fonctionnent bien ensemble. Tests fonctionnels AKA End to End IMHO.

11 votes

Je suis d'accord avec @graffic Test fonctionnel != Test d'intégration Vous devez confondre "intégration" des sous-composants du système les uns dans les autres, comme la persistance de l'état, etc. Mais au sens général, les tests d'intégration ont une portée beaucoup plus large.

5 votes

Non, je n'étais pas confus à propos de quoi que ce soit.

147voto

Jörg W Mittag Points 153275
  • Un test unitaire teste un unité indépendante de comportement . Qu'est-ce qu'une unité de comportement ? C'est la plus petite partie du système qui peut être testée indépendamment. (Cette définition est en fait circulaire, c'est-à-dire qu'elle n'est pas vraiment une définition ). du tout mais cela semble fonctionner assez bien dans la pratique, car on peut en quelque sorte le comprendre intuitivement).

  • Un test fonctionnel teste un élément indépendant de la fonctionnalité.


  • Une unité de comportement est très petite : bien que je n'aime absolument pas ce mantra stupide "un test unitaire par méthode", du point de vue d'une taille perspective, c'est à peu près correct. Une unité de comportement est quelque chose entre une partie d'une méthode et peut-être un couple de méthodes. Tout au plus un objet, mais pas plus d'un.

  • Un élément de fonctionnalité comprend généralement de nombreuses méthodes et traverse plusieurs objets et souvent plusieurs couches architecturales.


  • Un test unitaire serait quelque chose comme : lorsque j'appelle la fonction validate_country_code() et lui passer le code du pays 'ZZ' il devrait retourner false .

  • Un test fonctionnel serait le suivant : lorsque je remplis le formulaire d'expédition avec un code pays de ZZ je devrais être redirigé vers une page d'aide qui me permette de choisir mon code pays dans un menu.


  • Les tests unitaires sont écrits par des développeurs, pour des développeurs, du point de vue du développeur.

  • Les tests fonctionnels peuvent être orientés vers l'utilisateur, auquel cas ils sont écrits par des développeurs en collaboration avec des utilisateurs (ou peut-être même par les utilisateurs eux-mêmes avec les bons outils et les bons utilisateurs), pour les utilisateurs, du point de vue de l'utilisateur. Ils peuvent également être orientés vers le développeur (par exemple, lorsqu'ils décrivent une fonctionnalité interne dont l'utilisateur ne se soucie pas), auquel cas ils sont écrits par des développeurs, pour des développeurs, mais toujours du point de vue de l'utilisateur.


  • Dans le premier cas, les tests fonctionnels peuvent également servir de tests d'acceptation et de codage exécutable des exigences fonctionnelles ou d'une spécification fonctionnelle ; dans le second cas, ils peuvent également servir de tests d'intégration.

  • Les tests unitaires changent fréquemment, les tests fonctionnels ne doivent jamais changer dans une version majeure.


0 votes

Excellente réponse ! une chose - "les tests fonctionnels ne doivent jamais changer dans une version majeure" pourquoi ?

0 votes

@Lazer L'idée ici est qu'une version majeure s'accompagne de grands changements dans la fonctionnalité, alors qu'une version mineure serait de petites mises à jour qui ne changent pas la fonctionnalité (et donc ne changent pas les tests fonctionnels).

5 votes

@Lazer, @cdeszaq : Dans de nombreux projets, un changement du numéro de la version majeure est utilisé pour indiquer l'incompatibilité avec la version précédente et, en revanche, si la version majeure n'a pas été modifiée, cela signifie qu'il n'y a pas d'incompatibilité. pas changement, la rétrocompatibilité est garanti . Que signifie "compatibilité ascendante" ? Cela signifie "ne change pas le comportement visible par l'utilisateur". Et les tests fonctionnels sont un encodage exécutable de la spécification du comportement visible par l'utilisateur. Donc, si le numéro majeur ne change pas, alors les tests fonctionnels ne doivent pas changer non plus et inversement, si les tests fonctionnels faire changement, alors le numéro majeur doit changer également.

13voto

Mark Rushakoff Points 97350

"Test fonctionnel" ne signifie pas que vous testez une fonction (méthode) dans votre code. Cela signifie, en général, que vous testez la fonctionnalité du système - lorsque je lance le programme foo file.txt à la ligne de commande, les lignes dans file.txt s'inverser, peut-être. En revanche, un test unitaire unique couvre généralement un seul cas d'une seule méthode -- length("hello") devrait retourner 5, et length("hi") devrait retourner 2.

Voir aussi Le point de vue d'IBM sur la frontière entre les tests unitaires et les tests fonctionnels .

0 votes

Intéressant, mais le lien que vous montrez signifie quelque chose de différent : fonctionnel concerne la fonction à réaliser à travers la mise en œuvre, c'est-à-dire le test du point de vue de l'utilisateur, c'est une fonction pour l'utilisateur.

6voto

Dans Rails, le dossier unitaires est destiné à contenir les tests de vos modèles, le dossier fonctionnel est destiné à contenir les tests de vos contrôleurs, et le dossier d'intégration est destiné à contenir les tests impliquant un nombre quelconque de contrôleurs en interaction. Les fixtures sont un moyen d'organiser les données de test ; elles résident dans le dossier fixtures. Le fichier test_helper.rb contient la configuration par défaut de vos tests. Vous pouvez visiter ce .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X