Ecrire un test unitaire de langage C en Python

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.

À propos de la version

Recommended Posts

Ecrire un test unitaire de langage C en Python
Test unitaire Python
Ecrire le fichier O_SYNC en C et Python
Ecrire Python dans MySQL
Next Python en langage C
API C en Python 3
Étendre python en C ++ (Boost.NumPy)
Ecrire des filtres Pandec en Python
Écrire une distribution bêta en Python
Recherche binaire en Python / C ++
Ecrire des tests Spider dans Scrapy
Écrire des tests en Python pour profiler et vérifier la couverture
Ecrire une dichotomie en Python
Ecrire un test piloté par table en C
Ecrire un schéma JSON avec Python DSL
Ecrire un serveur HTTP / 2 en Python
Ecrire une fonction AWS Lambda en Python
ABC166 en Python A ~ C problème
Ecrire le code de test du sélénium en python
Résoudre ABC036 A ~ C avec Python
Ecrire un graphique à secteurs en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
Comment envelopper C en Python
Ecrire un test en langue GO + gin
Tests de code dans le temps en Python
Écrire de la documentation dans Sphinx avec Python Livereload
Résoudre ABC175 A, B, C avec Python
Un chercheur d'une société pharmaceutique a résumé le test unitaire Python
Ecrire le test dans la docstring python
Algorithme en Python (ABC 146 C Dichotomy
Implémenter le filtre FIR en langage Python et C
Ecrire une courte définition de propriété en Python
Ecrire un programme de chiffrement Caesar en Python
Lire et écrire des fichiers JSON avec Python
Ecrire une méthode de cupidité simple en Python
Ecrire un plugin Vim simple en Python 3
Générer un langage C à partir d'une expression S avec Python
Comment écrire Ruby to_s en Python
Exécutez Python en C ++ sur Visual Studio 2017
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
python, openFrameworks (c ++)
FizzBuzz en Python