概述
python项目unittest框架搭建
由于ci(continuous integration持续集成)需要用来不断验证每次提交代码的正确性,因此项目的unittest检查非常重要。
本文提供了一种为python项目搭建unittest框架的方法,并可以进行pep8的检查。
主要思想是借鉴openstack项目的tox.ini及其相关工具。
下面是为python项目搭建unittest的具体操作步骤。
1给项目的目录下添加 .testr.conf
添加的具体内容如下
[DEFAULT]
test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1}
OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1}
OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-600}
${PYTHON:-python} -m subunit.run discover ${OS_TEST_PATH:-./myproject/tests} -t . $LISTOPT $IDOPTION
test_id_option=--load-list $IDFILE
test_list_option=--list
# NOTE(chdent): Only used/matches on gabbi-related tests.
group_regex=(gabbi.(suitemaker|driver).test_gabbi_(?:prefix_|)[^_]+)_
请将上述OS_TEST_PATH 部分对应的测试路径中的项目名称: myproject修改为对应项目的名称
参考:
https://mathsyouth.github.io/2017/01/07/subunit-testr-tox
分析:
1) subunit:传输单元测试结果,可分享
2) testrepository: 管理单元测试用例,用subunit将输出记录到本地,了解哪些用例运行时间最长,失败的用例
3) 关于.testr.conf
3.1)关于test_command
test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1}
OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1}
OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-600}
${PYTHON:-python} -m subunit.run discover ${OS_TEST_PATH:-./myproject/tests} -t . $LISTOPT $IDOPTION
解释:
test_command表示运行测试的命令行,主要就是发现指定项目路径下的所有测试用例
3.2)关于test_id_option
test_id_option=--load-list $IDFILE
解释: 运行特定测试id时将其只如到test_command中
3.3)关于test_list_option=--list
运行testr list-tests将会列出所有测试用例
3.4) 关于group_regex
group_regex=(gabbi.(suitemaker|driver).test_gabbi_(?:prefix_|)[^_]+)_
将特定类型测试分组在一起,以便被同一后端运行
总结.testr.conf:
.testr.conf中主要就是配置了用于testr调用subunit.run来发现测试用例的项目路径,
并提供了列出测试用例,将测试用例分组的功能。
2 在项目的目录下添加tox.ini
具体内容样例如下
[tox]
minversion = 1.6
envlist = py35,py27,pypy,pep8
skipsdist = True
[testenv]
usedevelop = True
install_command = pip install -r{toxinidir}/requirements.txt {opts} {packages}
setenv =
VIRTUAL_ENV={envdir}
PYTHONWARNINGS=default::DeprecationWarning
deps = -r{toxinidir}/test-requirements.txt
commands = python setup.py testr --slowest --testr-args='{posargs}'
[testenv:pep8]
commands = flake8 {posargs}
[testenv:venv]
commands = {posargs}
[testenv:cover]
commands = python setup.py test --coverage --testr-args='{posargs}'
[testenv:docs]
commands = python setup.py build_sphinx
[testenv:functional]
setenv =
OS_TEST_PATH = ./myproject/tests/functional
[testenv:releasenotes]
commands =
sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html
[testenv:genconfig]
commands = oslo-config-generator --config-file=etc/myproject/myproject-config-generator.conf
[testenv:debug]
commands = oslo_debug_helper {posargs}
[flake8]
# E123, E125 skipped as they are invalid PEP-8.
# H102 not required (checking Apache 2.0 license header)
show-source = True
ignore = E123,E125,H102
builtins = _
exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build
注意: 请将上述tox.ini中的 "myproject" 替换为该项目的真实名称
tox分析,参考:
https://blog.csdn.net/Jmilk/article/details/53172601(主要参考)
https://www.cnblogs.com/potato-chip/p/9094773.html
openstack单元测试,参考:
http://www.infoq.com/cn/articles/the-development-of-openstack-unit-test
分析:
1) tox:管理虚拟环境,创建隔离测试环境,指定安装包,以及该环境中运行的命令
2) 整体测试运行的逻辑流程:
步骤1: unittest,mock等编写ut
步骤2: tox管理测试的虚拟环境
步骤3: tox调用测试仓库testrepository管理测试用例
步骤4: testrepository调用subunit执行测试,调用coverage分析覆盖率
unittest→tox→testrepository→subunit,coverage
用户执行tox命令->
tox加载tox.ini中配置,创建虚拟环境并调用testr->
testr从.testr.conf中加载配置,并调用subunit.run->
subunit.run发现所有测试用例并执行
3) tox主要内容分析
3.1) 关于envlist
envlist = py35,py27,pypy,pep8
解释:上述envlist表示tox中配置的用于测试的有哪些
3.2) 关于testenv
[testenv]
usedevelop = True
install_command = pip install -r{toxinidir}/requirements.txt {opts} {packages}
setenv =
VIRTUAL_ENV={envdir}
PYTHONWARNINGS=default::DeprecationWarning
deps = -r{toxinidir}/test-requirements.txt
commands = python setup.py testr --slowest –testr-args='{posargs}'
解释:
A) usedevelop=True表示安装virtualenv时,项目自身用开发模式安装,不拷贝代码到virtualenv目录
B) install_command = pip install -r{toxinidir}/requirements.txt {opts} {packages}
表示构建环境要执行的命令,一般用pip安装
C) setenv =
VIRTUAL_ENV={envdir}
PYTHONWARNINGS=default::DeprecationWarning
setenv表示虚拟环境中的环境变量,主要时一个配色方案
D) deps = -r{toxinidir}/test-requirements.txt
deps指定环境需要安装的依赖包,通常是test-requirements.txt或者requirements.txt
E) commands = python setup.py testr --slowest –testr-args='{posargs}'
表示构建好虚拟环境后要执行的命令,这里调用testrepository来执行单元测试用例
注意:
上述有两个安装命令, install_command和commands,其中install_command是为了给虚拟的测试环境安装必须的包,而commands是在虚拟环境构建好后,用于执行测试用例的命令
3.3) 关于testenv:pep8
[testenv:pep8]
commands = flake8 {posargs}
分析: 这个section是为pep8环境定制配置的,如果没有指定,例如上述tox.ini中没有指定
[testenv:py27]
那么其实执行tox -e py27,就会从[testenv]中的commands命令执行,即执行:
python setup.py testr --slowest –testr-args='{posargs}'
而上述[testenv:pep8]由于重新指定了虚拟环境需要运行的命令是
flake8 {posargs}
就会执行这个命令进行代码检查
3.4) 关于给ut添加debug调试能力
在tox.ini中添加如下内容
[testenv:debug]
commands = oslo_debug_helper {posargs}
然后可以在待调试的单元测试用例中加上一行内容
import pdb;pdb.set_trace()
然后执行
tox -e debug xxx
请将xxx替换为该测试用例的名称
3.5)关于{posargs}
--后面的参数将替换你在测试命令中指定的{posargs}
例如:
tox -e py27 -- xxx
其中xxx就会替换{posargs}
总结tox.ini:
tox.ini中主要就是设定了测试的虚拟环境envlist,指定了[testenv]及其安装虚拟环境命令install_command以及构建好虚拟环境后执行的命令commands,设定了环境变量setentv以及需要的依赖deps,另外对于需要定制的测试虚拟环境,则单独使用自己的section。
3 为项目添加测试目录和测试文件
根据 "1 给项目的目录下添加 .testr.conf"
中设置了: OS_TEST_PATH:-./myproject/tests
所以在该向项目myproject(可以替换为真实的项目)下新建一个tests目录,
然后可以新建一个文件,例如test_myproject.py,内容可以如下
from oslotest import base
class BaseTestCase(base.BaseTestCase):
def test_abc(self, obj):
pass
然后在该项目目录下(与tox.ini在同一目录),执行如下命令:
tox -e py27
即可运行unittest
然后在该项目目录下(与tox.ini在同一目录),执行如下命令:
tox -e pep8
即可运行pep8检查
4 添加.gitignore
.gitignore主要用于屏蔽那些不向提交到git的文件。
例如屏蔽 .pyc文件,可以在 .gitignore中添加如下内容
*.pyc
参考:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013758404317281e54b6f5375640abbb11e67be4cd49e0000
5 修复pep8
pep8问题解决,参考:
https://python.freelycode.com/contribution/detail/47
参考文章:
[1] https://mathsyouth.github.io/2017/01/07/subunit-testr-tox
[2] https://blog.csdn.net/Jmilk/article/details/53172601
[3] https://www.cnblogs.com/potato-chip/p/9094773.html
[4] http://www.infoq.com/cn/articles/the-development-of-openstack-unit-test
[5] https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013758404317281e54b6f5375640abbb11e67be4cd49e0000
[6] https://python.freelycode.com/contribution/detail/47
最后
以上就是欣喜往事为你收集整理的python 64式: 第2式 为python项目搭建unittest框架的全部内容,希望文章能够帮你解决python 64式: 第2式 为python项目搭建unittest框架所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复