本文档概述了 Tesseract OCR 的测试框架,包括单元测试和集成测试的结构、如何运行测试以及测试开发的最佳实践。有关训练 Tesseract 模型的信息,请参阅 训练。
Tesseract 使用 Google Test (gtest) 作为其测试框架,为 C++ 代码提供了丰富的测试实用程序。测试基础设施包括:
来源: unittest/include_gunit.h .gitmodules CONTRIBUTING.md
Tesseract 的测试代码组织如下:
主要组件包括:
unittest/:包含各个组件的 C++ 单元测试文件test/:包含集成测试文件和测试图像tessdata/:包含用于测试的训练语言数据langdata_lstm/:包含用于测试 LSTM 模型的特定语言数据来源: unittest/README.md CONTRIBUTING.md
Tesseract 的单元测试使用 Google Test,并组织成测试夹具和测试用例。
测试夹具为一组相关的测试提供了一个通用的设置和拆卸环境。例如:
来源: unittest/lstm_test.h unittest/stringrenderer_test.cc unittest/resultiterator_test.cc
单元测试涵盖了广泛的功能:
| 测试类型 | 目的 | 示例测试文件 |
|---|---|---|
| LSTM 识别 | 测试基于神经网络的 OCR | lstm_test.h, recodebeam_test.cc |
| 字符串渲染 | 测试文本渲染 | stringrenderer_test.cc |
| 布局分析 | 测试页面布局检测 | layout_test.cc |
| 字典 | 测试字典功能 | dawg_test.cc |
| Unicode 处理 | 测试 Unicode 规范化 | normstrngs_test.cc |
| 图像处理 | 测试图像处理 | imagedata_test.cc |
| 结果迭代 | 测试结果访问 | resultiterator_test.cc |
| 矩阵运算 | 测试数学运算 | matrix_test.cc |
来源: unittest/lstm_test.h unittest/stringrenderer_test.cc unittest/layout_test.cc unittest/dawg_test.cc unittest/normstrngs_test.cc unittest/imagedata_test.cc unittest/resultiterator_test.cc unittest/matrix_test.cc
在运行测试之前,您需要设置环境
必需字体
测试数据目录
来源: unittest/README.md INSTALL.GIT.md
要运行测试,请按照以下步骤操作:
autoreconf -fiv
git submodule update --init
git clone https://github.com/egorpugin/tessdata tessdata_unittest --depth 1
cp tessdata_unittest/fonts/* test/testing/
mv tessdata_unittest/* ../
export TESSDATA_PREFIX=/prefix/to/path/to/tessdata
make check
make check 命令将编译并运行所有测试。
来源: unittest/README.md CONTRIBUTING.md INSTALL.GIT.md
下图展示了 Tesseract 测试架构中的关键组件以及它们与主代码库的交互方式。
来源: unittest/include_gunit.h unittest/resultiterator_test.cc unittest/lstm_test.h
Tesseract 测试使用几个重要的测试夹具来方便地测试不同组件。
| 测试夹具 | 目的 | 关键方法 |
|---|---|---|
| LSTMTrainerTest | 测试 LSTM 训练 | SetupTrainer(), TrainIterations(), TestIntMode() |
| StringRendererTest | 测试文本渲染 | SetUp(), DisplayClusterBoxes(), GenerateRandomPaddedOutputs() |
| ResultIteratorTest | 测试结果提取 | SetImage(), VerifyRebuild(), VerifyIteratorText() |
| RecodeBeamTest | 测试束搜索解码 | LoadUnicharset(), ExpectCorrect(), TestIntMode() |
| MasterTrainerTest | 测试分类器训练 | LoadMasterTrainer(), VerifyIl1(), ErrorCounterTest() |
| ShapeTableTest | 测试形状聚类 | SetUp(), BasicTest() |
| PangoFontInfoTest | 测试字体处理 | SetUp(), CanRenderString() |
| NormstrngsTest | 测试字符串规范化 | DetectsCorrectText(), DetectsIncorrectText() |
来源: unittest/lstm_test.h unittest/stringrenderer_test.cc unittest/resultiterator_test.cc unittest/recodebeam_test.cc unittest/mastertrainer_test.cc unittest/shapetable_test.cc unittest/pango_font_info_test.cc unittest/normstrngs_test.cc
测试 Tesseract 需要各种类型的测试数据
来源: unittest/README.md unittest/dawg_test.cc unittest/lang_model_test.cc
Tesseract 的测试套件包含各种模拟对象和测试工具
| 实用工具 | 目的 | 使用示例 |
|---|---|---|
| MockClassifier | ShapeClassifier 的模拟实现 | 在 MasterTrainerTest 中使用 |
| StringRenderer | 渲染文本用于测试 | 在 StringRendererTest 中使用 |
| FileUtilities | 管理测试文件和目录 | 在大多数测试中使用 |
| ExpectCorrect | 验证测试结果 | 在 RecodeBeamTest 中使用 |
| SetupTrainer | 配置 LSTM 训练器进行测试 | 在 LSTMTrainerTest 中使用 |
来源: unittest/mastertrainer_test.cc unittest/stringrenderer_test.cc unittest/include_gunit.h unittest/recodebeam_test.cc unittest/lstm_test.h
当为 Tesseract 贡献新测试时,请遵循以下最佳实践
示例测试用例结构
来源: unittest/lstm_test.h unittest/stringrenderer_test.cc unittest/include_gunit.h unittest/recodebeam_test.cc unittest/lstm_test.h
Tesseract 使用 GitHub Actions 进行持续集成,该操作会在拉取请求和提交时自动运行测试
在合并拉取请求之前,测试必须通过。CI/CD 流水线会使用不同的构建系统(autotools、CMake)构建 Tesseract 并运行测试套件。
来源: CONTRIBUTING.md INSTALL.GIT.md
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 缺少字体 | 测试需要特定的字体 | 根据 README.md 中的列表安装所需的字体 |
| 缺少测试数据 | 未下载测试数据 | 克隆测试数据仓库 |
| 字符集测试失败 | 区域设置问题 | 正确设置区域设置 (std::locale::global) |
| 内存泄漏 | 资源未清理 | 使用 RAII 或确保在 tearDown() 中正确清理 |
| 测试速度慢 | 测试进行了过多的 I/O 操作 | 模拟文件系统或使用内存缓冲区 |
| 测试不稳定 | 非确定性行为 | 添加重试或修复竞态条件 |
来源: unittest/README.md unittest/pango_font_info_test.cc unittest/include_gunit.h
Tesseract 的测试框架通过单元测试和集成测试提供了对其功能的全面覆盖。通过遵循本文档中的指南,您可以运行现有测试、调试测试失败,并贡献维护代码库质量和可靠性的新测试。
有关为 Tesseract 做出贡献的更多信息,请参阅存储库中的 CONTRIBUTING.md 文件。