创建独立的函数测试库

https://blueprints.launchpad.net/tempest/+spec/tempest-library

随着最近对为各个 OpenStack 项目创建大量函数测试的需求,需要一个通用的工具包来构建函数测试。利用 Tempest 的核心功能,启动一个新的函数测试库,以便在启动新的项目特定测试套件中重用此代码。

问题描述

多年来,Tempest 一直是 OpenStack 的集成测试套件。然而,最近随着 Tempest 的范围和复杂性的不断增长,我们发现需要针对特定项目的函数测试。由于为测试启动 devstack 从属服务器非常容易,因此可以轻松地将其添加到 ci 基础设施中。但是,编写函数测试套件并不那么简单,并且需要在项目之间进行大量的重复工作。

提议的变更

将我们目前在 tempest 中拥有的通用测试基础设施提取到一个单独的库中。该库将位于一个单独的存储库中,发布在 pypi 上,拥有一个单独的 bug 跟踪器,并强制执行稳定的 api 以供使用(这将通过单元测试来强制执行)。我们的意图是让这个库可用于构建一个使用与 Tempest 相同的构建块的函数测试套件。

当功能从 Tempest 移动到库中时,可能需要对其进行略微重构以使其可移植。例如,RestClient 和服务客户端需要重构,使其不依赖于 tempest 配置文件。这些更改应在将功能添加到库的同时发生。

一旦将一组功能移植到库中,就可以将其从 tempest 树中删除,并使用该库代替。我们应该在功能进入库后立即执行此操作。这将确保我们不会维护 2 套相同的代码。它还将通过实际在 tempest 内部使用库接口来帮助确保代码的功能。例如,考虑使用 python-novaclient CLI 测试的流程

  1. 将具有核心功能的 CLI 基本测试类添加到新的库

  2. 切换 tempest CLI 测试以使用该库

  3. 删除已切换到库的 tempest 中的代码

  4. 将函数测试套件添加到 novaclient 存储库,并从 tempest 复制适当的 CLI 测试

  5. 从 tempest 中删除复制的 novaclient CLI 测试

此示例的前 3 个步骤将应用于任何移动到库的内容。步骤 4 和 5 仅适用于我们决定某一类测试不再属于 tempest 的情况。

此示例的第一个工作示例应该是 CLI 测试,因为它们在没有非 Tempest devstack 作业的情况下添加到 Tempest 之前只是一个简单的问题。从本质上讲,它们应该是项目特定的函数测试,因此将 CLI 框架添加到库应该可以很容易地将这些测试移出 Tempest。

另一个需要考虑的方面是,该库将由项目的函数测试使用,而不是强制执行功能。所有部分都应该是可选的,以便项目可以使用它们需要的内容。例如,虽然 tempest 客户端将在库中可用,但没有要求使用它。此外,在就删除 tempest 中的某一类测试做出决定之前,我们不应该从 tempest 中删除测试。

替代方案

另一种选择是修改 Tempest 内部的代码以执行相同的基本功能。这个问题是 tempest 会因拥有太多作业而过载。此外,新的库可能包含在 Tempest 中没有位置的功能和代码,但属于项目特定的函数测试。此外,将其拆分为单独的库将使发布和发布变得更加简单,因为我们不一定希望将所有 tempest 作为测试要求发布给项目。

实现

负责人

主要负责人

Matthew Treinish <mtreinish@kortar.org>

其他贡献者

Ken’ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>

里程碑

完成目标里程碑

Kilo 发布

工作项

  • 启动库的新存储库

    • 为项目创建 launchpad 页面

    • 为项目创建 PyPI 条目

  • 复制基本测试类和其他核心功能以运行测试

  • 复制并删除 CLI 测试框架中的配置和 tempest 特定的代码

  • 添加 devstack 支持,以从 git 安装库

  • 设置基础设施作业,使其与所有使用它的项目一起协同 gating

  • 迁移其他与测试相关的通用功能和实用程序,例如

    • 异常

    • 通用装饰器

    • 匹配器

    • SSH 验证代码

  • 复制并转换 Tempest REST 客户端

    • 清理 REST 客户端代码

    • 将基本 REST 客户端代码与 Tempest 特定代码分离

    • 将 REST 客户端特定的异常移动到基本 REST 客户端代码

    • 将基本 REST 客户端代码复制到 tempest-lib 存储库

    • 切换 Tempest 以使用 tempest-lib 的基本 REST 客户端代码

  • Tempest 服务客户端中的清理

    • 在所有服务客户端上使用 ResponseBody/List 以实现一致的接口

    • 从服务客户端中删除 CONF 值

      当前的 service 客户端包含 tempest.conf 中的 CONF 值,但它们应该独立于 tempest.conf 作为库函数。

  • 添加文档和示例,说明如何使用库的接口

依赖项

这不应依赖于任何其他工作,但是,它可能会与其他正在进行的 BP 发生冲突,因此在移植内容时应小心,以确保所有正在进行的工作不会在库转换的余波中丢失。

参考资料