加载中

测试

Beats 包含多套测试。本指南旨在帮助您了解不同的测试套件如何工作、如何使用它们以及如何添加新测试。

通常有两大测试套件

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

用 Go 编写的测试使用 Go Testing 包。用 Python 编写的测试依赖于 pytest,并且需要从 Go 代码编译的可执行二进制文件。Python 测试会使用特定的配置和参数运行 beat,并检查输出是否符合预期,或者日志中是否出现了正确的内容。

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

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

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

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

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

也可以运行特定模块的集成测试。例如,要仅运行 kafka 测试,请使用 MODULE=kafka mage integTest -v

可以手动启动 docker compose 服务,以便选择要运行的特定测试。Elasticsearch 和 Kibana 的默认凭据为 user: adminpassword: testing。下面是 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

# Build the test binary
mage buildSystemTestBinary

# Run all integration tests.
go test ./filebeat/...  -tags integration

# Stop all started containers.
mage docker:composeDown
		

Go 测试支持生成可用作固定数据(fixtures)的示例事件。

可以通过运行 go test --data 来执行此生成。packetbeat 和 Metricbeat 支持此功能。

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

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

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

注意

Winlogbeat 不使用 Python 系统测试。它的系统测试是位于 winlogbeat/tests/testscript/ 中的纯 Go 测试,需要在 Windows 上运行。

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

要运行系统和集成测试,请使用 mage pythonIntegTest 目标,它将使用 docker compose 启动所需的服务并运行所有集成测试。Elasticsearch 和 Kibana 的默认凭据为 user: adminpassword: testing。与 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

# Build the test binary
mage buildSystemTestBinary

# Run all system and integration tests.
INTEGRATION_TESTS=1 \
BEAT_STRICT_PERMS=false \
ES_USER="admin" \
ES_PASS="testing" \
pytest ./tests/system

# Stop all started containers.
mage docker:composeDown
		

要运行 x-pack/ 中的模块测试,需要将 MODULES_PATH 设置为 x-pack 模块目录的完整路径

cd x-pack/filebeat

INTEGRATION_TESTS=1 \
BEAT_STRICT_PERMS=false \
ES_USER="admin" \
ES_PASS="testing" \
MODULES_PATH="/path/to/beats-repo/x-pack/filebeat/module" \
pytest ./tests/system/test_xpack_modules.py
		

Filebeat 的模块 Python 测试有额外的文档,可在 Filebeat 模块指南中找到。

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

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

有两个实验性测试命令

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

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

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

压力测试对于复现 CI 中的不稳定运行(flaky runs)或检查测试中的不稳定性非常有用。

./script/stresstest.sh --help
./script/stresstest.sh ./libbeat/common/backoff ^TestBackoff$ -p 32
		
© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.