菜单

单元测试

相关源文件

本文档解释了 Tesseract OCR 中的单元测试系统,涵盖了测试框架、组织结构以及如何运行测试。有关集成测试的信息,请参阅 集成测试

概述

Tesseract 使用 Google Test 框架进行单元测试。测试旨在验证各个组件是否能独立正确运行,从而在开发过程中提供快速反馈。测试套件涵盖了多个方面,包括:

  • 识别引擎(LSTM、传统引擎)
  • 文本处理工具
  • 布局分析
  • 图像数据处理
  • 语言模型
  • 核心数据结构

测试框架和组织

来源:unittest/include_gunit.h1-87 unittest/README.md1-91 CONTRIBUTING.md71-84

通用测试组件

测试系统使用了几个通用组件:

  1. include_gunit.h:一个中心头文件,提供通用的 Google Test 包含和实用函数。
  2. 测试夹具:继承自 ::testing::Test 的类,用于设置测试环境。
  3. 测试资源:测试数据文件,包括图像、训练模型和语言文件。

关键测试类别

识别引擎测试

用于验证 OCR 识别引擎的测试。

  • LSTM 神经网络测试
  • 编码器束搜索测试
  • 语言模型测试

来源:unittest/lstm_test.h1-185 unittest/recodebeam_test.cc1-487 unittest/lstmtrainer_test.cc1-146

数据结构测试

用于验证核心数据结构的测试。

  • StringRenderer,用于生成测试数据。
  • 形状表和字符集。
  • Unicode 字符压缩。
  • DAWG (有向无环词图),用于字典表示。

来源:unittest/stringrenderer_test.cc1-530 unittest/unicharcompress_test.cc1-249 unittest/dawg_test.cc1-111 unittest/shapetable_test.cc1-237

文本处理测试

用于文本规范化、Unicode 处理和连字处理的测试。

  • 不同字符编码的规范化。
  • 脚本特定规则验证。
  • 连字处理(例如,“fi” → “fi”)。

来源:unittest/normstrngs_test.cc1-387 unittest/ligature_table_test.cc1-111

布局分析测试

用于验证页面布局分析和结果迭代的测试。

  • 块查找和排序测试。
  • 阅读顺序测试。
  • 文本行提取测试。
  • 结果迭代器测试。

来源:unittest/layout_test.cc1-310 unittest/resultiterator_test.cc1-603

关键测试组件

StringRenderer

StringRenderer 是一个关键的测试组件,它生成带有已知文本的合成测试图像,用于测试识别准确性。

来源:unittest/stringrenderer_test.cc1-530

MasterTrainer 测试

测试传统(非 LSTM)OCR 引擎的训练系统。

来源:unittest/mastertrainer_test.cc1-288

运行测试

先决条件

运行测试需要:

  1. 测试数据文件。:

    • langdata_lstm 目录中的语言数据文件。
    • tessdatatessdata_besttessdata_fast 目录中的训练模型。
    • 用于渲染测试的字体(见下文)。
  2. 必需字体:

    • Microsoft 字体:arialbi.ttf, times.ttf, verdana.ttf
    • ae_Arab.ttf
    • DejaVuSans-ExtraLight.ttf
    • Lohit-Hindi.ttf
    • UnBatang.ttf
  3. 子模块:

    • Google Test 框架(位于 unittest/third_party/googletest)。
    • 测试存储库(位于 test)。

测试执行流程

来源:unittest/README.md1-91 CONTRIBUTING.md71-84 INSTALL.GIT.md1-66

分步说明

  1. 克隆包含子模块的存储库:

  2. 设置构建环境:

  3. 获取测试数据:

  4. 设置环境变量:

  5. 运行测试:

来源:unittest/README.md79-90 INSTALL.GIT.md20-29

通用测试模式

测试夹具

大多数测试都使用测试夹具来设置测试环境。

预期和断言

测试使用 Google Test 的预期和断言。

编写新测试

编写 Tesseract 新测试时:

  1. 遵循现有模式:遵循现有测试中建立的模式。
  2. 包含必要的头文件:始终包含 include_gunit.h
  3. 创建适当的夹具:重用现有夹具或根据需要创建新夹具。
  4. 清理资源:确保临时资源得到清理。
  5. 同时运行 make check (autotools) 和 ctest (CMake):确保测试在两个构建系统中都能通过。

来源:CONTRIBUTING.md71-84

测试限制和未来工作

一些区域的测试覆盖率有限。

  1. 传统引擎测试:当定义了 DISABLED_LEGACY_ENGINE 时,一些测试会被跳过。
  2. 视觉测试:一些视觉测试默认禁用(例如,ScrollView 测试)。
  3. 平台特定测试:一些测试可能依赖于特定平台。

未来的工作可能包括:

  • 扩大布局分析的测试覆盖范围。
  • 添加更多脚本特定的测试。
  • 提高大型训练测试的测试性能。