31 votes

Compression TDD et JPEG

Dans la tristement célèbre stackoverflow #38 podcast Joel parlé de la façon dont il serait difficile de faire TDD pour quelque chose comme la compression JPEG. Bob Martin a voulu couvrir comment le faire TDD pour une instance telle que celle au cours de podcast #41, mais je ne pense pas qu'ils aient jamais eu pour elle. Donc:

Comment peut-on aller sur l'aide de TDD pour développer et tester la compression jpeg?

71voto

Uncle Bob Points 3276

Joël question a été quelque chose comme cela. Supposons que vous vouliez définir un peu, quelque part, qui a entraîné une faible résolution de l'image à afficher plutôt que d'une image de haute résolution. Comment voulez-vous utiliser TDD à obtenir que cela fonctionne? Voulez-vous écrire un test qui s'est grattée l'écran pour indiquer que l'image était en basse résolution?

Bien sûr que non. Vous savez déjà que la bibliothèque JPEG fonctionne. Vous savez déjà que si vous l'appelez, avec les bons arguments, il affiche en basse résolution. Ce que vous avez besoin de tester, c'est que le peu que vous définissez se traduit dans les appels appropriés à la bibliothèque JPEG. Afin de vous moquer de la bibliothèque JPEG avec un module très simple contrôlé par votre test. Ensuite, vous définissez le bit, et demande l'affichage. La Moqué JPEG bibliothèque rappelez-vous comment il a été appelé, et le test à vérifier pour être sûr qu'elle a été appelée correctement.

OK, alors comment voulez-vous tester le fonctionnement interne de la bibliothèque JPEG? Je ne sais pas beaucoup sur les JPEG de rendu, mais je présume que c'est à propos de la compression, de décompression et de bitmaps. La Compression et la décompression sont juste des algorithmes. Les algorithmes de sorties prévisibles à partir des entrées. Si vous configurez une série très simples d'entrées et assurez-vous d'obtenir les sorties prévisibles. Vous configurez les entrées de sorte que le fonctionnement interne de l'JPEG algorithmes sont couverts. La même logique vaut pour les images. Vous n'avez pas à le faire sur l'écran. Simple petit bitmaps peuvent être rendus dans la mémoire tampon que les tests peuvent examiner. En simple, je veux dire SIMPLE. 3X3, 5X5, 8X8. Simple. Encore une fois, la structure de vos données d'entrée pour couvrir la majeure partie du code.

Rien de tout cela est la science de fusée. Aucun, si elle est parfaite. Mais une suite de 50 tests qui montre que 90% de votre logique est correcte peut faire une énorme différence lorsque vous souhaitez apporter des modifications.

Pouvez-vous jamais complètement éliminer le manuel de tests? Bien sûr que non. Mais vous pouvez de manière significative à l'atténuer. Vous pouvez réduire les tests manuels à quelques très stratégique tests plutôt que de milliers de douloureusement fastidieux plans de test.

4voto

S.Lott Points 207588

Si vous pensez que TDD signifie tests viennent avant tout code ou de la conception, c'est en grande partie impossible. Pour des algorithmes complexes, vous avez besoin de quelques résultats. Et dans le cas de la compression, les résultats sont difficiles à produire à la main. Pas impossible, mais difficile.

En outre, la compression nécessite une très haute performance de l'algorithme. Tout simplement en passant un test n'est pas assez bonnes. De nombreux bas-performance des algorithmes pouvez passer à la base de la "correction" de test.

Pour aller au-delà de la justesse, vous avez besoin d'une preuve que votre algorithme est optimal. Ce ne peut être développé en dehors des tests de vision du monde. Vous avez besoin d'une analyse de la complexité en utilisant O( quelque chose ), ce qui n'est pas le résultat d'un test; il ne peut être bien définis comme les résultats d'un test.

Si, d'autre part, vous pensez que "testabilité" vient avant la plupart du code, alors c'est facile.

  • La conception de votre algorithme. Écrire une preuve qu'il est optimal.

  • Écrire du code qui expose les éléments clés de votre algorithme testable modules.

  • Dans certains cas, écrire du code pour produire des résultats de test pour l'ensemble de l'algorithme. Cela peut être sous-optimale, brute-force de code qui génère le droit de réponse par le biais vraiment évident, mais la lenteur des algorithmes.

  • Assembler un unittest pour montrer que votre mise en œuvre le produit attendu des résultats de test.

  • Assembler un document technique pour montrer que c'est également optimal.

Ce n'est pas en testant d'abord. Mais il est piloté par les tests.

0voto

arielsan Points 78

Le développement piloté par les tests n'est pas seulement de la programmation, il y a beaucoup d'autres choses que vous pouvez faire en utilisant le test en premier, les exemples sont avec l'acceptation tdd, etc.

Pensez d'abord à la façon dont vous voulez qu'il se comporte, c'est la chose Pour un algorithme, un exemple pourrait être quelque chose comme:

  • "Il doit terminer 5 appels en 10 secondes"
  • "Il faut réduire à 10% la taille de l'image"
  • Autres.

Je crois que ce n'est qu'un mode de vie de penser clairement ce que vous voulez accomplir: D

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X