菜单

测试

相关源文件

本文档概述了 Tesseract OCR 的测试框架,包括单元测试和集成测试的结构、如何运行测试以及测试开发的最佳实践。有关训练 Tesseract 模型的信息,请参阅 训练

测试基础设施概览

Tesseract 使用 Google Test (gtest) 作为其测试框架,为 C++ 代码提供了丰富的测试实用程序。测试基础设施包括:

  1. 单元测试:独立测试单个组件
  2. 集成测试:测试组件之间的交互
  3. 测试数据:测试所需的样本图像、语言数据和其他资源

来源: unittest/include_gunit.h .gitmodules CONTRIBUTING.md

测试目录结构

Tesseract 的测试代码组织如下:

主要组件包括:

  1. unittest/:包含各个组件的 C++ 单元测试文件
  2. test/:包含集成测试文件和测试图像
  3. tessdata/:包含用于测试的训练语言数据
  4. langdata_lstm/:包含用于测试 LSTM 模型的特定语言数据

来源: unittest/README.md CONTRIBUTING.md

单元测试框架

Tesseract 的单元测试使用 Google Test,并组织成测试夹具和测试用例。

测试夹具

测试夹具为一组相关的测试提供了一个通用的设置和拆卸环境。例如:

来源: unittest/lstm_test.h unittest/stringrenderer_test.cc unittest/resultiterator_test.cc

测试类型

单元测试涵盖了广泛的功能:

测试类型目的示例测试文件
LSTM 识别测试基于神经网络的 OCRlstm_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

运行测试

先决条件

在运行测试之前,您需要设置环境

  1. 必需字体

    • Microsoft 字体:arialbi.ttf, times.ttf, verdana.ttf
    • ae_Arab.ttf
    • DejaVuSans-ExtraLight.ttf
    • Lohit-Hindi.ttf
    • UnBatang.ttf
  2. 测试数据目录

    • langdata_lstm
    • tessdata
    • tessdata_best
    • tessdata_fast

来源: 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 的测试套件包含各种模拟对象和测试工具

实用工具目的使用示例
MockClassifierShapeClassifier 的模拟实现在 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 贡献新测试时,请遵循以下最佳实践

  1. 使用测试夹具进行通用的设置和拆卸
  2. 每个测试用例只测试一件事
  3. 使用有意义的测试名称来描述正在测试的内容
  4. 使用适当的断言(EXPECT_* vs. ASSERT_*)
  5. 在拆卸时清理资源
  6. 在隔离测试时模拟依赖项
  7. 测试边缘情况和错误条件
  8. 保持测试速度快,尽量减少文件 I/O 和计算

示例测试用例结构

来源: 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 文件。