Python 项目指南

本文档的目标是解释 OpenStack 范围内关于 Python 使用的标准实践。

它描述了 Python 虚拟环境的使用、系统和项目特定依赖项的安装,以及最后运行测试。

注意

在运行这些 tox 检查之前,请确保已安装 python3-devpython-dev

虚拟环境

建议使用 virtualenv 创建一个隔离的 Python 环境,不依赖于系统包,除非是真正的全局事物,例如 Python 本身。

virtualenv 捆绑了另外三个重要的 Python 工具——pip、wheel 和 setuptools。 结合起来,这将使您无需 root 访问权限即可获得一个完全最新的开发环境——并且不会混淆您的包管理器。

安装

  1. 选择一个创建虚拟环境的位置,例如 ~/workspace

  2. 根据 virtualenv 安装 指南,从源代码获取 virtualenv 以在本地运行。 请注意,您需要将 virtualenv.py 脚本应用于 ~/workspace

  3. 激活您的 virtualenv.

安装系统依赖项

在安装 Python 包并运行测试之前,需要安装一些系统包,以便允许各种 Python 包进行编译。

bindep 项目旨在解决这一需求。 它是一个用于检查应用程序或库所需的二进制包是否存在情况的工具

$ pip install bindep

如果您正在处理的项目有一个 bindep.txt 文件,bindep 将从那里读取系统要求。 只需要用您的包管理器调用它即可

$ sudo [apt-get | yum] install $(bindep -b)

如果没有这样的文件,为了了解需要安装哪些系统依赖项,您应该查阅您感兴趣的特定项目的文档。

运行 Python 单元测试

在提交您的更改之前,您应该对其进行测试。 仓库通常有几类测试

  • 风格检查 — 检查源代码是否存在风格问题

  • 单元测试 — 包含在每个仓库中

  • 集成测试 — 需要正在运行的 OpenStack 环境

可用的测试以及用于实现这些测试的工具因项目而异。 本节假定您已安装项目所需的所有系统依赖项。 它涵盖了如何运行风格检查和单元测试。 两者都通过 tox 运行,因此您需要安装它

$ sudo pip install tox

运行测试

导航到仓库的根目录并执行

$ tox

注意

完成此命令可能需要很长时间,具体取决于系统资源。 在 tox 完成之前,您可能看不到任何输出。

运行一组测试

tox 将在仓库 tox.ini 中指定的环境中运行您的整个测试套件

[tox]

envlist = <list of default environments>

要仅运行 envlist 中的一个测试套件,请执行

$ tox -e <env>

例如,运行 py27 环境中的测试套件

$ tox -e py27

运行风格检查

只需运行

$ tox -e pep8

使用 tox 运行单个测试

stestr

stestrOpenStack 推荐的测试运行器。 如果它在 tox.ini 中设置,例如

[testenv]

... stestr run {posargs}

那么使用以下语法运行单个测试

$ tox -e <env> -- -n path.to.module.Class.test

例如,运行 openstack/nova 中的 test_memory_unlimited 测试

$ tox -e py27 -- -n nova.tests.unit.compute.test_claims.ClaimTestCase.test_memory_unlimited

如果您想通过多个命令行参数和/或通过子字符串匹配指定多个测试,只需删除 -n 选项,例如:

$ tox -e py27 -- test_memory_unlimited test_memory_with_overhead

实际上,这会导致 stestr 内部构建所有测试的列表,然后仅运行包含命令行中提供的子字符串之一的测试。 但是,此额外的测试发现阶段通常需要几秒钟更长的运行时间。

testr

警告

testr 已弃用,不应在 OpenStack 中使用。 请按照上述说明使用 stestr

如果 testrtox.ini 中,例如

[testenv]

... "python setup.py testr --slowest --testr-args='{posargs}'"

那么使用以下语法运行单个测试

$ tox -e <env> -- path.to.module.Class.test

例如,运行 openstack/nova 中的 test_memory_unlimited 测试

$ tox -e py27 -- nova.tests.unit.compute.test_claims.ClaimTestCase.test_memory_unlimited

nose

警告

nose 和 nose2 都已弃用,不应在 OpenStack 中使用。 请按照上述说明使用 stestr

调试 Python 单元测试

您可以使用 pdb 调试测试。 要开始,在您希望中断的位置插入 set_trace()

import pdb; pdb.set_trace()

如果 testr 在 tox.ini 中,则应使用 testtools.run 命令来运行测试。 但是,由于 一个错误,无法简单地将正则表达式传递给此工具。 相反,首先生成要运行的测试列表,然后通过 testtools.run 管道传输此列表

$ source .tox/py27/bin/activate
$ testr list-tests test_name_regex > my-list
$ python -m testtools.run discover --load-list my-list

或者,一些项目在其 tox envlist 中提供了一个 debug,该 envlist 基于 oslo_debug_helper。 使用以下语法启用 pdb 运行单个测试

$ tox -e debug -- path.to.module.Class.test