Макет библиотеки для интеграционных тестов

0

У меня есть существующее приложение C/C++, которое взаимодействует с другими приложениями/системами через несколько интерфейсов (TCP, DB, shared memory). Я хотел бы запускать приложение один раз с реальной средой и "записывать" все вызовы функций и их возвращаемые значения (или изменения в буферах, переданные как параметры). Я бы записывал только вызовы, связанные с внешними интерфейсами (TCP, DB) с "шпионом". Затем я мог запустить приложение снова, но используя "поддельные" функции, которые должны возвращать предыдущие записанные значения. Таким образом, я мог бы "воспроизвести" выполнение и проверить, соответствуют ли результаты первоначальному исполнению.

Одной из важных функций является также фальсификация временных функций (sleep, time, GetLocalTime), поскольку (например), вызовы в БД могут иметь текущую дату или время в выбранных. Было бы даже лучше иметь возможность "переигрывать" все вызовы быстрее, чем первоначальное исполнение (один день исполнения может быть воспроизведен через несколько минут). Например, вызов sleep (1000) должен возвращаться без ожидания, но последовательные вызовы GetLocalTime должны возвращаться еще на 1 секунду. Это должно учитывать, что другие потоки должны иметь согласованные значения для времени (например, библиотека должна разрешить 1 вызов спящего режима (1000) для одного потока и 10 вызовов для сна (100) в другом потоке).

В идеале он не должен требовать много изменений или рефакторинга для приложения, просто переопределяя вызовы функций времени, а также вызовы в библиотеки внешних интерфейсов (DB, TCP).

Я хотел бы знать, существует ли какая-либо библиотека или структура, которая реализует эти функции или что может быть хорошей отправной точкой.

Я реализовал несколько раз решения для подобных проблем, но для очень простых модулей, например, для издевательства TCP-соединения для проверки реализации протокола, но я чувствую, что каждый раз изобретаю колесо, и эти простые решения не будут хорошо масштабироваться с большим количеством потоков или взаимодействия с большим количеством интерфейсов.

Теги:
testing
integration-testing
mocking

1 ответ

2

Поскольку вы упоминаете, что ваше приложение C/C++, я предполагаю, что у вас есть возможность использовать C-рамки. В этом ответе я расскажу о CMock и Unity. Если объектно-ориентированные принципы более распространены в вашей задаче, вы можете взглянуть на googlemock, который похож на CMock, но разработан для C++ и учитывает классы.

-

CMock в сочетании с Unity может обеспечить основу для ваших потребностей тестирования.

CMock предоставляет вам возможность легко обманывать общедоступные интерфейсы. Например, если у вас был следующий тривиальный код для тестирования:

void sendPacket(char * packet, int packetLen, int tcpSocket)
{
    if (packet)
    {
        send(tcpSocket, packet, packetLen, 0);
    }
}

Вы можете использовать CMock для создания макета вызова отправки. Это позволит вам проверить параметры, переданные для отправки, и, таким образом, проверить содержимое в буферах. Вы также сможете проверить размер, возвращенный отправкой. Вариант CMock ExpectAndReturn функции mocked send позволит вам выполнить эти две проверки.

CMock также позволяет вам предоставлять обратные вызовы для издевающихся функций через вариант StubWithCallback. StubWithCallback позволит вам вручную проверять каждый вызов в дополнение к специальным проверкам. Вы могли бы использовать StubWithCallback для записи количества раз, когда функция вызывается, или почти все, что вы можете себе представить. Вы также сможете использовать StubWithCallback для ваших нужд со временем, сном и т.д. Вы можете издеваться над отдельными вызовами с помощью разных заглушек callbacks--, некоторые потоки начнут с обратного вызова обратного вызова, который немедленно возвращается, тогда как потоки, которые вы указываете для тестирования, могут используйте обратный вызов сна, который выполняет полный сон.

Более подробную информацию о CMock вы можете найти здесь: http://throwtheswitch.org/white-papers/cmock-intro.html

  • 0
    Даже если у CMock, похоже, нет системы записи и воспроизведения, о которой я спрашивал, его генерация кода может облегчить мою жизнь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню