测试¶
本文档介绍的是 FOG 本身的测试
本文档包含有关 FOG 如何自测、如何添加新测试、如何以及记录什么内容等信息。如果您有兴趣了解如何测试您添加的检测,则需要阅读 检测测试文档。
鉴于多种 API 语言、进程和依赖项,测试 FOG 需要根据具体情况选择合适的工具。
一条大命令¶
要运行所有内容,以下是简短版本:
./mach build && ./mach lint -W -w -o --fix && ./mach rusttests && ./mach gtest "FOG*" && python3 ./mach python-test toolkit/components/glean/tests/pytest && ./mach test toolkit/components/glean/tests/xpcshell && ./mach telemetry-tests-client toolkit/components/telemetry/tests/marionette/tests/client/test_fog* --gecko-log "-" && ./mach test toolkit/components/glean/tests/browser --headless
日志记录¶
测试中经常被忽视的第一步是“日志中说了什么?”。要打开 FOG 的日志记录,请使用以下任何一种方法:
使用
RUST_LOG="fog_control,fog,glean_core"
运行 Firefox。在某些平台上,这将使用终端颜色指示日志级别。
使用
MOZ_LOG="timestamp,sync,glean::*:5,fog::*:5,fog_control::*:5,glean_core::*:5"
运行 Firefox。设置以下首选项:
logging.config.timestamp
设置为true
logging.config.sync
设置为true
logging.fog_control::*
设置为5
logging.fog::*
设置为5
logging.glean::*
设置为5
logging.glean_core::*
设置为5
logging.config.clear_on_startup
设置为false
(否则所有这些首选项将在启动时被清除)
有关 Gecko 中日志记录的更多信息,请参阅 Gecko 日志记录文档。
用户目标日志(“您做错了什么”类型的日志)如果源自 JS 端,可能会输出到 浏览器控制台。可以通过 Ctrl+Shift+J 或 Cmd+Shift+J 打开。
注意
目前,非主进程中的 Rust 日志记录不起作用。
记录什么,记录到哪里?¶
FOG 涵盖了很多方面(语言、层):您的位置决定了您可以使用的日志记录。
以下是一些常见的日志记录场景:
JS 到 C++¶
如果您的日志记录针对使用 JS API 的用户(例如,因为提供的类型无法转换为必要的 C++ 类型),请通过 FOG 的 Common 的 LogToBrowserConsole
使用浏览器控制台。
C++¶
如果您在 C++ 中且不是来自 JS,请使用 MOZ_LOG
,模块为 fog
。
Rust¶
使用来自 log
的日志记录宏,例如 log::info!
或 log::error!
。请记住,无论日志级别如何,log::debug!
和 log::trace!
不会出现在非调试版本中
如果您由于使用 API 的开发人员造成且可修复的情况而进行日志记录,请使用 log::error!(...)
。否则,请使用更安静的级别。
about:glean
¶
about:glean
是正在运行的 Firefox 中的一个页面,它允许您 调试 Firefox 桌面版中的 Glean SDK。它通过显示的用户界面来实现这一点(只需按照说明操作即可)。
代码风格检查¶
为了符合 Mozilla 的各种编码风格,我们依赖于 mach lint
。
要以“常规”方式检查代码风格,并在可能的情况下自动修复,请运行:./mach lint -W -w -o --fix
这应该可以防止您签入会被自动回滚的代码。
Rust¶
不幸的是,并非所有 Rust 代码都可以以单一方式进行测试。
使用 rusttests
(Treeherder 符号 Br
(构建任务))¶
如果要测试的板条箱没有 Gecko 符号,您可以编写标准的 Rust 测试。
这支持单元测试(在被测文件内联)和集成测试(在板条箱根目录下的 tests/
文件夹中)。指标类型测试目前作为单元测试内联在文件中编写,因为它们需要访问指标 ID,而指标 ID 应该只在测试中公开。
要运行 FOG 的 rusttests
套件,请使用 mach rusttests
如果板条箱仅使用少量 Gecko 符号,它们可以使用 with_gecko
特性有条件地使用它们。这允许板条箱使用 Rust 测试测试其与 Gecko 无关的代码。(您需要通过其他方式覆盖与 Gecko 相关的代码。)
注意:一些 FOG rusttests 会有意 panic。它们会将堆栈跟踪打印到标准输出。如果 rusttests 失败并且您看到堆栈跟踪,请仔细检查它是否来自有意 panic 的测试。
注意:如果测试失败,它们很可能会污染测试锁。这会导致所有随后尝试获取测试锁的测试(所有测试)也由于 PoisonError
而失败。可以安全地忽略它们。
使用 gtest
(Treeherder 符号 GTest
(构建任务))¶
因为 rusttests
构建没有构建 Gecko 符号,所以任何为使用 Gecko 符号的代码编写的测试都应该作为 gtest
编写在 toolkit/components/glean/tests/gtest/
中。您可以用 Rust 编写实际的测试代码。它需要伴随一个 C++ GTest,该 GTest 调用 C FFI 导出的 Rust 函数。有关更多信息,请参阅 测试 & 调试 Rust 代码。有关示例,请参阅 toolkit/components/glean/tests/gtest/TestFog.cpp
和 toolkit/components/glean/tests/gtest/test.rs
。
由于必要性,这些只能是针对已编译板条箱的集成测试。
注意:添加新的测试文件时,不要忘记将其添加到 toolkit/components/glean/tests/gtest/moz.build
中,并在测试名称中使用 FOG
前缀(例如 TEST(FOG, YourTestName) { ... }
)。
要运行 FOG 的 Rust gtest
套件,请使用 mach gtest FOG.*
Python(Treeherder 符号 py3(fp)
又名 source-test-python-fog
)¶
Glean 解析器 已增强以生成 FOG 特定的 Glean 指标 API。此增强功能通过运行以下命令进行测试:
mach test toolkit/components/glean/tests/pytest
这些测试需要 Python 3+。如果您的默认 Python 是 Python 2,您可能需要改为运行:
python3 mach python-test toolkit/components/glean/tests/pytest
这些测试将代码生成器的输出与已知的良好文件内容进行比较。如果您更改了代码生成器,则需要更新这些文件。使用 UPDATE_EXPECT
环境变量设置为自动执行此操作,运行测试套件。
UPDATE_EXPECT=1 mach test toolkit/components/glean/tests/pytest
C++ (Treeherder 符号 GTest
(构建任务))¶
要测试 FOG 实现的 C++ 部分(例如指标类型),您应该使用 gtest
。FOG 的 gtest
测试位于 gtest/
。
您可以将测试用例添加到现有文件中,也可以添加新文件。如果添加新文件,请记住将其添加到 moz.build
,否则测试运行程序将无法找到它。
所有测试都应以 FOG
开头,以便所有测试都使用 ./mach gtest FOG*
运行。
JS (Treeherder 符号 X(Xn)
,其中 n
为某个数字)¶
要测试 FOG 实现的 JS 部分(例如指标类型),您应该使用 xpcshell
。FOG 的 xpcshell
测试位于 xpcshell/
。
您可以将测试用例添加到现有文件中,也可以添加新文件。如果添加新文件,请记住将其添加到 xpcshell.ini
,否则测试运行程序将无法找到它。
要运行 FOG 的 JS 测试,请运行: ./mach test toolkit/components/glean/tests/xpcshell
非内容进程多进程(浏览器 Chrome Mochitests,Treeherder 符号 M(bcN)
,其中 N
为某个数字)¶
要测试例如 GPU 进程支持,您需要一个完整的 Firefox 浏览器:xpcshell 没有这种灵活性。为了测试这一点并访问特权 JS(即 Glean
和 FOG
API),我们使用浏览器 Chrome 风格的 mochitests,您可以在 browser/
中找到。
如果您需要添加新的测试文件,请记住将其添加到 browser.ini
清单中,否则测试运行程序将无法找到它。
要运行 FOG 的浏览器 Chrome 测试,请运行: ./mach test toolkit/components/glean/tests/browser
集成(Marionette,借用 telemetry-tests-client
Treeherder 符号 tt(c)
)¶
要测试 ping(请参阅 bug 1681742)或任何需要一个或多个完整浏览器运行的内容,我们使用 toolkit/components/telemetry/tests/marionette/tests/client/
中的 telemetry-tests-client
套件。
有关此套件的更多信息,请参阅 Firefox Telemetry 的测试文档 和 Marionette 的文档。
要运行这些集成测试,请运行: ./mach telemetry-tests-client toolkit/components/telemetry/tests/marionette/tests/client/
要捕获被测 Firefox 的日志,请使用 --gecko-log
参数。例如,要回显到标准输出: ./mach telemetry-tests-client toolkit/components/telemetry/tests/marionette/tests/client/test_fog* --gecko-log "-"
注意:以这种方式运行 tt(c)
套件会忽略清单中的跳过指令。这意味着您可能会运行在您的平台上预期不会成功的测试。有关详细信息,请查看 toolkit/components/telemetry/tests/marionette/tests/client/manifest.ini
。