Tests unitaires vs tests fonctionnels

Réponses:

254

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 - Test d'intégration AKA, testant une tranche de fonctionnalité dans un système. Cela testera de nombreuses méthodes et peut interagir avec des dépendances telles que des bases de données ou des services Web.

bpapa
la source
170
Permettez-moi d'être en désaccord avec "Test d'intégration AKA". Un test d'intégration, vérifie l'intégration entre 2 ou plusieurs systèmes / sous-systèmes dans votre code. Par exemple, la vérification d'une requête SQL via un ORM vérifie que l'ORM et la base de données fonctionnent bien ensemble. Tests fonctionnels AKA End to End IMHO.
graffic
7
Je suis d'accord avec @graffic Functional Test! = Test d'intégration Vous devez confondre l '"intégration" de sous-composants du système les uns avec les autres, comme l'état persistant, etc. Mais en général, les tests d'intégration ont une portée beaucoup plus large.
nabster
4
Non, je n'ai été confus à propos de rien.
bpapa
3
Test d'intégration Test fonctionnel IS-A. Mais pas l'inverse. Google "tests fonctionnels et non fonctionnels" et vérifiez les "Images".
Andrejs
4
Cette réponse est simplement FAUX! Les tests fonctionnels ne sont même PAS proches du test d'intégration ..
sotn
517

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

Vous pouvez en savoir plus sur les tests unitaires et les 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,

Plusieurs fois, le développement d'un système est assimilé à 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 les tests fonctionnels.

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

Les tests fonctionnels dans ce scénario sont analogues à ceux du propriétaire qui visite ce même chantier de construction. Il suppose que les systèmes internes se comporteront de manière appropriée, que l'inspecteur en bâtiment accomplit sa tâche. Le propriétaire est concentré sur ce que ce sera de vivre dans cette maison. Il est préoccupé par l'apparence de la maison, les différentes pièces sont-elles de taille confortable, la maison répond-elle aux besoins de la famille, les fenêtres sont-elles un bon endroit 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 en bâtiment effectue des tests unitaires sur la maison. Il a la perspective du constructeur.


En résumé,

Les tests unitaires sont écrits du point de vue des programmeurs . Ils sont faits pour s'assurer 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 du point de vue de l' utilisateur . Ils s'assurent que le système fonctionne comme les utilisateurs s'y attendent.

Anthony Forloney
la source
18
La citation est un peu vague pour quelqu'un de nouveau dans le concept.
2
@ fig-gnuton, j'ai essayé d'élaborer pour, espérons-le, ne pas rendre la description aussi vague. À l'intérieur du lien, ils fournissent un bon exemple, je pourrais mettre à jour la réponse avec le devis si vous pensez que cela pourrait aider l'OP.
Anthony Forloney
148
Peut-être une autre façon de dire que ce serait: «Le test unitaire s'assure que le code fait ce que le programmeur veut, les tests fonctionnels s'assurent que le programmeur fait ce que le client veut»
JS.
3
J'aime ça, mais je l'adapterais. Un test fonctionnel garantit que l'application permet à l'utilisateur d'effectuer une action. Un test unitaire vérifie que le code se comporte comme le programmeur l'attend.
Adam
2
Ce que le programmeur veut n'est-il pas conforme à ce que veut l'utilisateur final? Pourquoi écrire un test qui ne répond pas aux attentes du client?
O.Badr
140
  • Un test unitaire teste une unité de comportement indépendante . Qu'est-ce qu'une unité de comportement? Il s'agit de la plus petite pièce du système qui peut être testée indépendamment à l'unité. (Cette définition est en fait circulaire, OIEau il est vraiment pas une définition du tout , mais il semble fonctionner assez bien dans la pratique, parce que vous pouvez trier-de comprendre intuitivement.)

  • Un test fonctionnel teste une fonctionnalité indépendante.


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

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


  • Un test unitaire serait quelque chose comme: lorsque j'appelle la validate_country_code()fonction et que je lui passe le code pays, 'ZZ'elle doit retourner false.

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


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

  • Les tests fonctionnels peuvent être destinés aux utilisateurs, auquel cas ils sont écrits par les développeurs avec les utilisateurs (ou peut-être avec les bons outils et les bons utilisateurs même par les utilisateurs eux-mêmes), pour les utilisateurs, du point de vue de l'utilisateur. Ou ils peuvent être confrontés à des développeurs (par exemple, lorsqu'ils décrivent des fonctionnalités internes 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 d'encodage exécutable d'exigences fonctionnelles ou de 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 devraient jamais changer dans une version majeure.


Jörg W Mittag
la source
excellente réponse! une chose - "les tests fonctionnels ne devraient jamais changer dans une version majeure" pourquoi?
Lazer
5
@Lazer, @cdeszaq: Dans de nombreux projets, une modification du numéro de version principale est utilisée pour indiquer une incompatibilité en amont et OTOH si la version principale ne change pas , la compatibilité en amont est garantie . Que signifie «rétrocompatibilité»? Cela signifie "ne modifie pas le comportement visible par l'utilisateur". Et les tests fonctionnels sont un codage exécutable de la spécification du comportement visible par l'utilisateur. Ainsi, si le nombre important ne change pas, les tests fonctionnels ne sont pas autorisés à modifier soit et inversement, si les tets fonctionnels font le changement, le nombre important doit changer.
Jörg W Mittag
2
Remarque: je n'ai rien dit sur l' ajout de tests fonctionnels! La question de savoir si l'ajout de fonctionnalités qui n'existaient pas auparavant constitue un changement incompatible en amont dépend du projet. Pour les logiciels d'utilisateur final, probablement pas. Mais pour un langage de programmation? Peut-être: l'introduction d'un nouveau mot-clé, par exemple, rend invalides les programmes actuellement en cours qui utilisent ce mot-clé comme nom de variable, et est donc une modification incompatible en amont.
Jörg W Mittag
3
@ JörgWMittag aime cette idée: "les tests fonctionnels sont un encodage exécutable de la spécification du comportement visible par l'utilisateur" ... que d'autres super-experts soient d'accord ou non, cela m'aide avec la question d'origine, à savoir "la différence entre 'em "
mike rodent
1
"Un test fonctionnel serait: lorsque je remplis le formulaire d'expédition avec un code de pays ZZ, je devrais être redirigé vers une page d'aide qui me permet de choisir mon code de pays dans un menu." C'est un peu difficile, mais j'appellerais cela un «test d'acceptation». Le test fonctionnel testerait que la saisie de ZZ sur le formulaire d'expédition transmettait l'utilisateur à l'URL correcte ou lançait une exception ou une erreur particulière.
Bob Ray
98

TLDR:

Pour répondre à la question: Le test unitaire est un sous-type de test fonctionnel.


Il existe deux grands groupes: les tests fonctionnels et non fonctionnels . La meilleure illustration (non exhaustive) que j'ai trouvée est celle-ci (source: www.inflectra.com ):

entrez la description de l'image ici

(1) Test unitaire: test de petits extraits de code (fonctions / méthodes). Il peut être considéré comme un test fonctionnel (boîte blanche).

Lorsque les fonctions sont réunies, vous créez un module = une pièce autonome, éventuellement avec une interface utilisateur qui peut être testée (Test de module). Une fois que vous avez au moins deux modules séparés, vous les collez ensemble puis vient:

(2) Test d'intégration: lorsque vous assemblez deux ou plusieurs éléments de (sous) modules ou (sous) systèmes et voyez s'ils fonctionnent bien ensemble.

Ensuite, vous intégrez le 3e module, puis les 4e et 5e dans l'ordre que vous ou votre équipe jugerez bon, et une fois que toutes les pièces du puzzle sont placées ensemble, vient

(3) Test du système: tester SW dans son ensemble. Il s'agit à peu près de «tests d'intégration de toutes les pièces ensemble».

Si ça va, alors vient

(4) Test d'acceptation: avons-nous construit ce que le client a demandé? Bien sûr, les tests d'acceptation doivent être effectués tout au long du cycle de vie , pas seulement à la dernière étape, où vous réalisez que le client voulait une voiture de sport et que vous avez construit une camionnette.

entrez la description de l'image ici

Andrejs
la source
2
J'ai vu beaucoup de photos comme celle-ci dans Google, qui décrivent le "Test unitaire" comme une sorte de "Test fonctionnel". Mais pourquoi alors d'autres réponses décrivent ici un concept absolument différent: le "test fonctionnel" est plutôt un test de bout en bout et le test unitaire n'est pas un test fonctionnel? Ai-je confondu. Il existe deux «religions» différentes qui définissent différemment le terme «test fonctionnel» ou quoi?
Ruslan Stelmachenko
Les réponses (même les plus votées) peuvent aussi être erronées;)
Andrejs
1
J'aime l'image, mais pour les tests d'intégration système, le puzzle devrait sembler "complet", sans plus de place pour d'autres pièces à connecter.
Jonathon Reinhart
4
@JonathonReinhart - pas nécessairement. Les bords ouverts peuvent représenter une extensibilité facile du système avec de nouvelles fonctionnalités, ce qui est particulièrement utile si vous utilisez une approche de développement comme Agile.
Myles
De multiples réponses contradictoires ci-dessus, ce Functional Testn'est évidemment pas un terme standardisé et a une signification différente pour différentes personnes.
Penghe Geng
12

"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 foo file.txtsur la ligne de commande, les lignes file.txtsont peut-être inversées. En revanche, un seul test unitaire couvre généralement un seul cas d'une seule méthode - length("hello")devrait retourner 5, et length("hi")devrait retourner 2.

Voir également la position d' IBM sur la ligne entre les tests unitaires et les tests fonctionnels .

Mark Rushakoff
la source
Eh bien, intéressant, mais le lien que vous montrez signifie quelque chose de différent: fonctionnel est une fonction à réaliser à travers l'implémentation, c'est-à-dire des tests du point de vue de l'utilisateur, c'est une fonction pour l'utilisateur.
Stefano Scarpanti
8

La distinction de base, cependant, est que les tests fonctionnels testent l'application de l'extérieur, du point de vue de l'utilisateur. Les tests unitaires testent l'application de l'intérieur, du point de vue du programmeur. Les tests fonctionnels devraient vous aider à créer une application avec les bonnes fonctionnalités et vous garantir de ne jamais la casser accidentellement. Les tests unitaires devraient vous aider à écrire du code propre et sans bogue.

Tiré du livre "Python TDD" de Harry Percival

Humoyun Ahmad
la source
8

Selon l'ISTQB, ces deux éléments ne sont pas comparables. Les tests fonctionnels ne sont pas des tests d'intégration.

Le test unitaire est un niveau de test et le test fonctionnel est un type de test.

Fondamentalement:

La fonction d'un système (ou d'un composant) est «ce qu'il fait». Ceci est généralement décrit dans une spécification d'exigences, une spécification fonctionnelle ou dans des cas d'utilisation.

tandis que

Les tests de composants, également appelés tests unitaires, de modules et de programmes, recherchent les défauts et vérifient le fonctionnement des logiciels (modules, programmes, objets, classes, etc.) qui peuvent être testés séparément.

Selon ISTQB, le composant / test unitaire peut être fonctionnel ou non fonctionnel:

Les tests de composants peuvent inclure des tests de fonctionnalité et des caractéristiques non fonctionnelles spécifiques telles que le comportement des ressources (par exemple des fuites de mémoire), des tests de performances ou de robustesse, ainsi que des tests structurels (par exemple la couverture de décision).

Citations des fondements des tests de logiciels - Certification ISTQB

Dominik
la source
Je suis d'accord sur trop de peluches, mais de toute façon, ils sont le plus grand joueur là-bas et cette question concernait la théorie, donc je pense que l'ISTQB devrait être assez bon.
Dominik
6

Dans Rails, le dossier unitaire est destiné à contenir des tests pour vos modèles, le dossier fonctionnel est destiné à contenir des tests pour vos contrôleurs, et le dossier d'intégration est destiné à contenir des tests qui impliquent un nombre illimité de contrôleurs interagissant. Les appareils sont un moyen d'organiser les données de test; ils résident dans le dossier fixtures. Le fichier test_helper.rb contient la configuration par défaut pour vos tests. vous pouvez visiter cela .

Bhimasen Rautaray
la source
3

La façon dont j'y pense est la suivante: un test unitaire établit que le code fait ce que vous vouliez faire (par exemple, vous vouliez ajouter les paramètres a et b, vous les ajoutez en fait et ne les soustrayez pas), les tests fonctionnels testent que tout le code fonctionne ensemble pour obtenir un résultat correct, de sorte que ce que vous vouliez que le code fasse en fait obtient le bon résultat dans le système.

Yishai
la source
3

AFAIK, les tests unitaires ne sont PAS des tests fonctionnels. Permettez-moi de vous expliquer avec un petit exemple. Vous souhaitez tester si la fonctionnalité de connexion d'une application Web de messagerie fonctionne ou non, comme le ferait un utilisateur. Pour cela, vos tests fonctionnels doivent être comme ça.

1- existing email, wrong password -> login page should show error "wrong password"!
2- non-existing email, any password -> login page should show error "no such email".
3- existing email, right password -> user should be taken to his inbox page.
4- no @symbol in email, right password -> login page should say "errors in form, please fix them!" 

Nos tests fonctionnels devraient-ils vérifier si nous pouvons nous connecter avec des entrées invalides? Par exemple. L'email n'a pas de symbole @, le nom d'utilisateur a plus d'un point (un seul point est autorisé), .com apparaît avant @ etc.? En général, non! Ce genre de test entre dans vos tests unitaires.

Vous pouvez vérifier si des entrées non valides sont rejetées dans les tests unitaires, comme indiqué dans les tests ci-dessous.

class LoginInputsValidator
  method validate_inputs_values(email, password)
    1-If email is not like [email protected], then throw error.
    2-If email contains abusive words, then throw error.
    3-If password is less than 10 chars, throw error.

Notez que le test fonctionnel 4 fait ce que fait le test unitaire 1. Parfois, les tests fonctionnels peuvent répéter certains (pas tous) des tests effectués par des tests unitaires, pour différentes raisons. Dans notre exemple, nous utilisons le test fonctionnel 4 pour vérifier si un message d'erreur particulier apparaît lors de la saisie d'une entrée non valide. Nous ne voulons pas tester si toutes les mauvaises entrées sont rejetées ou non. C'est le travail des tests unitaires.

MasterJoe2
la source
1
Bon point sur les tests fonctionnels ayant souvent une portée beaucoup plus étroite que les tests unitaires (en termes de tests fonctionnels plus axés sur la preuve que la fonction attendue est atteinte), mais je dirais qu'ils décrivent en quelque sorte différentes dimensions ( composition dans les tests unitaires vs but dans les tests fonctionnels); certains tests unitaires sont des tests fonctionnels, et certains tests fonctionnels sont des tests unitaires, mais il y a aussi beaucoup de Venn qui ne se chevauchent pas.
Myles
De bons exemples de ce qui est et n'est pas dans la portée des tests fonctionnels.
Myles
2

TEST D'UNITÉ

Le test unitaire comprend le test de la plus petite unité de code qui sont généralement des fonctions ou des méthodes. Les tests unitaires sont principalement effectués par le développeur d'unité / méthode / fonction, car ils comprennent le cœur d'une fonction. Le principal objectif du développeur est de couvrir le code par des tests unitaires.

Il a une limitation que certaines fonctions ne peuvent pas être testées par des tests unitaires. Même après la réussite de tous les tests unitaires; il ne garantit pas le bon fonctionnement du produit. La même fonction peut être utilisée dans quelques parties du système alors que le test unitaire n'a été écrit que pour une seule utilisation.

TEST FONCTIONEL

Il s'agit d'un type de test Black Box où les tests seront effectués sur les aspects fonctionnels d'un produit sans regarder le code. Les tests fonctionnels sont principalement effectués par un testeur de logiciels dédié. Il comprendra des techniques positives, négatives et BVA utilisant des données non standardisées pour tester la fonctionnalité spécifiée du produit. La couverture des tests est effectuée de manière améliorée par des tests fonctionnels plutôt que par des tests unitaires. Il utilise l'interface graphique de l'application pour les tests, il est donc plus facile de déterminer de quoi exactement une partie spécifique de l'interface est responsable plutôt que de déterminer de quoi un code est responsable.

Ashish Gupta
la source
2

très simplement on peut dire:

  • boîte noire: test d'interface utilisateur comme test fonctionnel
  • boîte blanche: test de code comme test unitaire

en savoir plus ici .

Alireza Rahmani Khalili
la source
@fafl Je suis désolé ma mauvaise
Alireza Rahmani Khalili
1

Test unitaire : - Le test unitaire est particulièrement utilisé pour tester le produit composant par composant spécialement pendant le développement du produit. Les types d'outils Junit et Nunit vous aideront également à tester le produit selon l'unité. ** Plutôt que de résoudre les problèmes après l'intégration, il est toujours confortable de le résoudre tôt dans le développement.

Tests fonctionnels: - En ce qui concerne les tests, il existe deux principaux types de tests: 1. test fonctionnel 2. test non fonctionnel.

Le test non fonctionnel est un test où un testeur testera que le produit exécutera tous les attributs de qualité que le client ne mentionne pas, mais ces attributs de qualité devraient être là. Comme: -Performances, utilisabilité, sécurité, charge, stress, etc. mais dans le test fonctionnel : - Le client est déjà présent avec ses exigences et celles-ci sont correctement documentées, la tâche des testeurs consiste à vérifier que la fonctionnalité de l'application fonctionne conformément au système proposé ou non. À cette fin, le testeur doit tester la fonctionnalité implémentée avec le système proposé.

mohit sarsar
la source
0

Les tests unitaires sont généralement effectués par les développeurs. L'objectif de faire de même est de s'assurer que leur code fonctionne correctement. La règle générale est de couvrir tous les chemins dans le code à l'aide de tests unitaires.

Test fonctionnel : c'est une bonne référence. Explication des tests fonctionnels

automationuser
la source
6
Veuillez coller le texte le plus important dans votre réponse, vous ne savez jamais quand la page pourrait être supprimée, ce qui rendrait le lien invalide.
Andrejs