Personnellement, j'aime le Cadre de test Google .
La vraie difficulté pour tester du code C est de briser les dépendances sur les modules externes afin de pouvoir isoler le code en unités. Cela peut être particulièrement problématique lorsque vous essayez de tester du code hérité. Dans ce cas, je me retrouve souvent à utiliser le linker pour utiliser des fonctions stubs dans les tests.
C'est à cela que les gens font référence lorsqu'ils parlent de " coutures ". En C, votre seule option est d'utiliser le préprocesseur ou l'éditeur de liens pour déterminer vos dépendances.
Une suite de tests typique dans un de mes projets C peut ressembler à ceci :
#include "myimplementationfile.c"
#include <gtest/gtest.h>
// Mock out external dependency on mylogger.o
void Logger_log(...){}
TEST(FactorialTest, Zero) {
EXPECT_EQ(1, Factorial(0));
}
Notez que vous incluez en fait le fichier C et non le fichier d'en-tête. . Cela donne l'avantage d'avoir accès à tous les membres de données statiques. Ici, je simule mon logger (qui pourrait être dans logger.o) et je donne une implémentation vide. Cela signifie que le fichier de test est compilé et lié indépendamment du reste du code de base et s'exécute de manière isolée.
En ce qui concerne la compilation croisée du code, pour que cela fonctionne, vous devez disposer de bonnes installations sur la cible. Je l'ai fait avec googletest compilé de manière croisée avec Linux sur une architecture PowerPC. Cela a du sens car vous disposez d'un shell complet et d'un système d'exploitation pour recueillir vos résultats. Pour les environnements moins riches (que je classe comme tout ce qui n'a pas de système d'exploitation complet), vous devriez simplement construire et exécuter sur l'hôte. Vous devriez le faire de toute façon pour pouvoir exécuter les tests automatiquement dans le cadre de la construction.
Je trouve que tester du code C++ est généralement beaucoup plus facile, car le code OO est en général beaucoup moins couplé que le code procédural (bien sûr, cela dépend beaucoup du style de codage). En outre, en C++, vous pouvez utiliser des astuces comme l'injection de dépendances et le remplacement de méthodes pour obtenir des coutures dans du code qui est autrement encapsulé.
Michael Feathers a un excellent livre sur le test des codes hérités . Dans un chapitre, il aborde les techniques de traitement du code non OO, ce que je recommande vivement.
Modifier : J'ai écrit un article de blog sur les tests unitaires de code procédural, avec source disponible sur GitHub .
Modifier : Il y a un Le nouveau livre des programmeurs pragmatiques va sortir. qui traite spécifiquement des tests unitaires du code C qui Je recommande vivement .
13 votes
Jetez un coup d'œil à cmocka.org
2 votes
@zmo - Recommandations sur les logiciels est le site Stack Exchange pour obtenir des recommandations de logiciels. Je ne l'ai pas utilisé, donc je ne peux pas dire s'il fonctionne bien. Vous devriez vérifier leurs règles de publication avant d'y poster des messages.