Comment écrire un test unitaire pour un test de langage C à l'aide du test unitaire Python. La motivation est de réduire le plus possible le nombre de compilations. Cette approche élimine le besoin de compilation lors de l'écriture des tests (même si je ne sais pas si c'est rapide ou si la valeur de retour est complexe).
Tout d'abord, le code de langage C est le suivant.
//main.c
#include<stdio.h>
int add(int a, int b);
struct Pair {
int l;
int r;
};
int
main(void) {
printf("%d + %d = %d\n", 3, 4, add(3, 4));
return (0);
}
int add(int a, int b) {
return a + b;
}
struct Pair make_pair(int l, int r) {
struct Pair p;
p.l = l;
p.r = r;
return p;
}
Ensuite, le code python à appeler depuis gdb ressemble à ceci:
#debug.py
import unittest
class Test(unittest.TestCase):
def assertEqual_(self, a, expr):
self.assertEqual(a, gdb.parse_and_eval(expr))
def test_aaaa(self):
self.assertEqual_(42, 'add(30, 12)')
def test_bbb(self):
self.assertEqual_(0, 'add(0, 0)')
def test_ccc(self):
p = gdb.parse_and_eval("make_pair(3, 4)")
self.assertEqual("{l = 3, r = 4}", str(p))
gdb.execute('break main')
gdb.execute('run')
unittest.main()
Pour tester votre code C avec ce code python:
$ gcc -g3 main.c
$ gdb -q -x ./debug.py a.out
La sortie standard ressemble à ceci: Vous pouvez maintenant ajouter et modifier des tests écrits en C en Python sans recompiler.
Reading symbols from a.out...done.
Breakpoint 1 at 0x804841c: file main.c, line 9.
Breakpoint 1, main () at main.c:9
9 printf("%d + %d = %d\n", 3, 4, add(3, 4));
...
----------------------------------------------------------------------
Ran 3 tests in 0.003s
OK
Comme je l'ai mentionné au début, si la valeur de retour de la fonction est compliquée, je pense qu'il est possible de mieux gérer la structure. En langage C, il peut être réaliste de préparer une fonction qui convertit le contenu d'un objet en une chaîne de caractères.
Recommended Posts