oss常用工具汇总(一文搞懂开放源码软件)(1)

译者 | 陈峻

审校 | 孙淑娟

如果说质量保证(QA)是确定产品或服务是否满足特定要求的系统过程,那么质量保证系统则是研发过程中不可或缺的一部分,它起到了确保产品质量的作用。

在本文中,我将向您介绍在开发Milvus矢量数据库(Vector Database)时所采用的QA框架,并涵盖Milvus中的主要测试模块、以及可用于提高QA测试效率的方法和工具。

一、Milvus QA系统概述

鉴于系统架构对于QA测试的重要性,QA工程师只有对系统越熟悉,才越有可能制定出合理、有效的测试计划。

oss常用工具汇总(一文搞懂开放源码软件)(2)

Milvus架构

Milvus 2.0采用的是云原生、分布式的分层架构。其中,SDK是数据在Milvus中流动的主要入口。通过对被频繁使用的SDK开展功能性测试,我们将能够检测出Milvus系统内部的问题。除了功能测试之外,我们还应该对矢量数据库进行单元测试、部署测试、可靠性测试、稳定性测试、以及性能测试。

云原生和分布式架构为QA测试带来了便利和挑战。与本地部署运行的系统不同,在Kubernetes集群上部署和运行的Milvus实例,可以确保在与软件开发相同的环境下,进行软件测试。然而,其缺点在于分布式架构的复杂性,会带来更多的不确定性,这会导致系统QA测试的繁琐。例如,Milvus 2.0使用不同组件的微服务,会导致服务和节点数量的增加,系统出错几率的增大。因此,我们需要更加全面的QA计划,来提高测试的效率。

二、QA测试和问题管理

Milvus的QA需要对软件开发过程中出现的问题予以测试和管理。

1.QA测试

如下图所示,我们应当根据Milvus的特性和用户需求,按照优先级的顺序,开展不同类型的QA测试。

oss常用工具汇总(一文搞懂开放源码软件)(3)

QA测试和优先级

在Milvus中,QA测试主要针对如下几个方面进行:

2.问题管理

软件在开发过程中可能会出现许多问题。这些问题可能源于QA工程师本人,也可能来自开源社区的Milvus用户。不过,QA团队应负责找出这些问题。

oss常用工具汇总(一文搞懂开放源码软件)(4)

Milvus中问题管理的工作流程

在创建问题时,他们首先需要进行分类。在分流的过程中,被检查出的新问题应确保带有足够多的问题详细信息,以便开发人员的确认、接受、以及尝试修复。而在修复完成之后,问题属主则需要验证其修复,判断是否可以最终关闭该问题。

三、什么时候需要QA?

一种常见的误解是:QA和开发是相互独立的。而事实是为了确保系统的质量,开发人员和QA工程师都需要通力协作,将QA贯穿整个生命周期。

oss常用工具汇总(一文搞懂开放源码软件)(5)

将QA引入整个软件研发的生命周期如上图所示,一个完整的软件研发生命周期包括三个阶段:

四、Milvus中的测试模块

下面,让我们来详细说明Milvus中的六个测试模块:

1.单元测试

oss常用工具汇总(一文搞懂开放源码软件)(6)

单元测试

单元测试可以协助尽早地识别软件错误,并为代码的重组提供验证标准。根据Milvus的拉式请求(pull request,PR)验收标准,代码单元测试的覆盖率应达到80%。

2.功能测试

在Milvus中,功能测试的主要目的是为了验证接口是否可以按照设计进行运行。通过围绕着PyMilvus和SDK开展,功能测试会涉及到如下两个方面:

下图描绘了目前基于主流pytest的功能测试框架。该框架为PyMilvus添加了一个包装器(wrapper),并通过自动化测试接口进行测试。

oss常用工具汇总(一文搞懂开放源码软件)(7)

Milvus中的功能测试框架

考虑到测试方式在共享时,部分功能需要复用,因此我们可以采用上述测试框架,而无需直接使用PyMilvus接口。此外,该框架还包含了一个“校验(check)”模块,为期望值和实际值的校验带来便利。

其tests/python_client/testcases目录中包含了多达2700个功能测试用例,并完全覆盖了几乎所有的PyMilvus接口。而且功能测试能够严格地监督每一个PR的质量。

3.部署测试

由于Milvus有standalone和cluster两种模式,因此我们可以使用Docker Compose或Helm两种重要的方法,对其进行部署。同时,在部署了Milvus之后,用户可以采取重启或升级测试两种类别。其中,重启测试是指测试数据持久性的过程,即重启后的数据是否仍然可用。升级测试则是指测试数据地兼容性,以防止在Milvus中插入不兼容的数据格式的过程。如下图所示,两种类型的部署测试可以共享相同的工作流程:

oss常用工具汇总(一文搞懂开放源码软件)(8)

部署测试工作流程

在重启测试中,两个部署会使用相同的Docker镜像。但是,在升级测试中,首个部署会使用前一个版本的Docker镜像,而第二个部署使用的是更高版本的Docker镜像。测试的结果和数据会被保存在Volumes文件或持久卷声明中。

首个测试在运行时会创建多个集合,并且会对每个集合进行不同的操作。而在第二个测试运行时,它会重点验证已创建的集合是否仍可用于CRUD操作,以及是否可以进一步创建新的集合。

4.可靠性测试

云原生分布式系统的可靠性测试,通常采用的是混沌工程(Chaos Engineering)方法,其目的是要将错误和系统故障扼杀在萌芽状态。换句话说,在混沌工程测试中,我们有目的地创建系统故障,以识别压力测试中的问题,并在系统故障真正开始造成危害之前予以修复。在Milvus的混沌测试中,我们可以选择Chaos Mesh作为创建混沌的工具,来创建如下故障类型:

oss常用工具汇总(一文搞懂开放源码软件)(9)

Milvus 中的可靠性测试框架

上图展示了Milvus中可进行自动化混沌测试的可靠性测试框架。其流程为:

复制checkers = { Op.create: CreateChecker(), Op.insert: InsertFlushChecker(), Op.flush: InsertFlushChecker(flush=True), Op.index: IndexChecker(), Op.search: SearchChecker(), Op.Query: QueryChecker() }1.2.3.4.5.6.7.8.

5.稳定性和性能测试

下表描述了稳定性和性能测试的目的、测试场景和指标。

oss常用工具汇总(一文搞懂开放源码软件)(10)

稳定性测试和性能测试会共享同一组工作流程:

oss常用工具汇总(一文搞懂开放源码软件)(11)

稳定性测试和性能测试的工作流程

五、提高QA效率的工具和方法

从模块测试部分可以看出,大部分测试的流程其实都差不多,主要是修改Milvus服务端和客户端的配置,传递API参数。当有多种配置时,不同配置的组合越是多样化,实验和测试可以覆盖的场景也就越广。因此,代码和程序的重用,对于提高测试效率显得非常关键。

1.SDK测试框架

oss常用工具汇总(一文搞懂开放源码软件)(12)

SDK测试框架

为了加快测试进程,我们可以在原始测试框架中添加一个API_request包装器,并将其按照API网关进行设置。此类API网关将负责收集所有API请求,然后将它们传递给Milvus,以便集体接收响应,并传递回客户端。这样的设计能够使得捕获诸如参数和返回结果等日志信息,变得更加容易。此外,SDK测试框架中的checker组件也可以验证和检查Milvus的结果。所有的检查方法都可以在该checker组件中被定义。

使用SDK测试框架,我们也可以将一些关键性的初始化过程,封装到一个函数中,以削减大量繁琐的代码。还值得注意的是,每个单独的测试用例都与其独特的集合相关,从而确保了数据的相互隔离。例如,在执行测试用例时,pytest-xdist可以利用pytest的扩展,并行执行所有单独的测试用例,从而大幅提高效率。

2.GitHub Action

oss常用工具汇总(一文搞懂开放源码软件)(13)

GitHub Action

GitHub Action会因为其以下特点,被用于提高QA效率:

除了上述特点,采用GitHub Action的另一个原因在于部署测试和可靠性测试需要独立的隔离环境,而GitHub Action非常适合对小规模数据集进行日常检查。

3.基准测试

工具为了使QA测试更加有效,我们可以使用多种工具。

oss常用工具汇总(一文搞懂开放源码软件)(14)

基准测试工具概览

原文链接:https://dzone.com/articles/open-source-software-oss-quality-assurance-a-milvu

,