Модульные тесты в Python Flask + PyMongo API - PullRequest
0 голосов
/ 20 сентября 2018

Я создаю RESTful API, который запускается в док-контейнере и использует Python 3 Flask и поддерживается MongoDB через библиотеку PyMongo.Я хочу добавить модульные тесты в API, которые я могу запускать при выполнении git commit (в конвейере CI / CD).API в основном просто позволяет создавать, получать, перечислять, изменять и удалять объекты в базе данных.Я хочу, чтобы мои тесты вызывали эти конечные точки и проверяли, имеют ли ответы смысл.Каким будет рекомендуемый шаблон для этого?

MockupDB кажется, что это позволило бы мне подделать сервер MongoDB внутри моего контейнера Python, но программирование всех ответов из MongoDB кажется слишком сложным.

Я мог бы изменить свой класс данных, например:

test_dictionary = {}

def get(identifier):
    if is_test:
        return test_dictionary.get(identifier, None)
    return database.find_one({'_id': identifier})

Но это уменьшило бы мое покрытие.

Я мог бы иметь отдельный Dockerfile для тестирования, который включает в себя оба сервера MongoDBи питон.Затем укажите мое соединение PyMongo на локальном сервере в тестовом Dockerfile и на сервере вне контейнера для обычного Dockerfile.Что означало бы, что я больше не тестирую в одной и той же среде.

Может быть, я смогу использовать модуль Python unittest.mock ?

Или эти тесты лучше подходят дляработает после развертывания контейнера?

Я думаю, что тестовые документы Flask пока не дадут, но не описывают, как обращаться с соединениями с базой данных.

1 Ответ

0 голосов
/ 20 сентября 2018

docker-compose позволит вам выполнить и то, и другое.

У вас может быть контейнер с колбой для запуска вашего приложения Flask, а затем контейнер mongo с томом, подключенным к нему в качестве каталога данных, и, следовательно, иметьмонтирование тома dev для ваших модульных тестов и фактическое монтирование объема производства в другом месте вашего конвейера CI / CD.

compose также упрощает взаимодействие контейнеров друг с другом.Так, например:

version: "3"
services:
  flask:
    build: .
    image: flask-container
    depends_on:
      - mongodb
    environment:
     - 'MONGO_HOST=mongodb'
     - 'MONGO_PORT=27017'

    volumes:
     - ./conf/dev:/conf
  mongodb:
    image: mongo:latest
    container_name: "mongodb"
    environment:
    - MONGO_DATA_DIR=/data/db
    - MONGO_LOG_DIR=/dev/null
    volumes:
    - ~/unit-tests/data/db:/data/db
    ports:
    - 27017:27017
    command: mongod --smallfiles --logpath=/dev/null # --quiet

networks:
  default:
    external:
      name: cicd

Тогда они находятся в одной сети, и Flask может просто позвонить mongodb:27017 вместо IP-адреса

...