Nous avons une grande, application multi-plateforme écrit en C. (avec un petit, mais de plus en plus de C++), Il a évolué au fil des années avec de nombreuses fonctionnalités que vous attendez d'une grande application C/C++:
-
#ifdef
l'enfer - De gros fichiers qui font qu'il est difficile d'isoler de code de tests
- Les fonctions qui sont trop complexes pour être facilement testables
Étant donné que ce code est destiné pour les systèmes embarqués, c'est beaucoup de frais généraux pour l'exécuter sur la cible réelle. Nous voudrions donc faire plus de notre développement et de tests dans le rapide de cycles, sur un système local. Mais nous voudrions éviter la stratégie classique de "copier/coller dans un .c fichier sur votre système, corriger les bugs, copier/coller le dos". Si les développeurs vont aller de la peine pour ce faire, nous aimerions être en mesure de recréer les mêmes tests plus tard, et de les exécuter dans un mode automatisé.
Voici notre problème: afin de refactoriser le code pour être plus modulaire, nous avons besoin de plus de tests. Mais dans le but d'introduire des tests unitaires automatisés, nous en avons besoin pour être plus modulaire.
Un problème est que depuis que nos fichiers sont volumineux, on pourrait avoir une fonction à l'intérieur d'un fichier qui appelle une fonction dans le même fichier que nous avons besoin de stub pour faire un bon test de l'unité. Il semble que ce serait moins un problème que notre code devient de plus en plus modulaire, mais c'est un long chemin.
Une chose que nous avons pensé à faire était de marquage "connu pour être testable" source code avec des commentaires. Ensuite, on pourrait écrire un script d'analyse des fichiers source pour les tests de code, le compiler dans un fichier séparé, et faire le lien avec les tests unitaires. Nous pourrions introduire lentement les tests unitaires que nous corriger les défauts et ajouter plus de fonctionnalités.
Toutefois, il est à craindre que le maintien de ce régime (avec toutes les fonctions stub) deviendra trop de tracas, et les développeurs d'arrêter de maintenir les tests unitaires. Une autre approche consiste à utiliser un outil qui génère automatiquement les stubs pour tout le code, et le lien du fichier. (le seul outil que nous avons trouvée pour ce faire est cher produit commercial), Mais cette approche semble exiger que tout notre code plus modulaire avant même de commencer, puisque seuls les appels externes peuvent être écrasé.
Personnellement, je préfère les développeurs de penser au sujet de leurs dépendances externes et intelligemment écrire leurs propres talons. Mais ce qui pourrait être écrasante pour écraser toutes les dépendances pour une horrible et envahis par la végétation, de 10 000 ligne de fichier. Il peut être difficile de convaincre les développeurs qu'ils ont besoin pour maintenir les stubs pour toutes leurs dépendances externes, mais est-ce la bonne façon de le faire? (Un autre argument que j'ai entendu, c'est que le responsable d'un sous-système doit maintenir les talons de ses sous-systèmes. Mais je me demande si "forcer" les développeurs d'écrire leurs propres talons conduirait à de meilleurs tests unitaires?)
Le #ifdefs, bien sûr, ajouter une toute autre dimension au problème.
Nous avons regardé plusieurs C/C++ en fonction de l'unité de frameworks de test, et il y a beaucoup d'options qui ont l'air bien. Mais nous n'avons pas trouvé de quoi faciliter la transition de "boules de code sans tests unitaires" à "l'unité de code de tests".
Voici donc mes questions à quelqu'un d'autre qui a été à travers ce:
- Ce qui est un bon point de départ? Nous allons dans la bonne direction, ou bien sommes-nous manque quelque chose d'évident?
- Les outils qui pourraient être utiles pour aider à la transition? (de préférence gratuit et open-source, car notre budget est à peu près "zéro")
Remarque, notre environnement est sous Linux/UNIX, donc on ne peut pas utiliser n'importe quel Windows-seulement les outils.