Posté le 17/07/2016 à 08:09 Membre depuis le 18/06/2001, -26077 message
yop,

Comment met-on en place des tests unitaires ?
Je suis sur la fin d'un petit programme, et j'aimerais qu'il me serve de chamsp d'expérimentation. Malheureusement je sais pa du tout par quel bout commencer.
Et d'abord un test, qu'est-ce que c'est ? Un projet externe au projet à tester ? Des fichiers sources inclus au programme lui-même (ça m'étonnerait) ?

Je suis dans le cadre d'un petit projet Qt, tout à fait de ce genre : https://github.com/Folcogh/FMetro

Merci d'avance.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 17/07/2016 à 18:09 Membre depuis le 13/06/2002, 42694 messages
C'est un sujet hyper vaste, il faudrait un pavé monumental pour commencer à répondre à une question aussi générale que "c'est quoi un test". Je pense qu'il vaut mieux que tu essaies de restreindre un peu plus le contexte si tu veux que qu'un prenne le temps de rédiger une réponse ^^
avatarAll right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)
Posté le 17/07/2016 à 23:02 Membre depuis le 11/07/2003, 54841 messages
bah non, c'est simple : un test sert à valider le comportement d'un bout de code (qui peut être le programme complet, voire l'environnement complet). Tu es censé connaître l'issue de l'exécution, et cette exécution ne sert pas à produire quelque chose d'intéressant.

Après, tu peux vouloir tester plein de choses : un petit bout de code, le programme complet, l'environnement (avec la machine voire l'infrastructure), pour plein de raisons : valider que ta nouvelle fonction renvoie le bon résultat, ou valider que tes modifications n'ont pas changé le comportement précédent, valider que le programme réponde au cahier des charges, etc.

Bon, pour le reste, plein de gens auront des définitions différentes de chaque terme, mais je peux essayer ^^
Les tests unitaires portent plutôt sur des petites unités de code (par exemple une fonction ou méthode), et c'est plutôt propre au dév (le client ne connaît pas tes fonctions internes). Imaginons que tu fasses une fonction qui mette une string en majuscule. Tu fais un petit code qui va tester quelques cas classiques (une chaîne bête, des accents, …) et voir si ça fonctionne bien.
En général, tu as des framework pour faciliter le lancement du test (pas de main à écrire) et la vérification des résultats.
avatar<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant
Posté le 17/07/2016 à 23:22 Membre depuis le 18/06/2001, -26077 message
Donc concrètement, je veux tester les méthodes de mes différentes classes. Comment dois-je m'y prendre, créer un projet par classe, importer la classe dans le projet et écrire pleins de tests ? Ou alors il y a une façon un peu plus élégante de faire des tests que de créer 15 projets pour en tester un ?
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 17/07/2016 à 23:28 Membre depuis le 13/06/2002, 42694 messages
C'est quoi dans ton contexte, un projet ? Ce qui se voit souvent pour les tests unitaires c'est de maintenir quelque chose qui soit un peu le miroir du projet testé, par exemple d'avoir une classe de test pour chaque classe à tester dans ton programme. En revanche au niveau des méthodes il est probable que tu veuilles tester plusieurs critères différents pour certaines méthodes complexes, ce qui te fera plein de petites méthodes de test pour une seule méthode à tester.
avatarAll right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)
Posté le 17/07/2016 à 23:33 Membre depuis le 18/06/2001, -26077 message
Ce que j'appelle un projet, c'est ça par exemple : https://github.com/Folcogh/FMetro
Un programme C++/Qt, qui compile en un exécutable.

Je me demande comment mettre en place des tests (dans un autre projet TestFMetro ?) sans avoir à copier/coller les fichiers sources du projet concerné vers le projet test à chaque update.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 17/07/2016 à 23:36 Membre depuis le 13/06/2002, 42694 messages
Ah OK, alors non, pourquoi veux-tu mettre tes tests dans un autre repository que celui qui contient le code ? L'intérêt c'est de garder les deux ensemble pour être sûr qu'ils évoluent en parallèle justement. Chaque fois que tu ajouteras du code tu ajouteras les tests correspondants, ou tu modifieras ceux qui doivent l'être pour ne jamais les casser. D'ailleurs puisque tu utilises GitHub tu seras peut-être intéressé par des outils qui font automatiquement tourner tes tests à chaque commit, comme https://travis-ci.org smile
avatarAll right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)
Posté le 17/07/2016 à 23:38 Membre depuis le 11/07/2003, 54841 messages
(au passage, faire des tests unitaires te fera détester les variables globales et apprécier les blocs de code qui n'ont pas d'effet de bord)
avatar<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant
Posté le 17/07/2016 à 23:42 Membre depuis le 13/06/2002, 42694 messages
Et peu après, faire des tests unitaires et devoir les exécuter en parallèle te fera même détester les gens qui ne détestent pas les variables globales, les blocs de code avec effets de bord et d'une façon générale tout bout de code dont les dépendances ne sont pas injectables ^^
avatarAll right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)
Posté le 17/07/2016 à 23:48 Membre depuis le 18/06/2001, -26077 message
Tant mieux, je ne demande pas mieux que de coder proprement, je suis preneur de toutes les bonnes manières que je pourrai trouver, et merci beaucoup pour le lien ! grin

Tiens, je viens de me trouver un lien ici : http://doc.qt.io/qt-5/qttestlib-tutorial1-example.html
Plus qu'à trouver comment ça s'intègre proprement dans un projet Qt.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 18/07/2016 à 00:15 Membre depuis le 10/06/2001, 40278 messages
Zeph (./7) :
Ah OK, alors non, pourquoi veux-tu mettre tes tests dans un autre repository que celui qui contient le code ?
À mon avis, parce qu'il est dans la logique centrée EDI où un dépôt = un projet EDI = un exécutable. smile

Les EDIs ont souvent des fonctionnalités dédiées pour gérer correctement les tests et t'éviter de créer un projet séparé pour les tests (voire un par test sick). Pour KDevelop, ça existe depuis la version 4.5.0:
https://dot.kde.org/2012/12/12/katekdevelop-october-sprint-whats-new-kdevelop
https://noughmad.wordpress.com/2012/04/24/becoming-a-kdeveloper/ (version corrigée du lien dans la news ci-dessus)
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité
Posté le 18/07/2016 à 06:23 Membre depuis le 18/06/2001, -26077 message
Très intéressant, merci bien, car même si c'est pour Qt Creator que je cherche ça, je code aussi avec KDevelop parfois.
Je viens de voir ça : http://doc.qt.io/qtcreator/creator-autotest.html
Je vais voir de ce côté. smile
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 18/07/2016 à 08:06 Membre depuis le 30/06/2001, 37149 messages
J'ai envie de poser une autre question: est-ce que tu as une spécification pour ton projet? Car formellement, il n'est pas possible de tester quelque chose dont le comportement n'est pas clairement défini (en général ce qui arrive dans ce cas, c'est que quand un test ne passe pas on ne sait pas si c'est à cause du test ou du projet, et ça finit souvent par un crétin qui change le test à la place du code).
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
Posté le 18/07/2016 à 09:43 Membre depuis le 30/06/2001, 71426 messages
Ximoon (./13) :
J'ai envie de poser une autre question: est-ce que tu as une spécification pour ton projet? Car formellement, il n'est pas possible de tester quelque chose dont le comportement n'est pas clairement défini (en général ce qui arrive dans ce cas, c'est que quand un test ne passe pas on ne sait pas si c'est à cause du test ou du projet, et ça finit souvent par un crétin qui change le test à la place du code).

Ha tiens je connais ca, mais des fois c'était justifié le test faisait ou testé des trucs de maniere on ne peu plus crétine, et changer ce qui était testé cassais le test pour des raisons évidentes.
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o
Posté le 18/07/2016 à 12:42 Membre depuis le 10/06/2001, 40278 messages
En général, pour les projets amateurs, le test unitaire est la spécification. gni

Et une spécification peut être tout aussi incorrecte (cas particulier oublié ou traîté incorrectement, etc.) qu'un test. Je ne sais pas comment ça se passe chez vous dans l'aérospatial, mais dans le monde réel (wink), une spécification, ça se change aussi.
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité
Posté le 18/07/2016 à 15:09 Membre depuis le 10/06/2001, 45115 messages
Kevin Kofler (./15) :
En général, pour les projets amateurs, le test unitaire est la spécificationn'existe pas
fixed
Posté le 18/07/2016 à 16:55 Membre depuis le 30/06/2001, 37149 messages
Et pour faire plaisir à 0²:
http://wwwis.win.tue.nl/2R690/doc/ECSS-E-ST-40C(6March2009).pdf (clause 5.5.3.2 + annexe K (principalement chapitres 8sqq)).

Ensuite pour répondre à la question, dans mes projets les tests unitaires font normalement partie du projet lui-même et sont dans des dossiers "Tests" contenus dans chaque dossiers de chaque module intégré à l'arborescence du projet. J'ai un serveur d'intégration continue (en l'occurrence Jenkins) qui s'occupe de compiler et d'exécuter tous les tests à chaque commit (rien de bien original).
Pour les frameworks, j'ai des petits projets en C avec simplement "Check" ( http://check.sourceforge.net/doc/check_html/ ), et de plus gros trucs qui utilisent Cantata (qui n'est pas exactement gratuit).

À mon sens, le test unitaire a trois principales utilités:
- Vérifier que le code est conforme aux exigences (ces exigences pouvant être testées au niveau du projet entier, ou au niveau unitaire justement, et comme je disais, si on ne sait pas ce que le programme doit faire il est difficile de le tester),
- Vérifier la stabilité du code (en testant automatiquement des valeurs critiques (par exemple 0, NULL, etc.), les valeurs limites, etc.),
- Vérifier qu'une modification dans un module n'a pas d'effets de bords ailleurs (tests de non-régression).
En bonus, tu peux coupler tes tests unitaires avec les tests de couverture (dans le cas de Check, on peut directement utiliser gcov) pour voir quelle proportion de ton code tu testes (en gros ça va lister toutes les lignes de code exécutées), et détecter par exemple du code mort.

Comme dit Flanker, les tests unitaires, comme leur nom l'indiquent, ciblent des petites portions de code (typiquement des fonctions seules, en stubbant les appels qu'elles font). Pour tester un fonctionnement plus complexe (plusieurs fonctions, classes ou modules interagissant), on parle plutôt de tests d'intégration ou de tests système. Le concept reste le même à plus haut niveau mais ils demandent souvent une infrastructure plus complexe, voire dédiée.
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
Posté le 18/07/2016 à 17:05 Membre depuis le 11/06/2001, 19563 messages
Perso, je préfère faire des tests d'intégrations que des tests unitaires (coupler à une mesure de couverture de code): cela permet de détecter bien plus de bugs, voire de détecter du vrai code mort.
Posté le 18/07/2016 à 17:26 Membre depuis le 11/07/2003, 54841 messages
PpHd (./18) :
Perso, je préfère faire des tests d'intégrations que des tests unitaires (coupler à une mesure de couverture de code): cela permet de détecter bien plus de bugs, voire de détecter du vrai code mort.
J'essaie de faire les deux ; de plus pour les tests unitaires j'essaie d'utiliser des frameworks comme hypothesis en Python, qui permettent de lancer le code avec plein de valeurs et notamment des cas particuliers (genre 0, -1, 1, 256, MAX_INT, …) et vérifier que tout se comporte bien.
avatar<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant
Posté le 19/07/2016 à 00:36 Membre depuis le 10/06/2001, 40278 messages
Pen^2 (./16) :
Kevin Kofler (./15) :
En général, pour les projets amateurs, le test unitaire est la spécificationn'existe pas
fixed
Oui, si le test unitaire existe, évidemment. gni Mais si l'ensemble des tests unitaires est l'ensemble vide, celui des spécifications l'est aussi et donc ma proposition reste vraie. tongue
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité
Posté le 19/07/2016 à 00:40 Membre depuis le 10/06/2001, 45115 messages
hehe
Posté le 19/07/2016 à 01:07 Membre depuis le 10/06/2001, 40278 messages
flanker (./19) :
PpHd (./18) :
Perso, je préfère faire des tests d'intégrations que des tests unitaires (coupler à une mesure de couverture de code): cela permet de détecter bien plus de bugs, voire de détecter du vrai code mort.
J'essaie de faire les deux ; de plus pour les tests unitaires j'essaie d'utiliser des frameworks comme hypothesis en Python, qui permettent de lancer le code avec plein de valeurs et notamment des cas particuliers (genre 0, -1, 1, 256, MAX_INT, …) et vérifier que tout se comporte bien.
Il y a aussi les fuzzeurs, qui essaient de spammer tes fonctions avec plein de paramètres aléatoires, souvent dépourvus de sens, pour voir si elles plantent.
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité
Posté le 19/07/2016 à 09:52 Membre depuis le 30/06/2001, 71426 messages
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
yN a cassé ma signature :o
Posté le 20/07/2016 à 23:29 Membre depuis le 13/06/2002, 42694 messages
Tant qu'à faire, ça me parait moins malin et moins puissant que le mutation testing.
avatarAll right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)
Posté le 21/07/2016 à 01:17 Membre depuis le 27/04/2006, 60483 messages
Intéressant comme principe ^^
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
Posté le 21/07/2016 à 03:09 Membre depuis le 10/06/2001, 40278 messages
Oui, mais l'article mentionne déjà son principal défaut: une modification peut être équivalente, et tu ne peux en général pas prouver automatiquement que ce ne soit pas le cas (le problème d'équivalence est équivalent au problème de l'arrêt, qui est insoluble dans le cas général). Et en plus, l'équivalence peut même porter sur des propriétés en dehors du modèle habituel de machine de Von Neumann. Par exemple, les espaces fantôme lors de l'accès à la mémoire, le cas où plusieurs fonctions différentes de bibliothèques externes peuvent avoir le même comportement dans des cas particuliers etc. Du coup, il te faudra repérer manuellement tous les faux positifs.
avatarMes news pour calculatrices TI: Ti-Gen (fr/en), MobiFiles (de)
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité
Posté le 21/07/2016 à 14:50 Membre depuis le 30/06/2001, 37149 messages
Ah tiens, il faudra que je parle de ça à mes responsables qualité grin
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
Posté le 21/07/2016 à 15:07 Membre depuis le 11/07/2003, 54841 messages
rigolo, je ne connaissais pas happy
je vais ajouter ça à ma boîte à outil Python (et je vais me dépêcher de ne pas m'en servir)^^
avatar<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant
Posté le 21/07/2016 à 16:21 Membre depuis le 13/06/2001, 73050 messages
(Des tests ? Mais pourquoi faire ?! Il n'y a pas un client utilisateur, pour ça ? embarrassed )
avatar
Posté le 21/07/2016 à 16:47 Membre depuis le 11/07/2003, 54841 messages
(chut, ne le dis pas à Bob !)
avatar<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant