J'ai constaté que beaucoup de mes programmes de science informatique ont des exigences de test qui ne sont pas couvertes par les cadres de test standard:
Test de temps de calcul
- Pour vous assurer que les algorithmes ne ralentissent pas. Je pourrais faire quelque chose comme
assureSmallerEqual(RuntimeWrapper(algorithm),53)
mais j'aimerais que le seuil de 53 secondes soit continuellement réduit pendant que je travaille sur l'algorithme, c'est-à-dire quelque chose commeassureSmallerEqual(RuntimeWrapper(algorithm),'previousbest+noisetolerance')
- Pour vous assurer que les algorithmes ne ralentissent pas. Je pourrais faire quelque chose comme
Test de performance
- Pour s'assurer qu'un algorithme qui a précédemment trouvé une bonne approximation d'une solution analytique trouve toujours une solution au moins aussi bonne ou meilleure. Encore une fois, cela pourrait être une émulation par un test d'intégration standard, mais j'aimerais que la tolérance diminue de façon continue à mesure que l'algorithme s'améliore. Pensez à remplacer
assureAlmostEqual(foo(),1,places=3)
parassureAlmostEqual(foo(),1,places='previousbest')
- Pour s'assurer qu'un algorithme qui a précédemment trouvé une bonne approximation d'une solution analytique trouve toujours une solution au moins aussi bonne ou meilleure. Encore une fois, cela pourrait être une émulation par un test d'intégration standard, mais j'aimerais que la tolérance diminue de façon continue à mesure que l'algorithme s'améliore. Pensez à remplacer
Test des exigences physiques
- Pour vous assurer que les algorithmes n'ont pas soudainement besoin de plus d'espace mémoire / disque dur. Très similaire à 1.
Test des exigences abstraites
- Pour vous assurer qu'un algorithme qui fonctionnait correctement avec des approximations quadratiques n'a pas soudainement besoin d'approximations cubiques, ou qu'un algorithme qui fonctionnait correctement avec le pas de temps 0,1 n'a pas soudainement besoin de 0,01 pour la stabilité. Encore une fois, ceux-ci pourraient être émulés par des tests d'intégration standard, mais l'objectif est de se souvenir du plus petit paramètre d'exigence qui a atteint un certain objectif, ce qui nécessiterait beaucoup de mises à jour manuelles. Par exemple, si
foo(10)
auparavant il n'y avait pas d'exceptions, j'aimerais que le framework s'assure que celafoo(10)
fonctionne toujours et essaye aussi s'ilfoo(9)
fonctionne maintenant (auquel cas tous les tests futurs garantiraientfoo(9)
qu'il fonctionne toujours).
- Pour vous assurer qu'un algorithme qui fonctionnait correctement avec des approximations quadratiques n'a pas soudainement besoin d'approximations cubiques, ou qu'un algorithme qui fonctionnait correctement avec le pas de temps 0,1 n'a pas soudainement besoin de 0,01 pour la stabilité. Encore une fois, ceux-ci pourraient être émulés par des tests d'intégration standard, mais l'objectif est de se souvenir du plus petit paramètre d'exigence qui a atteint un certain objectif, ce qui nécessiterait beaucoup de mises à jour manuelles. Par exemple, si
On pourrait faire valoir que ce que je demande ne décrit pas les tests dans le sens de tests unitaires / d'intégration, car l'augmentation des durées d'exécution, par exemple, pourrait être acceptable en échange d'autres améliorations.
Dans la pratique, cependant, je sais que j'aurais économisé beaucoup de temps de débogage si j'avais eu la fonctionnalité de test ci-dessus, car dans 95% des cas, les exigences et les performances ont mal tourné en raison des bogues que j'ai introduits. En effet, je sais pertinemment que beaucoup de bogues que j'ai trouvés (après beaucoup de temps perdu à vérifier mon propre code) avec des bibliothèques de logiciels numériques externes auraient pu être évités trivialement si les tests ci-dessus avaient été appliqués rigoureusement.
PS
La question du même nom /programming/34982863/framework-for-regression-testing-of-numerical-code n'est pas un doublon car elle décrit une fonctionnalité qui est plus facilement réalisable avec les cadres de test de régression standard.
La question Stratégies pour les tests unitaires et le développement piloté par les tests demande des stratégies par opposition à un cadre qui aide à les mettre en œuvre (et les stratégies qu'il demande / qui sont fournies dans les réponses sont différentes de ce que je décris ici, à mon avis).