2008-09-29 10 views
18

Comment réalisez-vous des tests unitaires comme C en test? Quel cadre ou faites-vous d'autres tests en tant que tests unitaires au niveau du code?Comment tester le code C

+1

http://stackoverflow.com/questions/65820/unit-testing-c-code – mmcdole

Répondre

11

Check est un bon cadre de test pour C.

2

XCode sur Mac a quelque chose qu'ils ont appelé CPTest genre de intégré. J'ai fait une version portable que j'ai posté ici

http://www.loufranco.com/blog/files/AppleCppUnitPort.html

Je ciblais gcc sous Windows, mais je pense que cela fonctionnerait ailleurs, et il est un cadre très simple si vous voulez voir comment mettre en œuvre une telle chose .

0

Vous pouvez trouver des informations sur un certain nombre de frameworks de tests unitaires C au www.xprogramming.com, en particulier au lien software.

0

Vous pouvez jeter un oeil à cfix - c'est un cadre de test unitaire spécialisé pour les plates-formes Win32 et le mode noyau NT. Prend en charge à la fois C et C++.

0

Si vous utilisez Windows comme environnement de dev, CUnitWin32 pourrait servir votre but

16

Personnellement, j'aime le Google Test framework.

La véritable difficulté dans le test du code C est de briser les dépendances sur les modules externes afin que vous puissiez isoler le code en unités. Cela peut être particulièrement problématique lorsque vous essayez d'obtenir des tests autour du code existant. Dans ce cas, je me trouve souvent en utilisant l'éditeur de liens pour utiliser les fonctions stubs dans les tests.

C'est à quoi les gens font référence lorsqu'ils parlent de "coutures". En C, votre seule option est vraiment d'utiliser le pré-processeur ou l'éditeur de liens pour simuler vos dépendances.

Une suite de test typique dans l'un de mes projets C pourrait 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 effectivement le fichier C et non le fichier d'en-tête. Cela donne l'avantage d'accéder à tous les membres de données statiques. Ici, je simule mon enregistreur (qui peut être dans logger.o et donne une implémentation vide.) Cela signifie que le fichier de test compile et lie indépendamment du reste de la base de code et s'exécute de manière isolée. J'ai compilé le code, pour que cela fonctionne, vous avez besoin de bonnes installations sur la cible, ce que j'ai fait avec une compilation de googletest sur Linux sur une architecture PowerPC, ce qui est logique parce que vous avez un shell complet pour recueillir vos résultats. environnements riches (que je classe comme n'importe quoi sans un système d'exploitation complet) vous devriez juste construire et exécuter sur l'hôte.Vous devriez faire ceci de sorte que vous puissiez exécuter les tests automatiquement dans le cadre de la construction

Je trouve le code de C++ de test est généralement beaucoup plus facile en raison du fait que le code OO est en général beaucoup moins couplé que procédural (bien sûr cela dépend beaucoup du style de codage). Toujours en C++, vous pouvez utiliser des astuces telles que 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 book about testing legacy code

Dans un chapitre, il couvre les techniques pour traiter le code non-OO que je recommande fortement.

Modifier: J'ai écrit blog post de tests unitaires code de procédure, avec source available on GitHub.