Как макетировать внешние серверы в модульных тестах Python? - PullRequest
11 голосов
/ 06 апреля 2011

У меня есть несколько модульных тестов, которые занимают много времени (минут) из-за обращений к внешним службам (Twitter, Facebook, Klout и т. Д.)служить им прозрачно, с минимальными изменениями в моих текущих тестах.Ключ кэша зависит от URL, аргументов запроса, заголовков и т. Д., Поэтому он довольно сложный.

Какой лучший способ сделать это?

Ответы [ 3 ]

9 голосов
/ 06 апреля 2011

Вы бы (должны) обычно использовать какой-то адаптер для подключения к этим внешним сервисам, модулям. Это ваши интерфейсы с внешним миром, которые могут быть mock ed и поддельные ответы, созданные в зависимости от сценария.

Я экспериментировал с множеством насмешливых библиотек и, наконец, нашел Mock как наиболее подходящую для меня.

3 голосов
/ 21 августа 2015

Вот код, мы используем библиотеку запросов для вызова внешних API. Поэтому мы создаем контекстный процессор с объектом фиктивных запросов.

Так что, если бы мы тестировали функцию get_data, это было бы так, как мы бы смоделировали запрос к внешнему API:

import requests
import mock
import unittest


def get_data(url):
    resp = requests.get(url)
    return resp

class GetDataTest(unittest.TestCase):

    def test_get_data(self):
        with mock.patch.object(requests, 'get') as get_mock:
            get_mock.return_value = mock_response = mock.Mock()
            mock_response.status_code = 200
            mock_response.content = {'twitter_handle': '@twitter'}
            resp = get_data("http://this_address_does_not_exist.com")
            self.assertEqual(resp.status_code, 200)
            self.assertEqual(resp.content['twitter_handle'], '@twitter')
2 голосов
/ 06 апреля 2011

Технически, если он использует внешние сервисы, это не модульный тест, а интеграционный тест.Для модульного тестирования и ускорения вашего тестового кода используйте фиктивные объекты.Вы можете найти подробную информацию о объектах Python Mock здесь:
http://python -mock.sourceforge.net /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...