J'ai eu un peu d'expérience avec les tests unitaires auparavant, dans ce que j'appelle (pas péjorativement) le projet classique d'ingénierie logicielle: un MVC, avec une interface utilisateur graphique, une base de données, une logique métier dans la couche intermédiaire, etc. Je suis en train d'écrire une bibliothèque de calcul scientifique en C # (ouais, je sais que le C # est trop lent, utilisez C, ne réinventez pas la roue, et tout ça, mais nous avons beaucoup de gens qui font du calcul scientifique dans ma faculté en C #, et nous en avons besoin). C'est un petit projet, en termes de développement de logiciels, car je l'écris principalement par moi-même, et de temps en temps avec l'aide de quelques collègues. De plus, je ne suis pas payé pour ça, et le plus important, c'est un projet académique. Je veux dire, je m'attends à ce qu'il ait une qualité professionnelle un jour, parce que je prévois de devenir open source,
Quoi qu'il en soit, le projet prend de l'ampleur (environ 18 000 lignes de code, ce qui, je pense, est important pour un projet d'un homme), et il me dépasse. J'utilise git pour le contrôle de code source, et je pense que je me sens bien, mais je teste comme à l'ancienne, je veux dire, en écrivant des applications de console complètes qui testent une grande partie du système, principalement parce que je ne sais pas comment faire des tests unitaires dans ce scénario, même si je pense que c'est ce que je devrais faire. Le problème est que la bibliothèque contient principalement des algorithmes, par exemple, des algorithmes de graphe, des classificateurs, des solveurs numériques, des distributions aléatoires, etc. Je ne sais tout simplement pas comment spécifier de minuscules cas de test pour chacun de ces algorithmes, et puisque beaucoup d'entre eux sont stochastique Je ne sais pas comment valider l'exactitude. Pour la classification, par exemple, il existe des mesures telles que la précision et le rappel, mais ces métriques sont meilleures pour comparer deux algorithmes que pour juger un seul algorithme. Alors, comment puis-je définir l'exactitude ici?
Enfin, il y a aussi le problème des performances. Je sais que c'est un ensemble de tests complètement différent, mais les performances sont l'une des caractéristiques importantes des outils scientifiques, plutôt que la satisfaction des utilisateurs ou d'autres mesures de génie logiciel.
L'un de mes plus gros problèmes concerne les structures de données. Le seul test que je peux trouver pour un arbre kd est un test de stress: insérez un grand nombre de vecteurs aléatoires, puis effectuez un grand nombre de requêtes aléatoires et comparez avec une recherche linéaire naïve. La même chose pour les performances. Et avec des optimiseurs numériques, j'ai des fonctions de référence que je peux tester, mais là encore, c'est un test de résistance. Je ne pense pas que ces tests puissent être classés comme des tests unitaires et, plus important encore, exécutés en continu, car la plupart d'entre eux sont plutôt lourds. Mais je pense aussi que ces tests doivent être effectués, je ne peux pas simplement insérer deux éléments, éclater la racine, et oui, cela fonctionne pour le cas 0-1-n.
Alors, quelle est, le cas échéant, l'approche de test (unitaire) pour ce type de logiciel? Et comment organiser les tests unitaires et les tests lourds autour du cycle de construction de code-validation-intégration?