Проверка того, что PYTHONIOENCODING всегда "utf8" - PullRequest
0 голосов
/ 28 ноября 2018

Я знаю юнит-тесты и пишу их ежедневно.

Они выполняются во время разработки и CI.

Теперь у меня есть тест, который я хотел бы обеспечить в производственной системе:

PYTHONIOENCODING должно быть "utf8"

Выше я использовал глагол "test", это означает, что я хочу проверить состояние.Этот вопрос не о том, как это сделать.

AFAIK Фреймворк unittest не может мне помочь, поскольку он выполняется только во время разработки и CI.

Как решить эту проблему в pythonмир, в котором вы заново изобретаете колесо?

Выше приведен только пример.Рядом с PYTHONIOENCODING есть несколько других вещей, которые я хотел бы проверить.

Следующий вариант использования для этих проверок: Несколько дней назад у нас возникла проблема с производственным сервером.Инструмент командной строки convert используется, и некоторые версии ломаются и приводят к неправильным результатам.Я хотел бы написать простую проверку, чтобы убедиться, что инструмент преобразования на производственном сервере не сломан.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

testinfra

Если вы хотите писать и запускать тесты для инфраструктуры развертывания, вы можете использовать плагин testinfra для pytest.Например, тест для простого требования проверки переменной среды на целевом компьютере может выглядеть следующим образом:

def test_env_var(host):
    assert host.run_expect((0,), 'test "$PYTHONIOENCODING" == "utf8"')

Этот набор тестов инфраструктуры может быть разработан в отдельном проекте и вызван до фактического развертывания (дляНапример, мы вызываем инфра-тесты сразу после создания образа докера; если тесты не пройдены, образ не загружается в наш частный репозиторий / развертывается в prod и т. д.).

0 голосов
/ 28 ноября 2018

Простой подход (Проверка)

Поместите это в начале кода:

import os

if 'PYTHONIOENCODING' not in os.environ or \
        os.environ['PYTHONIOENCODING'].lower() not in {'utf-8', 'utf8'}:
    raise EnvironmentError("Environment variable $PYTHONIOENCODING must be set to 'utf8'")

Альтернативное решение (Обеспечение)

В одном изпроекты, для которых я кодирую, есть «сценарий запуска», поэтому вместо запуска python3 main.py мы запускаем его в производство:

bash main.sh

, содержимое которого довольно просто:

#!/bin/bash

export PYTHONIOENCODING=utf8

exec /usr/bin/env python3 main.py
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...