成功的Python项目的10个步骤

该材料(我们今天发布的翻译)专用于工具,这些工具可为Python项目配备代码格式,测试,持续集成和依赖性分析工具。 这有助于加快开发过程,有助于提高代码的质量,统一性和安全性。 假定该材料的读者已经在Python开发方面拥有一些经验,并且他在阅读过程中将尝试使用该Python项目。 如果您没有这样的项目,则可以在这里学习如何准备开发环境并创建Python包。 此处给出的示例是使用macOS和Python 3.7编写的。



步骤1.安装黑色



项目代码必须遵循代码样式约定。 Black是一个Python软件包,可自动格式化代码,使其外观达到PEP 8标准。 Black是一个相对较新的项目,但已经获得了超过一百万的下载量。 它的使用迅速成为Python开发中良好品味的标志。 是黑色手册。

我作为代码编辑器使用Atom,因此我向Atom添加了Python-Black软件包。 您可以在此处了解如何安装它。 安装此软件包后,Atom将在保存文件后重新格式化代码。

当我们谈论Black时-让我们为该工具配备与我们一起从事该项目的人员的开发环境。 结果,每个在项目上工作的人都将使用相同的代码格式规则,否则将不接受其拉取请求。

black==18.9b0添加到requirements_dev.txt文件的第一个找到的空闲行,然后运行install -r requirements_dev.txt命令。

默认情况下,黑色将代码行的长度设置为88个字符。 一些样式指南(例如Sphinx )要求字符串长度为79个字符。 在Black-Atom程序包的设置中,您可以设置所需的行长。

现在,我们已经获得了可以节省代码格式化时间的工具,我们将考虑如何加快和简化将代码发送到PyPI的过程。

步骤2.创建.pypirc文件


当使用twine将应用程序集发送到TestPyPI和PyPI时,必须手动输入登录信息。 如果您不熟悉麻线,请查看材料。 现在,我们将自动执行此过程。

Twine可以使用.pypirc文件,该文件应该位于我们的主目录中。 此工具用于卸载数据,并从给定文件中获取URL,用户名和密码。

因此,在您的主目录中创建一个.pypirc文件:

 touch ~/.pypirc 

向其添加以下文本:

 [distutils] index-servers =   pypi   testpypi [testpypi] repository: https://test.pypi.org/legacy username = your_username password = your_pypitest_password [pypi] username = your_username password = your_pypi_password 

很明显,您必须在此处输入您的真实用户名和密码。 另外,请检查此文件是否保存在主目录中,而不是在当前工作目录中。 如果要保护此文件免受其他用户的侵害,可以使用命令行工具配置其权限:

 chmod 600 ~/.pypirc 

现在,您可以使用以下命令将软件包加载到TestPyPI中:

 twine upload -r testpypi dist/* 

在常规PyPI中,您可以像这样加载软件包:

 twine upload dist/* 

获取.pypirc文件后,您不再需要手动输入用户名和密码。

现在,让我们在开发环境中添加测试工具,这将使我们能够验证正在创建的程序包的正确操作。

步骤3.安装和配置pytest



Pytest是最流行的,易于使用的库,用于测试用Python编写的代码。 在此示例中,我们将向项目添加简单的测试。 现在 ,如果您对pytest的详细信息感兴趣,那么此工具是一个很好的入门指南。

将pytest详细信息添加到requirements_dev.txt

 pytest==4.3.0 

让我们安装软件包:

 pip install requirements_dev.txt 

现在执行以下命令,这将允许pytest查找我们的软件包:

 pip install -e . 

如果您停用了虚拟开发环境,则将需要再次运行两个pip命令来运行测试。

步骤4.创建测试


test文件夹添加到项目的根目录。 将文件test_your_package_name.py放入其中。 我的文件称为test_notebookc.py 。 如果文件名以test_ ,则pytest可以自动检测到该文件。

我在test_notebookc.py文件中添加了以下测试,旨在检查该函数是否显示正确的名称。 修改此代码,使其中使用的文件和函数名称与您的匹配,并在其中描述您自己的测试。

 """Tests for `notebookc` package.""" import pytest from notebookc import notebookc def test_convert(capsys):   """Correct my_name argument prints"""   notebookc.convert("Jill")   captured = capsys.readouterr()   assert "Jall" in captured.out 

这是怎么回事

首先,我们在这里导入模块。 然后,我们创建一个名称根据模板test_my_function_name构建的函数。 此功能命名约定使其他人可以阅读您的项目代码,以快速了解测试中正在测试的内容。 另外,这对于使用测试来控制代码覆盖范围的软件包很有必要,我们将在下面讨论。

之后,我们调用函数( convert ),并将名称Jill作为参数传递给该函数。 下一步-捕获函数显示的内容。 值得一提的是,所讨论的功能非常简单。 她采用my_name参数并执行以下操作:

 print(f"I'll convert a notebook for you some day, {my_name}.") 

Pytest会检查函数输出的Jall中是否Jall 。 由于我们传递了Jill函数,因此该行不应存在。 是pytest文档,您可以在其中找到有关拦截输出的信息。

通过在命令提示符下键入pytest运行测试。 该测试应该失败。 错误信息以红色显示。


测试期间检测到错误。

建议检查测试的正确性,并描述它们,以便在某些情况下以错误结尾。 您不应编写仅发出绿色消息的测试,否则可能会导致测试根本不检查为验证而编写的内容。

在确保测试失败之后,将Jall语句更改为Jill并再次运行测试。 现在它应该成功完成。


成功完成测试。

现在一切都很好。 通过测试,您可以确保如果有人在我们的函数中传递了一行,则该行将落入该函数显示的文本中。

您还可以编写一个测试,以检查该函数如何处理传递给它的数据。 即,如果接收到其类型不同于字符串的数据,则应导致TypeError错误。 这是一些有关Python中的异常和错误处理的好东西。

在创建之前的测试时,我们编写了导致测试成功完成的代码。 这称为测试驱动开发(TDD)。 TDD是一种行之有效的编程方法,可以帮助您编写比没有TDD时错误更少的代码。 这是一些有用的TDD材料。

现在,作为练习,尝试编写一个检查convert()函数的测试,以便在将不同于字符串的内容传递给它时,它将引发错误,并为此函数实现适当的机制。 请注意,整数,列表和字典将转换为字符串。

软件包成功通过测试后,我们准备利用持续集成系统。

步骤5.在Travis CI服务及其配置中注册



Travis CI是“用于构建和测试软件的分布式Web服务”。 它最近被Idera购买。 还有其他持续集成系统,但是Travis CI是流行的,开放源代码且有据可查的工具,因此我们将使用它。

Travis CI允许您仅将通过测试并符合标准的代码集成到项目中。 在这里,您可以阅读有关Travis CI的更多信息,并在此处了解持续集成的信息

https://travis-ci.org/上创建一个帐户。 接下来,单击链接Review and add your authorized organizations在配置文件页面上Review and add your authorized organizations 。 系统将提示您输入密码以访问GitHub。 单击“ Organization access部分中的“ Grant ”。


设置Travis CI帐户

我需要同步该帐户,以使有关notebooktoallnotebookc存储库的信息出现在该帐户中。 通常,要使Travis CI使用代码,大约需要一分钟。 之后,您需要使用下图所示的开关激活存储库。


储存库激活

现在单击Settings按钮。 在这里,您需要指示Travis是否可以基于请求请求或发送到存储库的分支进行构建。


项目构建设置

现在是时候设置我们正在处理的项目了,这将使Travis能够为每个拉动请求构建项目。

步骤6.创建.travis.yml文件


在项目根文件夹中,创建一个具有以下内容的.travis.yml文件:

 dist: xenial language: python python: 3.7.2 install: - pip install -r requirements_dev.txt - pip install -e . script: - pytest 

dist: xenial需要告诉Travis使用Ubuntu Xenial 16.04来组织虚拟环境。 要测试Python 3.7代码,需要Ubuntu Xenial,有关详细信息,请参见此处

install部分允许您安装项目开发中使用的软件包。 pip install -e .命令 在Travis的虚拟环境中执行我们软件包的安装。 之后,启动pytest的Travis将能够找到我们的软件包。

步骤7.在Travis CI中进行测试


提交更改,将其提交到GitHub,进行PR。 Travis应该在几秒钟内开始工作。


特拉维斯在工作

这是Travis在处理项目中所做的事情。


Travis在项目处理期间执行的操作

如果PR不成功-Travis会举报。 请注意,如果拉取请求失败,则可以将更改发送到同一分支,Travis将自动开始工作。

转到Travis网站上的存储库页面,然后四处看看。 在这里,您可以找到有关装配的许多有趣的东西。 可能在将来,当您尝试了解导致组装失败的原因时,您将经常访问该页面。

如果我们假设一切顺利,那么如果页面上包含绿色标签,则项目的验证和组装成功。


项目组装成功完成

如果页面上没有绿色或红色标签,请打开More options菜单,然后选择Requests 。 如果您在此处看到红色错误消息,请对其进行分析。 如果看到“需要Build config file is required错误消息,则表明Travis在存储库中找不到您的.travis.yml文件。 纠正它,错误将消失。

如果项目的组装不成功,并且有可能进行修复,Travis向用户发送电子邮件。

请记住,您可以发送提交以打开PR,Travis将自动重新启动项目构建过程。

现在,让我们分析我们的项目以使用测试覆盖代码。

步骤8.通过测试评估代码覆盖率


关于测试的代码覆盖率的报告使您可以找到项目代码的哪一部分(尽管很小)已经过测试。 要创建此类报告,我们将使用pytest-cov包。

将以下行添加到requirements_dev.txt文件:

 pytest-cov==2.6.1 

运行以下命令:

 pytest --cov=my_project_name 

就我而言,在执行pytest --cov=notebookc命令之后,将显示以下报告。


代码覆盖率报告

事实证明,所有项目代码都提供了测试。 如果整个项目由几行代码组成,则非常容易实现此类指标。

现在让我们谈谈一个工具,该工具可让您通过测试覆盖其代码来保持项目状态的公开历史记录。

步骤9.使用工作服


Coveralls项目使您可以维护有关测试代码覆盖率的历史信息。


工作服

为了利用此项目的功能,您需要使用GitHub帐户的数据在站点https://coveralls.io/上注册。 然后,您需要连接存储库。

requirements_dev.txt文件中,添加coveralls==1.6.0 。 顺便说一下,此文件在项目的现阶段工作应如下所示:

 pip==19.0.3 wheel==0.33.0 twine==1.13.0 pytest==4.3.0 pytest-cov==2.6.1 coveralls==1.6.0 

.travis.yml文件,将其转换为这种形式(在您的情况下,项目名称将在此处):

 dist: xenial language: python python: 3.7.2 install: — pip install -r requirements_dev.txt — pip install -e . script: — pytest --cov=my_package_name after_success: — coveralls 

现在,当Travis构建项目时,他将安装必要的程序包,运行测试并创建有关测试代码覆盖率的报告。 然后,此报告将发送到Coveralls服务。

提交,将代码提交到GitHub,然后看看会发生什么。 代码覆盖率测试报告可能需要几分钟才能进入Coveralls。


项目处理,测试覆盖率报告

现在,在PR检查中,还有Coverovers执行的检查。

在“工作服”页面上,您可以验证项目是否100%被测试覆盖。


测试覆盖率信息

现在,让我们为项目配备另一个有用的工具。

步骤10.使用PyUp


通过PyUp.io服务,开发人员可以了解开发人员使用的依赖项是否过时以及它们是否存在漏洞。 该服务会自动执行旨在更新GitHub上软件包的请求请求。 为了利用此项目的功能,您需要使用GitHub帐户在其网站上注册-https: //pyup.io/ 。 添加存储库时,建议将“ Update Schedules设置为Update Schedules every week 。 使用这种方法,如果您的项目具有许多依赖关系,则不会遇到太多的请求请求。


配置更新

这是PyUp.io网站上的软件包信息,其中有些已经过时。


包装详情

使用此服务,您将始终知道何时使用最新版本的软件包。 正如他们所说,知识是成功的一半。 第二部分显然是用于更新依赖项的自动拉取请求。

总结


在本文中,您学习了在开发Python项目时如何使用诸如Black,pytest,Travis CI,Coveralls和PyUp之类的工具。 它们帮助控制项目依赖关系,格式化和测试代码,以及验证和构建项目。 我们希望您发现这些工具有用。

亲爱的读者们! 开发Python项目时使用什么工具?

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


All Articles