测试

本文档介绍的是 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+JCmd+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.cpptoolkit/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(即 GleanFOG 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