web-dev-qa-db-fra.com

Tests unitaires vs tests fonctionnels

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

370
mousey

Test d'unité - teste 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, teste 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.

230
bpapa

Les tests unitaires indiquent à un développeur que le code fait bien les choses; les tests fonctionnels indiquent au développeur que le code fait ce qu'il faut faire .

Vous pouvez en savoir plus sur Test unitaire ou test fonctionnel


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 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 fonctionnels.

Les tests unitaires sont analogues à ceux d'un inspecteur en bâtiment sur le site de construction 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 (tests) que les pièces de la maison fonctionneront correctement et en toute sécurité, c'est-à-dire qu'elles répondent au code du bâtiment.

Les tests fonctionnels dans ce scénario sont analogues à ceux du propriétaire visitant ce même site de construction. Il suppose que les systèmes internes se comporteront correctement, que l'inspecteur en bâtiments s'acquitte de 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 ont une taille confortable, la maison est adaptée aux besoins de la famille, les fenêtres sont bien placées 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âtiments effectue des tests unitaires sur la maison. Il a la perspective du constructeur.


En résumé,

Les tests unitaires sont écrits à partir d'une perspective programmeurs. Ils sont conçus pour garantir qu’une méthode particulière (ou une nité) d’une classe exécute un ensemble de tâches spécifiques.

Les tests fonctionnels sont écrits à partir de la perspective tilisateur. Ils s'assurent que le système est fonctionnel comme le prévoient les utilisateurs.

480
Anthony Forloney
  • Un test unitaire teste un nité de comportement indépendante. Qu'est-ce qu'une unité de comportement? C'est la plus petite pièce du système qui peut être testée indépendamment par une unité. (Cette définition est en fait circulaire, mais ce n’est vraiment pas une définition du tout, mais elle semble fonctionner assez bien dans la pratique, car vous pouvez en quelque sorte la 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 mantra stupide du "test d'une unité par méthode", d'un point de vue de taille, c'est à peu près correct. Une unité de comportement est quelque chose entre une partie d'une méthode et peut-être deux méthodes. Tout au plus un objet, mais pas plus d'un.

  • Une fonctionnalité comporte généralement de nombreuses méthodes et traverse plusieurs objets et souvent plusieurs couches architecturales.


  • Un test unitaire pourrait ressembler à quelque chose du genre: quand j'appelle la fonction validate_country_code() et lui passe le code de pays 'ZZ', elle devrait retourner false.

  • Voici un test fonctionnel: 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.


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

  • Les tests fonctionnels peuvent concerner les 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. Ils peuvent aussi être confrontés aux développeurs (par exemple, lorsqu'ils décrivent une fonctionnalité interne dont l'utilisateur se moque), auquel cas ils sont écrits par des développeurs, pour les 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 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.


137
Jörg W Mittag

TLDR:

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


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

enter image description here

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

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

(2) Test d'intégration: lorsque vous mettez deux ou plusieurs modules de (sous) modules ou (sous) systèmes ensemble pour vérifier s'ils fonctionnent correctement.

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

(3) Test du système: teste le logiciel dans son ensemble. C’est à peu près "des tests d’intégration de tous pièces ensemble".

Si ça va, alors vient

(4) Test d'acceptation: avons-nous construit ce que le client avait 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, lorsque vous réalisez que le client voulait une voiture de sport et que vous avez construit une fourgonnette.

enter image description here

87
Andrejs

"Test fonctionnel" ne signifie pas que vous testez une fonction (méthode) dans votre code. Cela signifie généralement que vous testez les fonctionnalités du système. Lorsque j'exécute foo file.txt sur la ligne de commande, les lignes de file.txt sont peut-être inversées. En revanche, un seul test unitaire couvre généralement un seul cas d'une seule méthode - length("hello") doit renvoyer 5 et length("hi") doit en renvoyer 2.

Voir aussi position d'IBM entre les tests unitaires et les tests fonctionnels .

12
Mark Rushakoff

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

Le test unitaire est l'un des tests de niveau et le test fonctionnel est le type de test.

Fondamentalement:

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

tandis que

Le test de composant, également appelé test d'unité, de module et de programme, recherche les défauts dans le logiciel et vérifie le fonctionnement de logiciels (modules, programmes, objets, classes, etc.) pouvant être testés séparément.

Selon ISTQB, le test des composants/unités peut être fonctionnel ou non fonctionnel:

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

Citations de Fondements du test logiciel - Certification ISTQB

8
Dominik

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 dotée des fonctionnalités adéquates et à garantir que vous ne la cassez jamais accidentellement. Les tests unitaires devraient vous aider à écrire du code propre et sans bug.

extrait du livre "Python TDD" de Harry Percival

7
Humoyun Ahmad

Dans Rails, le dossier d'unité est destiné à contenir des tests pour vos modèles, le dossier fonctionnel à des tests pour vos contrôleurs et le dossier d'intégration est destiné à contenir des tests impliquant un nombre quelconque de contrôleurs en interaction. 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 this .

6
Bhimasen Rautaray

Autant que je sache, les tests unitaires ne constituent PAS des tests fonctionnels. Laissez-moi 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 devraient ê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 non valides? Par exemple. L'e-mail n'a pas de symbole @, le nom d'utilisateur a plus d'un point (un seul point est autorisé), .com apparaît avant @, etc.? Généralement non! Ce type de test va 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 apparaît lors de la saisie d'une entrée non valide. Nous ne voulons pas tester si toutes les entrées incorrectes sont rejetées ou non. C'est le travail des tests unitaires.

3
MasterJoe2

La façon dont je le conçois 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 vérifient que tout le code fonctionne ensemble pour obtenir un résultat correct, de sorte que l'objectif recherché par le code obtienne le résultat correct dans le système.

3
Yishai

NIT TESTING

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 les développeurs d'unités/méthodes/fonctions, car ils comprennent le cœur d'une fonction. L'objectif principal du développeur est de couvrir le code par des tests unitaires.

Il y a une limite au fait que certaines fonctions ne peuvent pas être testées à l'aide de tests unitaires. Même après la réussite de tous les tests unitaires; cela 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 utilisation.

TEST FONCTIONNEL

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

2
Ashish Gupta

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 outils de type Junit et Nunit vous aideront également à tester le produit conformément à l’unité. ** Plutôt que de résoudre les problèmes après l'intégration, il est toujours pratique de le résoudre au début du développement.

Test fonctionnel: - En ce qui concerne le test, il existe deux types principaux de test: 1.Functional Test 2.Non-Functional Test.

Le test non fonctionnel est un test dans lequel un testeur vérifie que le produit exécute tous les attributs de qualité que le client ne mentionne pas, mais que ces attributs de qualité devraient être présents. Comme: - Performances, convivialité, 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 que la fonctionnalité d’application fonctionne ou non conformément au système proposé. À cette fin, le testeur doit tester la fonctionnalité implémentée avec le système proposé.

1
mohit sarsar

Les tests unitaires sont généralement effectués par les développeurs. L'objectif est de s'assurer que leur code fonctionne correctement. La règle générale est de couvrir tous les chemins dans le code en utilisant des tests unitaires.

Test fonctionnel : Ceci est une bonne référence. Explication du test fonctionnel

0
automationuser

très simplement on peut dire:

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

lire plus ici .

0