假包裹

dummypackage-dummyname的Python项目详细描述


python3模板构建状态pypi versiondocumentation status

虚拟python3项目提供开发结构、单元测试、运行时/内存基准测试、pep8检查、自动文档编制和部署到pypigithub发布,通过travis ci自动化(在线和本地)。

本自述文件是为类似ubuntu的系统开发的,但其目的是尽可能不依赖于操作系统(所有python示例都应该很好地传输到其他系统)。还请注意,这只针对python 3进行了测试,请确保您的python命令调用python3二进制文件(或者您修改此处提供的示例)。

依赖项:

一些常规依赖项列在.travis.yml文件的addons标记下。有关特定于python的依赖项,请参见requirements.txt。此外,如果不使用conda,请将此行添加到.bashrc中,以允许执行安装有pip--user的二进制文件:

exportPATH=${PATH}:$HOME/.local/bin

单元测试:

所有单元测试文件必须满足以下要求(有关详细信息,请参见示例):

如果满足这些条件,则可以从cli或在python中运行所有测试。

注意:utest目录包含一个特殊的测试用例,tautology.py应该始终通过,可以用来确保测试设施正常工作。它的名称不会以\u test.py结尾,因此不会包含在普通测试中,必须显式调用它。

从cli运行:

# run all existing tests
python -m unittest discover -s utest -t . -p "*_test.py" -v
# Run individual test modules (from the repo root dir)
python -m unittest utest/foo_test.py -v
python -m unittest utest/bar_test.py -v
python -m unittest utest/nestedtests/nested_test.py -v
# Run individual classes
python -m unittest utest.foo_test.FooTestCaseCpu -v
python -m unittest utest.nestedtests.nested_test.QuackTestCaseCpu -v
# Run individual methods
python -m unittest utest.bar_test.BarTestCaseCpu.test_inheritance -v

在python中运行:

# run all existing tests and collect resultsimportutestresults=utest.run_all_tests()print(results)# run all tests for a given module and collect resultsimportutest.foo_testresults=utest.run_module(utest.foo_test);print(results)# run for several modules:importutestimportutest.foo_testasfimportutest.nestedtests.nested_testasnresults=utest.run_modules([f,n]);print(results)# run for a single testcaseimportutestfromutest.foo_testimportFooTestCaseCpuresults=utest.run_testcase(FooTestCaseCpu);print(results)# run for several testcasesimportutestfromutest.foo_testimportFooTestCaseCpufromutest.bar_testimportBarTestCaseCpuresults=utest.run_testcases([FooTestCaseCpu,BarTestCaseCpu]);print(results)# run for a single methodimportutestresults=utest.run_testmethod("utest.foo_test.FooTestCaseCpu.test_loop");print(results)# run for several methodsimportutestresults=utest.run_testmethods(["utest.foo_test.FooTestCaseCpu.test_loop","utest.bar_test.BarTestCaseCpu.test_loop"]);print(results)

代码覆盖范围:

代码覆盖率决定了单元测试要经历多少实现的代码。虽然不是特别好,但它可以用来检查单元测试是否与开发的代码密切相关。此外,它易于自动化。

来自cli:

这种用法与使用python运行非常相似,但在前面加上coverage run并添加一个--source目录,其中包含要检查的实际代码池:

# define the location for the coverage file:
export COVERAGE_FILE=codecoverage/coverage`date "+%Y%m%d_%H%M%S"`

# Run whatever you want to run but prepending 'coverage run'
# the --branch flag activates branch coverage (as opposed to statement coverage)
# the -a flag will accumulate the reports
coverage run --source dummypackage --branch -m unittest discover -s utest -t . -p "*_test.py" -v

# Print report on terminal
coverage report -m

# more elaborated XML report:
coverage xml -o $COVERAGE_FILE.xml

# interactive HTML report
coverage html -d $COVERAGE_FILE\_html
firefox $COVERAGE_FILE\_html/index.html

在python中:

此示例脚本在不创建任何文件的情况下执行单元测试和测试覆盖率(请参见脚本ci-scripts/utest-u with-coverage.py):

importcoverageimportutest# same as with the CLI. A suffix will be automatically addedCOVERAGE_FILE="codecoverage/coverage"# wrap the testing with the coverage analyzer:c=coverage.Coverage(data_file=COVERAGE_FILE,data_suffix=True,branch=True,source=["dummypackage"])c.start()test_results=utest.run_all_tests()c.stop()# at this point c.save() and c.html_report(outfile=etc) would generate files.# This instead handles the data within Python, as coverage.CoverageDatapercentage=c.report()print("This script did",test_results.testsRun,"tests in total.")print("No. of test errors:",len(test_results.errors))print("No. of test failures:",len(test_results.failures))print("Code coverage of tests (percentage):",percentage)

CPU运行时基准:

在终端上运行并打印,按总时间排序:

python -m cProfile -s tottime dummyapp.py

它可以按以下任何一种进行排序:

calls (call count)
cumulative (cumulative time)
cumtime (cumulative time)
file (file name)
filename (file name)
module (file name)
ncalls (call count)
pcalls (primitive call count)
line (line number)
name (function name)
nfl (name/file/line)
stdname (standard name)
time (internal time)
tottime (internal time)

样本输出:

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      100    1.496    0.015    1.496    0.015 {method 'index' of 'list' objects}
        1    0.023    0.023    0.023    0.023 bar_module.py:15(__init__)
     93/1    0.016    0.000    1.590    1.590 {built-in method builtins.exec}
        1    0.010    0.010    1.590    1.590 dummyapp.py:6(<module>)
       47    0.005    0.000    0.005    0.000 {built-in method marshal.loads}
  229/227    0.004    0.000    0.011    0.000 {built-in method builtins.__build_class__}

保存到文件中,并使用snakevis与web浏览器交互浏览:

python -m cProfile -o timebenchmark/dummyapp.`date "+%Y%m%d_%H%M%S"` dummyapp.py
# open results in browser using the snakeviz server
snakeviz timebenchmark/dummyapp.20190112_195256

在python中:

这个小片段将结果打印到终端并返回一些相关的图形(请参见脚本ci_scripts/runtime_benchmark.py):

exportPATH=${PATH}:$HOME/.local/bin
0

内存基准:

这个包逐行或作为时间函数报告python进程的内存使用情况。与运行时探查器一样,有几种方法可以运行此功能。

装饰工:

这种方法需要在python文件的所需def声明中导入并使用@profiledecorator。与其他方法不同,它的缺点是需要更改或复制源代码。要执行分析,请使用python解释器运行修饰过的文件(如memorybenchmark目录)。样本输出:

exportPATH=${PATH}:$HOME/.local/bin
1

基于时间的内存使用:

模块提供mprof二进制文件来执行基于时间的分析。调用mprof run loop_benchmark.py将生成一个mprofile_timestamp.dat文件,该文件可以用mprof plot可视化(如果安装了pylab/matplotlib),如下所示:

exportPATH=${PATH}:$HOME/.local/bin
2

可用的mprof命令是:

exportPATH=${PATH}:$HOME/.local/bin
3

有关更多信息,请参见软件包主页。

在python中:

这个小片段将内存使用作为时间函数返回(请参见脚本ci_scripts/runtime_benchmark.py)。使用lineprofiler类的逐行分析似乎不受此方法的支持,请参阅第一和第二种方法以获取替代方法:

exportPATH=${PATH}:$HOME/.local/bin
4

代码样式检查:

使用它非常简单:只需在存储库根目录中调用flake8python-mlflake8。如果出现任何错误,命令将打印这些错误并返回错误状态。

注意一些"错误"实际上是设计决策情绪。这些可以通过noqa指令绕过,比如:import environment\noqa:f401。运行flake8--disable noqa可以忽略noqa指令本身。

自动文档:

这个项目提供了一个脚本,可以使用sphinx(以及pdf的乳胶)从头开始生成html和pdf格式的包的autodocs。用法示例:

exportPATH=${PATH}:$HOME/.local/bin
5

这些文档将生成docs/_build(它们也将被上载到存储库中,因为它们没有被.gitignore)过滤。

或者,您可以通过将文档与github帐户同步,将其部署到https://readthedocs.org/中。导入存储库应该很简单:页面将自动找到您的conf.py并生成文档。项目的文档主页应该提供一个类似于自述文件顶部的徽章和一个指向在线文档的链接。注意,可以在"管理"选项卡中删除广告。此回购协议的文档正部署到https://python3-template.readthedocs.io

默认情况下,它将提供两个版本的文档:最新的稳定的。请参见ReadtheDocs中有关版本控制的此链接:此处

来自cli:

所提供的python脚本与cli用户使用以下bash脚本所做的操作密切相关:

exportPATH=${PATH}:$HOME/.local/bin
6

版本控制、构建和部署:

标记:

一旦达到给定的里程碑,我们就可以用版本标签(比如v1.0.13)标记特定的提交。这里讨论的基础知识是:https://git scm.com/book/en/v2/git basics tagging。尤其要注意,标签必须显式地包含在push中:git push--follow tags,否则,它们不会被发送到服务器。如果希望这是默认行为(如本项目中假设的那样),请调用git config--global push.followtags true,然后每个常规的git push也将推送所有有效的现有标记。

处理标记系统有不同的方法,其中非常流行的是gitcli和gitpython。因为我们需要非常具体的功能,所以我们使用bump2version第三方库:它允许根据语义版本控制自动增加和设置版本标记(参见https://semver.org/),这是非常受鼓励的。其工作原理如下:

  • .bumpversion.cfg文件保存当前版本和配置。
  • 调用bump2version<;advance>;将自动更新.bumpversion.cfg和其他指定文件中的版本,并将相应的标记添加到git repo。<;advance>;参数可以是majorminor,也可以是patch

所以我们只需要在.bumpversion.cfg文件中设置所需的版本(通常0.1.0)来启动repo,然后正常提交。添加标记的过程如下:

  1. 一旦达到里程碑,使用自上一个版本以来的更改更新changelog.md文件。要维护最佳更改日志,请参见https://keepachangelog.com
  • 理想情况下,您在顶部保留了一个未发布的部分,您可以很容易地将其命名为即将发布的版本。为新功能添加。
  • 要列出的主要标记是添加、更改、弃用、删除、修复和安全性
  • 明确而广泛地陈述那些会破坏落后国家的反对意见和事情。能力:
  • 遵循每个标记的语义版本控制,并为其添加日期。
  1. 确保保存了所有文件并提交以避免git working directory is not clean错误。还要确保.bumpversion.cfg文件中的所有指定文件都存在(例如docs/conf.py
  2. 使用相应的递增标签调用bump2version<;label>;主要、次要或修补程序
  3. git push查看更改!根据您的分支,这将触发Travis构建/部署。

请注意,ci_scripts/bumpversion_utils.py脚本提供了一些在python中与bumpversion交互的功能(例如获取当前版本)。作为cli中的一个quickfix,以下命令将起作用:

exportPATH=${PATH}:$HOME/.local/bin
7

生成和本地安装:

setup.py脚本将在source distsdist)和wheel表单中构建包。包将位于dist目录中,一些文件也将生成到build目录中。重要信息:请记住根据回购协议的需要调整设置函数调用中的变量(除了版本,正如我们所看到的,由bump2version处理)。

exportPATH=${PATH}:$HOME/.local/bin
8

请注意,原则上,如果已通过Travis自动部署,则无需手动构建包。

Github版本:

我们看到github会自动跟踪标签。但对于每个版本,我们希望在默认行为中添加两项内容:

  1. 指定更改日志
  2. PIP可安装包,格式为车轮。

这可以通过github网页中的浏览器手动执行,也可以通过cli执行,如github api中所述。

请注意,原则上,如果已通过Travis自动展开,则无需手动展开。

PYPI版本:

构建的包也可以发布到pypi,一个流行的python包的全局存储库。下面的命令上载dist目录中的所有内容。您需要提供pypi凭据(如果您没有凭据,请创建一个用户):

exportPATH=${PATH}:$HOME/.local/bin
9

请注意,原则上,如果已通过Travis自动展开,则无需手动展开。

特拉维斯ci:

简介:

在cd/ci的上下文中,git存储库(或任何其他类似的对象,用于自动执行任务)被视为一个材料,其特定的触发操作集(例如git repo中的提交或拉取请求,或自定义rest系统中的某些api请求)。把材料看作,把动作看作它们的方法,可能会有帮助。

对于这些操作中的每一个,都可以定义一个cd/ci管道,cd/ci系统将在某个事件触发时执行该管道。根据ci系统的不同,管道允许一些类似分支的复杂性,但最好保持尽可能简单。

虽然不同的材料有不同的作用,但其精神大体上是相似的,即所谓的词。引用

< Buff行情>

"持续集成是每一个自尊的软件项目应该采用的各种技术和实践的保护伞:

  • 构建自动化-对scm repo的每次提交/推送都会自动触发一个新的构建(主分支中的任何内容都是可部署的)
  • 测试自动化-测试被评估为构建过程的一个组成部分(这是老新闻,对吧?)
  • 供应链集成-主要是为了促进构建自动化,但也能够报告问题、版本、里程碑,…
  • 项目管理集成-Basecamp、CampFire、AcuNote和其他PM工具(人员、任务、日程安排等)
  • 项目仪表板-所有内容都是公开的(通常没有任何读取访问限制,使所有相关方都可以使用)

特拉维斯和这份回购协议:

travis是一个ci/cd工具,可以免费轻松地链接到github帐户,并通过repo根目录下的travis.yaml文件进行管理(更多信息请访问https://docs.travis-ci.com/user/languages/python/" rel="nofollow">https://docs.travis ci.com/user/languages/python/此存储库的目标是在每次提交给master之后触发travis,以执行以下任务:

  1. 并行运行:

    1. 使用flake检查编码样式
    2. 检查同义反复是否为真
    3. 检查所有单元测试是否通过
    4. 检查代码覆盖率是否高于数字
    5. 检查运行给定的例程是否永远不会超过特定的内存使用量
    6. 检查运行给定的例程是否不超过一定的持续时间
  2. 如果所有检查都成功,请将文档和dummypackage构建到我们所需的体系结构中。

  3. 以可以通过pip+repo link安装的方式部署包

为此,travis实现了两个基本概念,stagesjobs:stage是允许并行运行的一组作业。但是,每个阶段都会一个接一个地运行,并且只有在前一阶段中的所有作业都已成功通过时才会继续。如果一个作业在一个阶段中失败,则同一阶段中的所有其他作业仍将完成,但随后阶段中的所有作业将被取消,并且生成将失败。

每个作业都可以映射到"脚本",即对程序的调用。如果脚本返回非零状态,则部署将被视为失败,并且生成将被标记为"错误"。

默认情况下,travis会为每个作业从头开始一个新的虚拟机。在运行作业之前,必须安装所有必需的依赖项。这可能需要一段时间,因此以最小化开销的方式设计ci管道很有帮助。可以使用cache关键字在作业之间共享某些依赖项。此外,在执行某些任务之前进行的文件清理也可以跳过。

步骤:

  1. 将github帐户与travis同步,并允许访问存储库等。最后,"激活"Travis中所需的回购协议。您应该会看到典型的[build failing]徽章。单击它并将降价链接复制到repo的mainreadme中,如此文件顶部所示。

  2. 在GitHub的"激活的回购设置"中,选择要通知Travis的事件。在本例中,我们将激活提交和拉取请求。任何时候,Github都会向Travis发送一个包含所有相关信息的请求。

  3. 现在双方都了解对方,请确保您理解.travis.yml文件并根据需要进行自定义。

  4. 对于部署,travis需要您的用户凭据。因为用纯文本分发密码是不安全的,travis为您提供了加密密码的可能性。在这个项目中,我们需要pypigithub:

github发布配置:

travis可以配置为通过运行travis setup releases上传到github版本。如果您自己这样做,请小心,因为这将重新格式化travis.yml文件,删除所有注释和空行(尽管功能不会受到影响)。临时备份将有助于解决此问题。

在repo根目录中,运行travis setup releases并执行以下步骤:

  1. 确认回购名称
  2. 提供github凭据
  3. 仅从部署…->;是
  4. 加密API密钥->;是

方便的是,这个回购协议的travis.yml已经提供了释放到github的结构。无论如何,你必须用你自己的证件来代替这些证件。您可以在这里看到如何做到这一点:https://docs.travis ci.com/user/deployment/releases使用OAuth令牌进行身份验证

还请注意,可以使用关键字自定义版本,如名称、正文、草稿、预发布

https://docs staging.travis ci.com/user/deployment/releases/

PYPI发布配置:

与github版本一样,.travis.yml文件已经提供了部署到pypi的结构。你只需要用你自己的证件来代替。要加密密码,请使用以下命令(此处提供更多信息:https://docs.travis ci.com/user/encryption keys/)。同样,要小心,因为这样会重新格式化travis.yml文件,删除所有注释和空行(尽管功能不会受到影响)。临时备份将对此有所帮助:

# run all existing tests
python -m unittest discover -s utest -t . -p "*_test.py" -v
# Run individual test modules (from the repo root dir)
python -m unittest utest/foo_test.py -v
python -m unittest utest/bar_test.py -v
python -m unittest utest/nestedtests/nested_test.py -v
# Run individual classes
python -m unittest utest.foo_test.FooTestCaseCpu -v
python -m unittest utest.nestedtests.nested_test.QuackTestCaseCpu -v
# Run individual methods
python -m unittest utest.bar_test.BarTestCaseCpu.test_inheritance -v
0

为此,请确保安装了travis cli(请参见https://github.com/travis ci/travis.rb installation)。

分支:

travis生成将在master上触发,并仅标记生成。可以在dev分支上执行常规工作:

# run all existing tests
python -m unittest discover -s utest -t . -p "*_test.py" -v
# Run individual test modules (from the repo root dir)
python -m unittest utest/foo_test.py -v
python -m unittest utest/bar_test.py -v
python -m unittest utest/nestedtests/nested_test.py -v
# Run individual classes
python -m unittest utest.foo_test.FooTestCaseCpu -v
python -m unittest utest.nestedtests.nested_test.QuackTestCaseCpu -v
# Run individual methods
python -m unittest utest.bar_test.BarTestCaseCpu.test_inheritance -v
1

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java访问私有字段而不使用getter方法?   使用PowerMockito在JavaEWSAPI中模拟测试拉订阅   启动活动时未保存java首选项并清除变量   java如何在servlet中检索子域?斯普林有帮手吗   java使用Docker从命令行构建Android项目   java Android,ActionBar后退按钮(setDisplayHomeAsUpEnabled(true))重新创建父活动   java在重用FileOutputStream时应该关闭流吗?   java使用RESTAPI将文件上载到s3 bucket   Java SOAP Web服务应用程序中的mysql用户登录方法不工作   java使用多个数字计算百分比并转换为长   java Android SQLiteDatabase查询忽略空格   java如何在Javafx中比较两个字段文本   java错误:未设置java_HOME,在Eclipse安装后找不到   java在安卓中保存对象   java如何使用jaxws从返回List<Object>的服务中检索值   java Google OAuth2 JWT令牌验证异常   SpringMVC中的JavaUTF8编码问题,当从JSP表单发送POST请求中的越南语信件时   java从webview重定向到安卓应用程序   JUnit 5中多个扩展的java顺序