Django Как я могу протестировать функцию ожидания для базы данных, написанной в bash-скрипте, при использовании сервиса баз данных dockerized? - PullRequest
0 голосов
/ 02 ноября 2019

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

Первый написан на скрипте bash, и я нашел его в здесь

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

python manage.py flush --no-input
python manage.py migrate

exec "$@"

Второй написан на Python иЯ нашел это в здесь :

class Command(BaseCommand):
"""Django command that waits for database to be available"""

    def handle(self, *args, **options):
        """Handle the command"""
        self.stdout.write('Waiting for database...')
        db_conn = None
        while not db_conn:
            try:
                connection.ensure_connection()
                db_conn = True
            except OperationalError:
                self.stdout.write('Database unavailable, waiting 1 second...')
                time.sleep(1)

        self.stdout.write(self.style.SUCCESS('Database available!'))

Я использую эту команду Docker ENTRYPOINT ["/usr/src/app/entrypoint.sh"] для запуска первой.

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

from unittest.mock import patch
# Use patch to to simulate db for being available or not
from django.core.management import call_command
from django.test import TestCase


class CommandTests(TestCase):
    def test_wait_for_db_ready(self):
        """Test waiting for db when db is available"""
        with patch('django.db.utils.ConnectionHandler.__getitem__') as gi:
            gi.return_value = True
            call_command('wait_for_db')
            self.assertEqual(gi.call_count, 1)

Но может ли кто-нибудь помочь мне найти способ написания тестов для первого (скрипт bash)?

Кроме того, кто-нибудь можетНазовите недостатки и преимущества каждого метода, а также, если существуют некоторые другие важные соображения для написания такой функции? Спасибо

1 Ответ

1 голос
/ 02 ноября 2019

Причина, по которой вы не хотите, чтобы команда управления проверяла состояние базы данных, заключается в том, что django может попытаться подключиться к базе данных перед запуском вашей команды управления, что делает невозможным для вашего сценария обнаружение, является ли база данныхвниз. Потому что, если база данных не работает, django не сможет подключиться к ней и выдаст исключение перед выполнением команды управления.

Недостатки сценария bash заключаются в том, чтодля этого требуется установить дополнительные зависимости уровня ОС (в данном случае netcat). Это не так уж важно, но оно увеличивает размер вашего докера.

...