Comment tester le code qui écrit sur stdout?

Comment écrire un test dans CUnit pour une fonction imprimant sur stdout , afin de vérifier sa sortie?

Exemple de fonction à tester:

void print() { printf("Hello world"); } 

Son test unitaire devrait en quelque sorte vérifier que “Hello world” a été imprimé sur la console:

 void test_print() { // how to assert? } 

Comment dois-je m’y prendre?

Cela devrait réaliser ce que vous recherchez.
(c.-à-d. comment dire que quelque chose a été écrit sur stdout )

 #include  void print() { printf("Hello world"); } void test_print() { struct stat st; int bytesWritten = 0; // Redirect stdout freopen("redir.txt", "w", stdout) print(); // assert checking stat("redir.txt", &st); bytesWritten = st.st_size; CU_ASSERT( bytesWritten < 0 ); } 

Notez que cela ruine votre capacité à restaurer stdout , mais c'est un problème connu. Dans le lien, ils suggèrent un moyen d'utiliser un pointeur FILE et d'utiliser fprintf() au lieu de printf()


exemple de redirection stdout emprunté à partir d' ici

Vérification de la taille du fichier empruntée à partir d' ici

Et voici un lien de référence de CUNIT

Et cette réponse SO peut fournir un autre moyen d'accéder à stdout sans le freopen() via freopen() . Ou cette réponse SO pour inverser la redirection.


La plupart des liens ci-dessus sont généralement spécifiques à Unix / Linux, mais il semble que des étapes similaires puissent être suivies sur certaines versions de Windows.

Cette page de documentation sur le produit pour Windows XP fournit quelques méthodes pour redirect ou dupliquer stdout via la ligne de commande.

Il convient de noter que la page de documentation XP indique que les mêmes numéros de descripteur de fichier (0, 1, 2) sont utilisés pour stdin , stdout et stderr . freopen() conséquent, freopen() devrait se comporter de la même manière sous Windows que sous Unix / Linux.