Тестируем web API эффективно с помощью vcr.py

Когда вы создаете API интеграцию, как вы проверяете часть вашего кода, который взаимодействует с удаленным сервером? Я использовал для запуска подмножество тестов той части, а не испытывать весь код на каждой фиксации. Это спасло немного времени, но, к сожалению до сих пор мои тесты были зависимы от внешней служб.

vcr.py (порт одноименного ruby проекта) решили эти проблемы для меня. VCR обеспечивает декоратор, который глушит запрос HTTP обработки в Python, так что вы можете использовать любую библиотеку для запросов, и они будут кэшироваться для использования в будущем. Это выглядит следующим образом:

@vcr.use_cassette('fixtures/cassettes/root_valid.yml')
def test_root_valid():
    resp = requests.get('http://www.google.com')
    assert resp.status_code == 200

Во время первого запуска, запросы будут работать в обычном режиме и получить Google страницу. Тем не менее, в следующий когда вы запустите произойдет: VCR перехватывает запрос и отправит ответ который вы получили в первый раз. Будет кэшироваться все различные запросы. Однако, это приносит новый набор проблем: вы, вероятно, не хотите, чтобы свои учетные данные уходили куда нибудь. К счастью vcr позаботился об этом:

@vcr.use_cassette('fixtures/cassettes/root_auth.yml', filter_headers=['Authorization'])
def test_root_auth():
    resp = requests.get(
        'http://www.google.com/',
        headers={
            'Authorization': 'Token %s' % os.getenv('GOOGLE_TOKEN'),
        }
    )

Теперь заголовок авторизации будет удален в root_auth.yml. Вы можете сделать более продвинутый очистку.

Пока vcr не является совершенным. Но то, что он делает, он делает очень хорошо. Так что устанавливайте vcr.py и начинайте тестирование!

Разбираемся с циклами в Python

Есть два вида циклов в Python. В этом руководстве мы расскажем о цикле «for» и «while». Мы также рассмотрим, как управлять этими циклами, продолжать и останавливать.

Цикл For

Этот цикл в Python используется для перебора последовательных типов данных. Такими примерами типов данных в Python являются: строка, список, кортеж, xrange и т.д.
Предположим, у вас есть список:

my_list = [2, 3, 5, 7, 11]

Перебрать этот список, используя для цикл for можно следующим образом:

for item in my_list:
    print item

Для этого цикла имя переменной будет значение которое мы выбираем. Так мы перебираем список, каждый элемент будет присвоен переменной элемента внутри цикла.
Этот цикл используется, когда мы хотим, использовать каждый элемент в некоторой последовательности. Так блок кода внутри цикла, будет выполняться один раз для каждого элемента в последовательности.

Цикл While

Цикл While будет выполнить повторно до тех пор, пока условие не станет истинным. В отличие от цикла for, он не связан с какой-либо последовательностью. Вот простой пример, который распечатает все четные числа, меньшие 100.

i = 0
while i < 100:
    if i % 2 == 0:
        print i
    i = i + 1

В этом примере мы устанавливаем счетчик i. Этот цикл, будет выполнятся до тех пор, пока условие i <= 100 не будет истинной. Код в цикле просто проверяет, является ли число, которое мы проверяем четным и печатаем его в случаи истины. В этом цикле, мы должны вручную увеличить счетчик, i = + 1. Таким образом, каждый раз, когда проходит цикл, значение i будет увеличен на 1.

Continue в цикле

Иногда вы хотите, перейти к следующему циклу без выполнения кода ниже. Такой переход возможен как в цикле for так и while. Мы можем переписать предыдущий пример с использованием continue.

for item in xrange(100):
    if not item % 2 == 0:
        continue
    print item

Это пример делает то же самое, что и предыдущий. Xrange дает нам ряд чисел от 0 до 100. Если условие not item % 2 == 0 окажется верным то мы перейдем к следующей итерации цикла не напечатав переменной item.

Выход из цикла

В некоторых случаях необходимо остановить выполнение цикла. Например, если мы хотим, проверить список, чтобы увидеть, если он содержит какие-либо нечетные числа, мы можем сделать это следующим образом:

test_list = [2, 4, 6, 8, 9, 10]
contains_odd = False
for item in test_list:
    if not item % 2 == 0:
        contains_odd = True
        break

В этом случае, мы создали тестовый список test_list. Он содержит некоторые произвольные значения. Теперь мы устанавливаем флаг contains_odd. Изначально мы предположим, что список не содержит нечетное число. Если мы найдем нечетное число мы устанавливаем contains_odd = true, и полностью выйдем из цикла. Так как наше цель здесь просто проверить есть ли нечетное значение, то у нас нет оснований продолжать цикл после того как найдем нечетное число.