So schreiben Sie einen Unit-Test für den C-Sprachtest mit dem Python-Unit-Test. Die Motivation ist, die Anzahl der Zusammenstellungen so weit wie möglich zu reduzieren. Dieser Ansatz macht eine Kompilierung beim Schreiben von Tests überflüssig (obwohl ich nicht weiß, ob es schnell geht oder ob der Rückgabewert komplex ist).
Erstens lautet der C-Sprachcode wie folgt.
//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;
}
Als nächstes sieht der Python-Code, der von gdb aufgerufen werden soll, folgendermaßen aus:
#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()
So testen Sie Ihren C-Code mit diesem Python-Code:
$ gcc -g3 main.c
$ gdb -q -x ./debug.py a.out
Die Standardausgabe sieht folgendermaßen aus: Jetzt können Sie in C in Python geschriebene Tests hinzufügen und ändern, ohne sie neu zu kompilieren.
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
Wie eingangs erwähnt, ist es meiner Meinung nach möglich, die Struktur besser zu handhaben, wenn der Rückgabewert der Funktion kompliziert ist. In der Sprache C kann es realistisch sein, eine Funktion vorzubereiten, die den Inhalt eines Objekts in eine Zeichenfolge konvertiert.
Recommended Posts