Bokeh项目测试编写指南:从单元测试到视觉回归测试
为什么测试对Bokeh项目如此重要
在Bokeh可视化库的开发过程中,测试是确保代码质量和功能稳定性的关键环节。作为数据可视化工具,Bokeh不仅需要保证代码逻辑正确,还需要确保可视化输出的一致性和准确性。本文将全面介绍如何在Bokeh项目中编写各类测试。
Python测试编写规范
单元测试基础
Bokeh的Python单元测试位于tests/unit/bokeh
目录下,其结构反映了Bokeh的Python模型组织结构。每个测试文件以test_
开头,后接模块名称。
最佳实践建议:
- 使用绝对导入而非相对导入
- 导入被测模型时使用
as
语法简化引用 - 优先使用pytest而非unittest框架
测试示例
# 正确导入方式示例
import bokeh.plotting.graph as bpg
def test_graph_rendering():
# 测试代码
pass
BokehJS测试体系
单元测试编写
BokehJS单元测试采用TypeScript编写,位于bokehjs/test/unit/
目录。测试框架使用describe()
和it()
函数组织测试用例,断言则通过expect()
和assert()
实现。
常用断言方法:
to.be.equal
:深度值比较to.be.instanceof
:类型检查to.be.null
/to.be.undefined
:空值检查to.be.above
/to.be.below
:数值比较
describe("DataRange1d", () => {
it("should have null start and end initially", () => {
const r = new DataRange1d()
expect(r.start).to.be.null
expect(r.end).to.be.null
})
})
视觉回归测试
视觉测试是BokehJS特有的测试类型,用于验证可视化输出的像素级准确性。这些测试位于bokehjs/test/integration/
目录。
视觉测试特点:
- 使用
display()
替代常规的show()
- 使用
fig()
替代常规的figure()
- 包含文本基线(.blf)和图像基线(.png)两种验证方式
import {display, fig} from "./_util"
describe("Line glyph", () => {
it("should display dashed line", async () => {
const p = fig([200, 200], {title: "Dashed line"})
p.line([1, 2, 3], [1, 3, 2], {line_dash: [6, 3]})
await display(p)
})
})
回归测试编写指南
修复Bug时应添加回归测试,防止问题重现。回归测试文件位于:
bokehjs/test/unit/regressions.ts
bokehjs/test/integration/regressions.ts
回归测试规范:
- 在"Bug"描述的
describe()
块中添加测试 - 在测试描述中包含issue编号
- 明确描述修复的问题
describe("in issue #9522", () => {
it("disallows arrow to be positioned correctly in stacked layouts", async () => {
// 测试代码
})
})
视觉测试开发流程
- 编写测试脚本:使用
fig()
和display()
创建最小化测试场景 - 本地验证:通过
node make test:integration
运行测试 - 基线生成:首次运行会生成基线文件
- CI集成:通过CI系统获取多平台基线文件
- 结果审查:使用开发工具服务器检查测试结果
注意事项:
- 保持测试图像尽可能小但可辨识
- 设置合理的像素容差阈值
- 只提交CI生成的基线文件
示例测试管理
Bokeh的示例测试自动包含examples
目录下的文件。如需特殊配置,可编辑tests/examples.yaml
文件来包含或排除特定示例。
通过遵循这些测试编写规范,开发者可以确保Bokeh项目的代码质量和可视化输出的一致性,为这一强大的数据可视化工具贡献高质量的代码。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考