测试
编辑测试
编辑Beats 有各种各样的测试集。本指南旨在帮助您了解不同的测试套件如何工作、如何使用以及如何添加新的测试。
一般来说,主要有两个测试套件:
- 用 Go 编写的测试
- 用 Python 编写的测试
用 Go 编写的测试使用 Go 测试包。用 Python 编写的测试依赖于 pytest,并且需要 Go 代码编译的可执行二进制文件。Python 测试使用特定的配置和参数运行 beat,并检查输出是否符合预期,或者是否在日志中显示了正确的内容。
对于上述两个测试套件,都存在所谓的集成测试。Beats 中的集成测试是需要外部系统(如 Elasticsearch)的测试,以测试与此服务的集成是否按预期工作。Beats 在其测试套件中提供了 docker 容器和 docker-compose 文件来启动这些环境,但开发人员也可以在本地运行所需的服务。
运行 Go 测试
编辑可以通过运行 go test .
在每个 Go 包中执行 Go 测试。这将执行所有不需要外部服务运行的测试。要为 beat 运行所有非集成测试,请运行 mage unitTest
。
所有 Go 测试都与被测试的代码本身在同一个包中,并且文件名中带有后缀 _test
。大多数测试与其余代码在同一个包中。一些应该与其余代码分开或不应使用私有变量的测试放在 {packagename}_test
下。
运行 Go 集成测试
编辑集成测试使用 //go:build integration
构建标签进行标记,并使用 _integration_test.go
后缀。
要运行集成测试,请使用 mage goIntegTest
目标,它将使用 docker-compose 启动所需的服务,并运行所有集成测试。
也可以运行模块特定的集成测试。例如,要仅运行 kafka 测试,请使用 MODULE=kafka mage integTest -v
可以手动启动 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 测试支持生成用作 fixture 的示例事件。
可以通过运行 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
文件,并在目录 build/coverage
中创建一个 full.html
作为所有报告的摘要。
竞争检测
编辑可以通过设置环境变量 RACE_DETECTOR=1
来启用 Go 竞争检测器来运行所有测试。这适用于 Go 和 Python 中的测试。对于 Python,当标志更改时必须重新编译测试二进制文件。启用竞争检测将减慢测试速度。