测试

Bokeh是一个大型的、多语言的项目,它依赖于各种各样和广泛的测试和测试工具来保持能力和防止倒退。本章描述了如何在开发环境中本地运行各种测试,编写测试的指南,以及有关连续测试基础设施的信息。

在本地运行测试

在尝试运行Bokeh测试之前,请确保已成功运行了 正在设置 开发人员指南的一节。

测试选择

此外,在某些平台上,您可能需要增加打开的文件描述符的最大数量,因为有些测试会打开许多文件来测试服务器。

ulimit -n 1024

要运行所有基本的python单元测试,请在存储库的顶层运行以下命令:

pytest tests/unit

注意,这包括需要安装Selenium和适当的web驱动程序(例如chromedriver和geckodriver)的单元测试。要排除这些单元测试,可以运行以下命令:

pytest -m "not selenium" tests/unit

要只运行BokehJS单元测试,请执行:

pytest tests/test_bokehjs.py

或者,也可以导航到 bokehjs 源签出并执行的子目录:

node make test

您可以运行所有可用的测试(python和JS单元测试,以及示例和集成测试) from the top-level directory 通过执行:

pytest

要了解有关标记测试函数和选择/取消选择它们以进行运行的更多信息,请参考 custom markers . 当前定义的测试标记列表如下:

  • sampledata :要求的测试 bokeh.sampledata 被下载

  • selenium :需要硒的试验

代码覆盖率

要运行覆盖率的任何测试,请使用以下命令:

pytest --cov=bokeh

要报告Bokeh包的一个子集,请通过例如。 -cov=bokeh/models .

其他选项

要在不捕获标准输出的情况下运行任何测试,请使用:

pytest -s

pytest 更多信息的文件 pytest 以及它的选择。

示例测试

这个 examples 测试运行一系列Bokeh示例并生成图像以与以前的版本进行比较。将生成一个报告,其中显示当前和以前的图像,以及任何图像差异。

注解

如果图像不同,测试当前不会失败,必须手动检查测试报告。

要只运行示例测试,请运行以下命令:

pytest --report-path=examples.html test_examples.py

测试运行后,您将能够在 examples.html . 在本地运行,您可以随意命名测试报告。

示例测试可以运行得很慢,为了加快速度,可以将它们并行化:

pytest --report-path=examples.html -n 5 test_examples.py

Where n is the number of cores you want to use.

此外,示例测试生成一个日志文件,示例.log你可以在 examples.log 在运行测试的同一目录中。

写作测试

为了保持Bokeh的可维护性,所有涉及代码的Pull请求通常都应该附带相关的测试。虽然在特定的情况下可能会有例外,但默认的假设应该是没有测试的Pull请求可能不会被合并。

Python单元测试

维护基本的Python单元测试的Python部分。以下几条一般准则将帮助您编写Python单元测试:

绝对进口量

为了确保Bokeh的单元测试尽可能的可重定位和明确,总是倾向于在测试文件中绝对导入。方便时,导入并使用整个被测模块:

  • GOODimport bokeh.models.transforms as bmt

  • GOODfrom bokeh.embed import components

  • BADfrom ..document import Document

脓包

所有新的测试都应该使用并假设 pytest 对于测试运行、夹具、参数化测试等,新的测试应该 not 使用 unittest Python标准库的模块。

JavaScript单元测试

这些测试维护了Bokeh项目BokehJS部分的功能。BokehJS测试位于 bokehjs/test . 他们是用柴“期待”风格写的。如果添加了新的测试文件,则在目录中添加适当的条目 index 应添加文件。

集成测试

要添加新的屏幕截图集成测试,请首先确保您可以运行现有的屏幕截图测试,例如 tests/integration/annotations/test_whisker.py . 新的截图测试应遵循以下一般准则:

  • 尽可能简单(只包括测试中的东西,不需要额外的东西)

  • 喜欢 bokeh.models API

一旦编写了一个新的测试,就需要一个基本的图像进行比较。要创建新的基图像,请添加 --set-new-base-screenshot 符合你的标准 pytest 命令来运行测试。这将生成一个名为 base__<name_of_your_test>.png 在适当的目录中。使用 git 将此图像签入存储库,然后将所有未来的屏幕截图测试与此基本映像进行比较。

持续集成

每一次推到 master branch or any Pull Request branch on GitHub automatically triggers a full test build on the GithubCI 持续集成服务。

您可以在以下URL查看所有当前和以前版本的列表:https://github.com/bokeh/bokeh/actions

配置

有许多文件会影响生成配置:

  • conda.recipe/meta.yaml

    为Bokeh构建conda-noarch包的说明。此文件是构建和测试(但不是运行时)依赖关系的唯一真实来源。

  • setup.py

    用于构建sdist包和“dev”安装。该文件也是运行时依赖项的唯一真理源。

  • setup.cfg

    包含一些生成和测试工具的全局配置,例如 versioneerpytest .

礼仪

CI服务为开源项目提供有限的免费构建工人。以下几点考虑将有助于您为需要这些有限资源的其他人着想:

  • 在推送到GitHub之前,将提交分组到有意义的工作块中(即不要每次提交都推送)。

  • 如果贵的话 examples 不需要测试(例如,对于仅限文档的请求),可以通过添加文本来禁用测试

    [ci disable examples]
    

    到你的提交消息。