Как проверить модуль, который зависит от boto и службы Amazon AWS?
Я пишу очень маленький ORM Python вокруг boto.dynamodb.layer2
. Я хотел бы написать тесты для него, но я не хочу, чтобы тесты действительно связывались с AWS, поскольку для этого потребовались бы сложная настройка, учетные данные, доступ к сети и т.д.
Так как я планирую открыть исходный код, модуль, в том числе учетные данные в источнике, кажется плохой идеей, так как я буду взимать плату за использование, и в том числе учетные данные в среде - это боль.
Связывание моих тестов с сетью кажется плохой идеей, поскольку она заставляет тесты работать медленнее или может привести к сбоям тестирования из-за сетевых ошибок или дросселирования. Моя цель - не тестировать интерфейс DynamoDB или AWS. Я просто хочу проверить свой собственный код.
Я планирую использовать unittest2
для написания тестов и mock
, чтобы издеваться над деталями boto, которые попали в сеть, но я никогда не делал этого раньше, поэтому мой вопрос сводится к следующим:
- Я собираюсь сделать это правильно?
- Кто-нибудь еще это сделал?
- Есть ли какие-то конкретные точки в интерфейсе
boto.dynamodb
, которые лучше всего бы вычленить?
Ответы
Ответ 1
Чтобы полностью ответить на мои вопросы:
-
Как и в случае с ответом @pcalcao, издевательство над сервисом было правильным. Это было не так сложно, как я думал, это будет - тестовый код будет только немного длиннее, чем тестируемый код, и большинство из них - тесты, а не сантехника.
-
Благодаря @gamaat за то, что я заставляю меня смотреть второй раз, boto делает это в своих собственных тестах, насмехаясь над фактический уровень интерфейса транспорта, в httplib
.
-
Отказывание интерфейса boto.dynamodb.layer1
(вместе с boto.connect_dynamodb
) оказалось правильным. Настройка шпионов на boto.dynamodb.layer2
и boto.dynamodb.table
также помогла. Как только я начал понимать это, я обнаружил, что mock
- это радость для работы.
Здесь мое решение, лицензия BSD. Я буду публиковать всю библиотеку в PyPI, как только у меня будет собака, она немного доработала и собрала правильную документацию. Я отправил его в PyPI.
Ответ 2
Я думаю, что у вас есть правильный подход, вы определенно не хотите, чтобы ваши тесты были связаны с фактической связью с AWS. Издевательская служба, безусловно, правильная вещь здесь.
Ответ 3
Все тесты в boto были первоначально интеграционными тестами, которые попадали в конечные точки реального сервиса. У нас все еще есть те тесты, но они также начали добавлять отрывочные модульные тесты. Возможно, вам захочется проверить, что до сих пор можно найти на примерах.