openSUSE:WebYaST 测试套件
测试约定
本文档收集了针对符合 WebYaST 产品代码的测试约定。
Ruby on Rails 应用程序测试
有关更多详细信息,请参阅 Rails 应用程序测试指南。
简而言之,Ruby on Rails 中的自动测试可以分为三个级别
- 单元测试 - 模型测试 - 核心功能的低级别测试(有关更多详细信息,请参阅 单元测试)
- 功能测试 - 控制器测试 - 测试一个动作
- 集成测试 - 工作流测试 - 测试多个动作的序列
所需软件包
除了标准的 Ruby on Rails 软件包之外,还需要以下软件包进行测试
- rubygem-test-unit - 基本测试框架
- rubygem-mocha - 用于模拟函数调用(以避免在当前系统上执行关键部分并使测试与系统无关)的库
- rubygem-rcov - 用于检查代码覆盖率(有多少代码被测试覆盖/测试)
启动测试
只需在 WebYaST 目录中调用 rake 命令即可启动所有测试。该命令将启动当前目录中属于的所有测试,如果未找到测试,则会在父目录中搜索。
使用 test:units、test:functionals 或 test:integration rake 目标仅启动请求类型的测试(例如,调用 rake test:units 仅运行单元测试)。使用 rake test TEST=foo_test.rb 仅启动一个测试。
WebYaST RPM 软件包不包含测试,它们仅在 GIT 仓库中可用。(测试在集成服务器中持续运行,并且不需要在生产服务器上。)
代码覆盖率
使用 rake test:test:rcov 运行所有具有覆盖率支持的测试。最后,它将生成一个 HTML 覆盖率报告并打印一个链接到它。在 Web 浏览器中打开链接并检查覆盖率。报告的主页包含摘要,您可以单击一个文件以查看未被测试覆盖的行。理想情况下,所有文件都应具有 100% 的覆盖率。
注意:100% 的代码覆盖率并不能保证代码是无错误和完美的! 有关更多详细信息,请参阅 RCov 页面。
编写测试
测试存储在 test/{unit|functional|integration} 子目录中,具体取决于测试类型。测试文件名必须匹配 *_test.rb 模式才能被 rake 自动找到。
以下部分描述了 WebYaST 特定的问题的解决方案。
YaST REST 服务
REST 服务中的代码旨在提供表示来自系统的 RESTful 资源。
可以通过各种方式检索此数据
- D-Bus(有关模拟 D-Bus 调用以进行测试,请参阅 此处)
- PackageKit(有关模拟 PackageKit 调用以进行测试,请参阅 此处)
- 通过 D-Bus 调用 YaST YaPI
- 调用命令行程序(通过 D-Bus SCR 执行服务,以保留策略)
- 其他
约定
不要访问系统
您的测试不能依赖于系统返回的内容。使用 Mocha 库来模拟类和测试代码对不同系统场景的结果。
模型封装
如果您有一个从系统用户检索数据的 UserController,请通过提供类似 ActiveRecord/ActiveResource 的 API(User.find、User.save)来封装数据的检索方式,这将为您带来以下优势
- 控制器看起来像任何 Rails 控制器
- 测试控制器而无需访问系统需要模拟 User 类数据,这比模拟 YaPI 调用更简单。
- 您需要测试您创建的任何抽象层,因此您需要测试 YaPI 调用。
有关示例,请参阅 此处。
YaST Web 客户端
Web 客户端部分在自动测试方面与 Web 服务部分存在类似的问题。
不要连接到 Web 服务
Web 客户端也不应访问系统 - 在这种情况下,意味着它不应使用真实的 Web 服务(REST)服务。有两种可能性
- 模拟 REST 系统调用
- 使用例如 ActiveResource::HttpMock 模拟 REST 响应(
FakeWeb也可以工作,但没有 RPM)。
是模拟 REST 调用的示例。