在Python中引入测试。 第三部分

朋友,我们为您带来好消息。 首先,阳光终于在大街上照耀着,这意味着春天开始完全接管其权利。 第二个新闻更加专业化-3月20日,第一课在“ Python开发人员”课程的新线程中开始,与此相关,我们发布了文章“ Python测试简介”的最后一部分,该文章的先前部分可以在此处此处阅读。

在多种环境中测试

到目前为止,您已经在使用带有一组特定依赖项的虚拟环境测试一个版本的Python。 但是可能始终需要在多个版本的Python或软件包的多个版本上测试应用程序。 Tox是在多个环境中自动化测试的应用程序。



毒物安装

Tox在PyPl上是可通过pip安装的软件包:

$ pip install tox 

安装后,您可以继续配置Tox。

为您的依赖项定制Tox

通过项目目录中的配置文件配置Tox。 它包含以下内容:

  • 用于运行测试的命令;
  • 运行所需的任何其他软件包;
  • 已选择要测试的Python目标版本。

您无需学习配置Tox的语法,而可以通过启动快速启动应用程序开始。

 $ tox-quickstart 

Tox配置工具将询问您问题,并在tox.ini创建类似于以下文件的文件:

 [tox] envlist = py27, py36 [testenv] deps = commands = python -m unittest discover 

在启动Tox之前,请确保包含程序包安装步骤的setup.py位于应用程序文件夹中。 如果不是,请使用setup.py创建指南

而且,如果您的项目不打算在PyPl上分发,则可以通过在tox标题下的tox.ini文件中添加以下行来跳过此要求:

 [tox] envlist = py27, py36 skipsdist=True 

如果不创建setup.py,并且应用程序对PyPl有一些依赖关系,则需要在testenv部分中对其进行澄清。 例如,Django将需要以下内容:

 [testenv] deps = django 

在此步骤结束时,您可以运行测试。

现在您可以运行Tox,它将创建两个虚拟环境:一个用于Python 2.7,一个用于Python 3.6。 Tox目录称为.tox/ 。 在其中,Tox将为每个虚拟环境运行-m unittest discover

您可以通过从命令行调用Tox来启动此过程:

 $ tox 

Tox将针对每种环境产生测试结果。 第一次启动Tox时,创建虚拟环境会花费一些时间,但是第二次运行Tox时,一切都会更快。
Tox的结果非常简单。 为每个版本创建环境,安装依赖关系,然后运行测试命令。

还有一些其他命令行选项值得记住。
运行单个环境,例如Python 3.6:

 $ tox -e py36 

当依赖项更改或旁包损坏时,重新创建虚拟环境:

 $ tox -r 

使用不太详细的发现运行Tox:

 $ tox -q 

使用更详细的输出运行Tox:

 $ tox -v 

您可以在Tox文档站点上阅读有关Tox的更多信息。

测试自动化

到目前为止,您已经通过运行命令手动执行了测试。 但是,有些工具可以在进行更改时自动运行测试,并将其提交到具有版本控制系统的存储库,例如,Git。 测试自动化工具通常被称为CI / CD工具,意思是“持续集成/持续部署”。 他们可以运行测试,编译和发布应用程序,甚至将它们部署到生产环境中。
Travis CI是可用的许多CI服务之一。

Travis CI与Python配合良好,现在您可以在云中自动执行所有创建的测试! Travis CI对于GitHub和GitLab上的任何开源项目都是免费的,对于私人项目则需要付费。

首先,请使用GitHub或GitLab凭据登录并进行身份验证。 然后创建一个名为.travis.yml的文件, .travis.yml包含以下内容:

 language: python python: - "2.7" - "3.7" install: - pip install -r requirements.txt script: - python -m unittest discover 

此配置为Travis CI提供以下指导:

  • 测试Python 2.7和3.7(可选,您可以将它们替换为其他任何Python。)
  • 安装requirements.txt中列出的所有软件包(如果没有依赖项,则可以删除此部分。)
  • 运行python -m unittest发现以运行测试。

提交并推送此文件后,每次您推送到远程Git存储库时,Travis CI都会运行这些命令。 可以在其网站上查看结果。

接下来是什么

现在您知道了如何编写测试,将其添加到项目中,执行它们甚至自动执行它们,因此您可以熟悉高级方法,随着测试库的增长,这些方法将派上用场。

Linter应用简介

Tox和Travis CI设有测试团队。 在本教程中,我们使用python -m unittest discover作为测试团队。

您可以在这些工具中提供一个或多个命令,这些命令将添加新的工具以提高应用程序的质量。

一种这样的应用是短绒。 他将查看您的代码并留下评论。 因此,他可以提供有关错误的建议,正确的尾随空格,甚至可以预见潜在的错误。

要了解有关linter的更多信息, 请查看Python代码质量教程

flake的被动皮棉8

flake8是一种流行的短毛绒,它根据PEP 8规范留下有关代码样式的注释。

您可以使用pip安装flake8

 $ pip install flake8 

然后,您可以为单个文件,文件夹或模板运行flake8

 $ flake8 test.py test.py:6:1: E302 expected 2 blank lines, found 1 test.py:23:1: E305 expected 2 blank lines after class or function definition, found 1 test.py:24:20: W292 no newline at end of file 

您将在flake8发现的代码中看到错误和警告的列表。
flake8可以在命令行或项目配置文件中进行配置。 如果要忽略某些规则,例如上面显示的E305,则可以在配置中进行设置。 flake8将检查项目文件夹中的setup.cfg文件或setup.cfg文件。 如果要使用Tox,可以将flake8配置flake8添加到tox.ini

本示例将忽略.git和__pycache__目录以及E305规则。 此外,字符串的最大长度从80个字符增加到90个字符。您可能会意识到,每行79个字符的标准限制不适用于可能包含长方法名,带有测试值和其他长数据。 通常,对于测试,将字符串长度增加到120个字符:

 [flake8] ignore = E305 exclude = .git,__pycache__ max-line-length = 90 

或者,您可以在命令行上提供以下选项:

 $ flake8 --ignore E305 --exclude .git,__pycache__ --max-line-length=90 

可以在文档站点上找到设置的完整列表。
现在,您可以将flake8添加到CI设置中。 对于Travis CI,它将如下所示:

 matrix: include: - python: "2.7" script: "flake8" 

Travis将读取.flake8的配置,并且如果出现棉绒错误,将无法完成构建。 确保将flake8依赖项添加到requirements.txt文件。

使用代码格式化程序进行进取性整理

flake8是一个被动的flake8 ,仅建议编辑;您必须自己将其输入代码中。 代码格式化程序是一种更具攻击性的方法。 它会根据样式和布局自动更改代码。

black是一个非常强大的格式化程序。 它没有设置,非常细致。 这使其成为插入测试管道的绝佳工具。

请注意:黑色需要Python 3.6及更高版本。

您可以使用pip安装black

 $ pip install black 

然后,要从命令行开始,请指定要格式化的文件或目录:

 $ black test.py 

保持测试代码干净

您可能会注意到,编写测试时,与创建常规应用程序相比,复制粘贴代码片段的频率要高得多。 测试有时会非常单调,但这并不是将代码以不准确且分散的形式丢弃的原因。

随着时间的流逝, 技术债务将累积在您的测试代码中,并且由于结构的原因,要在测试中对应用程序代码进行重大更改而进行必要的更改将变得非常困难。

编写测试时,请尝试遵循DRY原则:不要重复自己。

测试装置和功能是编写易于维护的代码的好方法。 另外,不要忘记阅读的便利性。 考虑将诸如flake8类的flake8工具部署到测试代码中:

 $ flake8 --max-line-length=120 tests/ 

测试以检测编辑之间生产率的下降

有许多方法可以在Python中对代码进行基准测试。 标准库具有一个timeit模块,该模块可多次调度函数并向您显示分布。 在此示例中,将执行test()100次,然后使用print()给出输出:

 def test(): # ... your code if __name__ == '__main__': import timeit print(timeit.timeit("test()", setup="from __main__ import test", number=100)) 

如果您决定将pytest用作测试运行器,请查看pytest-benchmark插件。 它提供了一个称为基准的pytest固定装置。 任何被调用的对象都可以传递给基准测试(),它解析pytest结果中被调用的时间。

您可以使用pip从PyPl安装pytest-benchmark:

 $ pip install pytest-benchmark 

然后,您可以使用夹具添加测试,并将调用的对象传递给执行:

 def test_my_function(benchmark): result = benchmark(test) 

运行pytest将为您提供基准测试结果:



您可以在文档站点上了解更多信息

测试识别安全性错误

您应该在应用程序上运行的另一项测试是检查常见错误和安全漏洞。

使用pip从PyPl安装bandit

 $ pip install bandit 

然后,您可以使用-r标志传递应用程序模块的名称,并获取简要信息:

 $ bandit -r my_sum [main] INFO profile include tests: None [main] INFO profile exclude tests: None [main] INFO cli include tests: None [main] INFO cli exclude tests: None [main] INFO running on Python 3.5.2 Run started:2018-10-08 00:35:02.669550 Test results: No issues identified. Code scanned: Total lines of code: 5 Total lines skipped (#nosec): 0 Run metrics: Total issues (by severity): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Total issues (by confidence): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Files skipped (0): 

flake8 ,可以配置bandit标志bandit ,并且如果要忽略其中的一些bandit可以使用参数将以下片段添加到setup.cfg文件中:

 [bandit] exclude: /test tests: B101,B102,B301 

有关更多信息, 请访问GitHub网站

结论

借助验证应用程序正确运行所必需的内置命令和库,Python使得测试可用。 在Python中开始测试很容易:您可以使用unittest并编写小的,易于维护的方法来测试代码。

当您了解有关测试和扩展应用程序的更多信息时,请考虑切换到pytest等测试框架之一,以便开始使用更多高级功能。

感谢您的阅读。 使用Python拥有明确的未来!

对于那些阅读过这篇文章的人,我们还有一个好消息。 现在,您可以以10,000卢布的折扣获得Python Developer课程!

第一部分
第二部分

Source: https://habr.com/ru/post/zh-CN444204/


All Articles