检查PYTHONIOENCODE是否始终为“ utf8”

时间:2018-11-28 09:26:58

标签: python unit-testing pytest

我知道单元测试,并每天使用它们编写。

它们在开发和CI期间执行。

现在我要在生产系统上进行测试以确保:

  

PYTHONIOENCODING必须为“ utf8”

上面我使用了动词“ test”,这意味着我想检查状态。这个问题与如何执行无关。

AFAIK单元测试框架在这里无济于事,因为它仅在开发和CI期间执行。

如何在不重新发明轮子的情况下解决python世界中的问题?

以上仅是示例。我还要检查PYTHONIOENCODE旁边的其他几件事。

这些检查的下一个用例:几天前,我们在生产服务器上遇到了问题。命令行工具convert被使用,某些版本被破坏并产生错误的结果。我想写一个简单的检查,以确保生产服务器上的转换工具没有损坏。

2 个答案:

答案 0 :(得分:2)

直接方法(检查)

将其放在代码开头附近:

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

答案 1 :(得分:1)

testinfra

如果要针对部署基础结构编写和运行测试,则可以对pytest使用testinfra插件。例如,在目标计算机上验证环境变量的简单要求的测试看起来像:

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

此基础架构测试套件可以在单独的项目中开发,并在实际部署发生之前调用(例如,我们在构建docker映像之后立即调用基础架构测试;如果测试失败,则该映像不会上传到我们的私人图片存储库/已部署到产品等)。