1
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) !
2
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 :)
3
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
4
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) !
5
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 :)
6
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) !
7
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 :)
8
(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
9
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 :)
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) !
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
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é
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) !
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.
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©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.
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
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é
Kevin Kofler (./15) :
En général, pour les projets amateurs, le test unitaire est la spécificationn'existe pas
fixed
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.
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.
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
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
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é
hehe
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
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é
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.
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 :)
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
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
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é
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.
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
(Des tests ? Mais pourquoi faire ?! Il n'y a pas un client utilisateur, pour ça ? embarrassed )
avatar
(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