Bokeh是一个大型的、多语言的项目,它依赖于各种各样和广泛的测试和测试工具来保持能力和防止倒退。本章描述了如何在开发环境中本地运行各种测试,编写测试的指南,以及有关连续测试基础设施的信息。
在本地运行测试
测试选择
代码覆盖率
其他选项
示例测试
集成测试
写作测试
Python单元测试
JavaScript单元测试
持续集成
配置
礼仪
在尝试运行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 被下载
sampledata
bokeh.sampledata
selenium :需要硒的试验
selenium
要运行覆盖率的任何测试,请使用以下命令:
pytest --cov=bokeh
要报告Bokeh包的一个子集,请通过例如。 -cov=bokeh/models .
-cov=bokeh/models
要在不捕获标准输出的情况下运行任何测试,请使用:
pytest -s
见 pytest 更多信息的文件 pytest 以及它的选择。
这个 examples 测试运行一系列Bokeh示例并生成图像以与以前的版本进行比较。将生成一个报告,其中显示当前和以前的图像,以及任何图像差异。
examples
注解
如果图像不同,测试当前不会失败,必须手动检查测试报告。
要只运行示例测试,请运行以下命令:
pytest --report-path=examples.html test_examples.py
测试运行后,您将能够在 examples.html . 在本地运行,您可以随意命名测试报告。
examples.html
示例测试可以运行得很慢,为了加快速度,可以将它们并行化:
pytest --report-path=examples.html -n 5 test_examples.py
Where n is the number of cores you want to use.
n
此外,示例测试生成一个日志文件,示例.log你可以在 examples.log 在运行测试的同一目录中。
examples.log
为了保持Bokeh的可维护性,所有涉及代码的Pull请求通常都应该附带相关的测试。虽然在特定的情况下可能会有例外,但默认的假设应该是没有测试的Pull请求可能不会被合并。
维护基本的Python单元测试的Python部分。以下几条一般准则将帮助您编写Python单元测试:
为了确保Bokeh的单元测试尽可能的可重定位和明确,总是倾向于在测试文件中绝对导入。方便时,导入并使用整个被测模块:
GOOD : import bokeh.models.transforms as bmt
import bokeh.models.transforms as bmt
GOOD : from bokeh.embed import components
from bokeh.embed import components
BAD : from ..document import Document
from ..document import Document
所有新的测试都应该使用并假设 pytest 对于测试运行、夹具、参数化测试等,新的测试应该 not 使用 unittest Python标准库的模块。
unittest
这些测试维护了Bokeh项目BokehJS部分的功能。BokehJS测试位于 bokehjs/test . 他们是用柴“期待”风格写的。如果添加了新的测试文件,则在目录中添加适当的条目 index 应添加文件。
index
要添加新的屏幕截图集成测试,请首先确保您可以运行现有的屏幕截图测试,例如 tests/integration/annotations/test_whisker.py . 新的截图测试应遵循以下一般准则:
尽可能简单(只包括测试中的东西,不需要额外的东西)
喜欢 bokeh.models API
bokeh.models
一旦编写了一个新的测试,就需要一个基本的图像进行比较。要创建新的基图像,请添加 --set-new-base-screenshot 符合你的标准 pytest 命令来运行测试。这将生成一个名为 base__<name_of_your_test>.png 在适当的目录中。使用 git 将此图像签入存储库,然后将所有未来的屏幕截图测试与此基本映像进行比较。
--set-new-base-screenshot
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
有许多文件会影响生成配置:
为Bokeh构建conda-noarch包的说明。此文件是构建和测试(但不是运行时)依赖关系的唯一真实来源。
用于构建sdist包和“dev”安装。该文件也是运行时依赖项的唯一真理源。
包含一些生成和测试工具的全局配置,例如 versioneer 和 pytest .
versioneer
CI服务为开源项目提供有限的免费构建工人。以下几点考虑将有助于您为需要这些有限资源的其他人着想:
在推送到GitHub之前,将提交分组到有意义的工作块中(即不要每次提交都推送)。
如果贵的话 examples 不需要测试(例如,对于仅限文档的请求),可以通过添加文本来禁用测试
[ci disable examples]
到你的提交消息。