Можно ли использовать фреймворки и раннеры модульного тестирования на основе Python для тестирования кода C

#python #c #unit-testing

#python #c #модульное тестирование

Вопрос:

Фреймворки модульного тестирования на основе Python, такие как «nose», обладают множеством богатых функций, интересно, сможем ли мы использовать их для тестирования кода C.

Ответ №1:

Конечно, вы можете…. но вам нужно будет написать привязку для вызова вашего кода C на python (например, с ctypes) и написать тесты на python (это действительно возможно и простой способ выполнения интеллектуальных тестов)

Пример :

  • Напишите фиктивную библиотеку C.

foolib.c

 int my_sum(int , int);

int my_sum(int a , int b);
{
    return a   b;
}
  
  • Скомпилируйте его как общую библиотеку:

gcc -shared -Wl,-soname,foolib -o foolib.so -fPIC foolib.c

  • Напишите оболочку с ctypes:

foolib_test.py

 import ctypes
import unittest

class FooLibTestCase(unittest.TestCase):
    def setUp(self):
        self.foolib = ctypes.CDLL('/full/path/to/foolib.so')

    def test_01a(self):
        """ Test in an easy way"""
        self.failUnlessEqual(4, foolib.my_sum(2, 2))
  

И затем, при выполнении этого теста с помощью nose, у вас должен быть хороший тест вашего кода на C 🙂

Комментарии:

1. Не могли бы вы уточнить или привести мне пример, чтобы я мог понять, насколько сложным это будет. Спасибо

2. Если это простые файлы C, такие как adder или hello world, я считаю, что этот подход сработает, что, если это устаревший код, и один файл имеет много зависимостей, и одному модулю нужен другой, как это будет работать?

3. @kamal: самой сложной частью в случае сложного кода будет часть makefile 🙂

4. Два незначительных замечания по поводу приведенного выше примера. Во-первых, int my_sum(int a, int b) после него не должно быть точки с запятой при второй записи, а также self.failUnlessEqual(4, self.foolib.my_sum(2,2)) (обратите внимание на self.failUnlessEqual )