测试编辑

Beats 有各种测试集。本指南将帮助您了解不同的测试套件是如何工作的,它们是如何被使用以及如何添加新的测试。

一般来说,有两个主要的测试套件

  • 用 Go 编写的测试
  • 用 Python 编写的测试

用 Go 编写的测试使用 Go 测试包。用 Python 编写的测试依赖于 pytest,并需要来自 Go 代码的已编译可执行二进制文件。Python 测试运行一个带有特定配置和参数的 Beat,并检查输出是否符合预期,或者是否在日志中显示了正确的内容。

对于以上两个测试套件,都存在所谓的集成测试。Beats 中的集成测试是需要外部系统(如 Elasticsearch)才能测试与该服务的集成是否按预期工作。Beats 在其测试套件中提供了 Docker 容器和 docker-compose 文件来启动这些环境,但开发人员也可以在本地运行所需的服务器。

运行 Go 测试编辑

Go 测试可以通过在每个 Go 包中运行 go test . 来执行。这将执行所有不需要外部服务运行的测试。要运行一个 Beat 的所有非集成测试,请运行 mage unitTest

所有 Go 测试都与被测试代码位于同一个包中,并且文件名后缀为 _test。大多数测试与其他代码位于同一个包中。一些应该与其他代码分离或不应该使用私有变量的测试会放在 {packagename}_test 下。

运行 Go 集成测试编辑

集成测试用 //go:build integration 构建标签标记,并使用 _integration_test.go 后缀。

要运行集成测试,请使用 mage goIntegTest 目标,它将使用 docker-compose 启动所需的服务器,并运行所有集成测试。

可以手动启动 docker-compose 服务器,以允许选择要运行的特定测试。以下以 Filebeat 为例:

cd filebeat
# Pull and build the containers. Only needs to be done once unless you change the containers.
mage docker:composeBuild
# Bring up all containers, wait until they are healthy, and put them in the background.
mage docker:composeUp
# Run all integration tests.
go test ./filebeat/...  -tags integration
# Stop all started containers.
mage docker:composeDown

生成示例事件编辑

Go 测试支持生成示例事件,用作测试夹具。

可以通过运行 go test --data 来生成这些事件。Packetbeat 和 Metricbeat 支持此功能。

在 Metricbeat 中,从模块内部运行命令,如下所示:go test --tags integration,azure --data --run "TestData"。确保添加相关的标签(integration 是通用的,然后添加模块和指标集特定的标签)。

关于标签的说明:--data 标志是 Metricbeat 和 Packetbeat 框架添加的自定义标志。如果标签不匹配,则该标志将不存在,因为相关的代码将不会运行并被静默跳过(如果没有标签,Go 编译器会忽略测试文件,因此框架不会加载)。如果被测试的指标集的构建标签中存在不同的标签,则可能会发生这种情况(例如,GCP 账单指标集还需要 billing 标签)。

运行系统(集成)测试(Python 和 Go)编辑

系统测试定义在 tests/system(对于旧的 Python 测试)和 tests/integration(对于 Go 测试)目录中。它们需要一个可用的测试二进制文件以及设置好的 Python 环境。

要创建测试二进制文件,请运行 mage buildSystemTestBinary。这将在 Beat 目录中创建测试二进制文件。要设置 Python 测试环境,请运行 mage pythonVirtualEnv,这将创建一个包含所有测试依赖项的虚拟环境并打印其位置。要激活它,说明取决于您的操作系统。请参阅 virtualenv 文档

要运行系统和集成测试,请使用 mage pythonIntegTest 目标,它将使用 docker-compose 启动所需的服务器,并运行所有集成测试。与 Go 集成测试类似,可以手动执行各个步骤,以允许选择要运行的测试。

# Create and activate the system test virtual environment (assumes a Unix system).
source $(mage pythonVirtualEnv)/bin/activate

# Pull and build the containers. Only needs to be done once unless you change the containers.
mage docker:composeBuild

# Bring up all containers, wait until they are healthy, and put them in the background.
mage docker:composeUp

# Run all system and integration tests.
INTEGRATION_TESTS=1 pytest ./tests/system

# Stop all started containers.
mage docker:composeDown

Filebeat 的模块 Python 测试在 Filebeat 模块 指南中提供额外的文档。

测试命令编辑

要列出所有 mage 命令,请运行 mage -l。以下是对可用测试 Make 命令的简要总结:

  • unit:Go 测试
  • unit-tests:带覆盖率报告的 Go 测试
  • integration-tests:带本地 Docker 中的服务器的 Go 测试
  • integration-tests-environment:带 Docker 中服务器的 Docker 中的 Go 测试
  • fast-system-tests:Python 测试
  • system-tests:带覆盖率报告的 Python 测试
  • INTEGRATION_TESTS=1 system-tests:带本地服务器的 Python 测试
  • system-tests-environment:带 Docker 中服务器的 Docker 中的 Python 测试
  • testsuite:运行 Docker 环境中的完整测试套件
  • test:运行没有环境的测试套件

有两个实验性测试命令:

  • benchmark-tests:使用 -bench 标志运行 Go 测试
  • load-tests:使用 LOAD_TESTS=1 标志运行系统测试

覆盖率报告编辑

如果测试运行是为了创建测试覆盖率,则覆盖率报告文件可以在 build/docs 下找到。要从 .cov 文件创建更易于阅读的文件,可以使用 make coverage-report。它会为每个报告创建一个 .html 文件,并创建一个名为 full.html 的文件,作为所有报告在 build/coverage 目录中的汇总。

竞争检测编辑

可以通过设置环境变量 RACE_DETECTOR=1 来启用 Go 竞争检测器运行所有测试。这适用于 Go 和 Python 中的测试。对于 Python,更改标志时需要重新编译测试二进制文件。启用竞争检测会减慢测试速度。