2015-09-14 2 views
2

Итак, у меня есть код, который использует gphoto2 для захвата некоторых изображений и т. Д. Я решил, что лучший способ проверить это будет обернуть код gphoto2 чем-то вроде ИСПЫТАНИЯ: затем вернуть подделку данные, а также вещи gphoto2.Тестирование кода на Python, который полагается на аппаратное обеспечение

Кто-нибудь знает, как я этого достиг, я пробовал что-то погулять, но мне не повезло с конкретным определением, выполняются ли модульные тесты или нет.

Я бы предположил, что это будет что-то вроде того, если unittest: но, может быть, есть лучший способ сделать это вообще?

EDIT: Итак, основываясь на комментариях и ответах, я опробовал пакет unittest.mock, он не работал, как я надеялся, позвольте мне объяснить.

Если у меня есть метод A, который вызывает метод захвата изображения (метод B), затем сохраняет изображение и несколько других бит. Мне удалось измотать метод B, чтобы он возвращал либо изображение, либо None, что отлично работает, когда я вызываю метод B специально, но когда я пытаюсь вызвать метод A, он не использует макет метода B, он использует фактический метод B.

Как мне сделать метод A использовать макет метод B?

+2

У вас не должно быть 'if TESTING:' в вашем коде, тогда вы не тестируете фактически запущенный код; используйте * «mocking» *, чтобы создать версию 'gphoto2', которая возвращает ваши фиктивные данные. – jonrsharpe

+0

Код 'gphoto2' будет лишь малой частью того, что вы делаете. Проверьте другую часть. –

+0

@PeterWood мой код использует Django и DRF, чтобы получить запрос API, а затем использовать gphoto2 для захвата изображения, а затем вернуть URL-адрес изображения. Так что, действительно, я бы только тестировал, что если gphoto2 имеет или не вернул изображение, тогда мой API либо вернет URL-адрес, либо 400_BAD_REQUEST ... Поэтому тестирования не так много. Тщательное тестирование сценариев доказало, что все работает отлично, но я должен написать модульные тесты для всего кода, который мы пишем. – Cephlin

ответ

1

Пакет mock существует именно по этой причине.

Это автономный пакет для установки Python 2; он был включен в стандартную библиотеку для версий Python> = 3.3 (как unittest.mock).

0

Просто используйте насмешливую библиотеку из вашего тестового кода. Таким образом, вы должны маскировать внешние API (аппаратные вызовы в вашем случае) и возвращать предсказуемые значения. Я бы порекомендовал flexmockhttps://pypi.python.org/pypi/flexmock это очень просто.

В начале вашего тестового кода, вы будете писать что-то вроде: flexmock(SomeObject).should_receive('some_method').and_return('some', 'values')

 Смежные вопросы

  • Нет связанных вопросов^_^