测试
Beats 有各种测试集。 本指南应有助于了解不同测试套件的工作方式、使用方式以及如何添加新测试。
一般来说,主要有两个测试套件
- 用 Go 编写的测试
- 用 Python 编写的测试
用 Go 编写的测试使用 Go 测试包。 用 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: admin
,password: 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
是常见的,然后添加模块和指标集特定的标签)。
关于标签的注意事项:--data
标志是由 Metricbeat 和 Packetbeat 框架添加的自定义标志。 如果标签不匹配,则不会显示该标志,因为相关代码将不会运行并且会静默跳过(如果没有标签,则 Go 编译器会忽略该测试文件,因此框架不会加载)。 如果被测试的指标集的构建标签中存在不同的标签,则可能会发生这种情况(例如,GCP 计费指标集也需要 billing
标签)。
系统测试在 tests/system
(对于旧的 Python 测试)和 tests/integration
(对于 Go 测试)目录中定义。 它们需要可用的测试二进制文件,并且需要设置 Python 环境。
要创建测试二进制文件,请运行 mage buildSystemTestBinary
。 这将在 beat 目录中创建测试二进制文件。 要设置 Python 测试环境,请运行 mage pythonVirtualEnv
,这将创建一个包含所有测试依赖项的虚拟环境并打印其位置。 要激活它,说明取决于您的操作系统。 请参阅 virtualenv 文档。
要运行系统和集成测试,请使用 mage pythonIntegTest
目标,该目标将使用 docker-compose 启动所需的服务并运行所有集成测试。 Elasticsearch 和 Kibana 的默认凭据为 user: admin
,password: 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 中带有 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
文件,并在目录 build/coverage
中创建一个 full.html
作为所有报告的摘要。
可以通过设置环境变量 RACE_DETECTOR=1
来启用 Go 竞争检测器运行所有测试。 这适用于 Go 和 Python 中的测试。 对于 Python,更改标志后必须重新编译测试二进制文件。 启用竞争检测会减慢测试速度。
压力测试对于重现 CI 不稳定的运行或检查测试中的不稳定性可能很有用。
./script/stresstest.sh --help
./script/stresstest.sh ./libbeat/common/backoff ^TestBackoff$ -p 32