Karma 本质上是一个工具,它会启动一个 Web 服务器,该服务器会针对每个连接的浏览器执行源代码和测试代码。每个浏览器针对每个测试的结果都会被检查并通过命令行显示给开发人员,以便他们可以查看哪些浏览器和测试通过或失败。
浏览器可以通过以下两种方式捕获:
http://localhost:9876/
),Karma 还会监视配置文件中指定的所有文件,并且每当任何文件更改时,它都会通过向测试服务器发送信号来触发测试运行,以通知所有捕获的浏览器再次运行测试代码。然后,每个浏览器都会在 IFrame 中加载源文件,执行测试并将结果报告回服务器。
服务器会收集来自所有捕获浏览器的结果并将其呈现给开发人员。
这只是一个非常简短的概述,因为在使用 Karma 时,Karma 的内部工作原理并不是完全必要的。
以下是 Karma 的大致工作原理
启动后,Karma 加载插件和配置文件,然后启动其本地 Web 服务器,该服务器侦听连接。任何已经在服务器上等待 Websocket 的浏览器都会立即重新连接。作为加载插件的一部分,测试报告程序注册“浏览器”事件,以便它们准备好接收测试结果。
然后,karma 启动零个、一个或多个浏览器,并将它们的启动页面设置为 Karma 服务器 URL。
当浏览器连接时,Karma 会提供一个“client.html”页面;当此页面在浏览器中运行时,它会通过 Websocket 连接回服务器。
一旦服务器看到 Websocket 连接,它就会指示客户端(通过 Websocket)执行测试。客户端页面会打开一个包含服务器“context.html”页面的 iframe。服务器使用配置生成此 context.html 页面。此页面包含测试框架适配器、要测试的代码和测试代码。
当浏览器加载此 context 页面时,onload 事件处理程序会通过 postMessage 将 context 页面连接到客户端页面。此时,框架适配器负责:它运行测试,通过客户端页面消息报告错误或成功。
发送到客户端页面的消息将通过 Websocket 转发到 Karma 服务器。服务器会将这些消息重新分派为“浏览器”事件。侦听“浏览器”事件的报告程序会获取数据;它们可能会打印数据、将其保存到文件或将数据转发到其他服务。由于数据是由测试框架适配器发送到报告程序的,因此适配器和报告程序几乎总是成对出现,例如 karma-jasmine 和 karma-jasmine-reporter。测试结果数据的详细内容与 Karma 的其他部分无关:只有报告程序需要知道其格式。
Karma 有许多变体和选项,可能会导致使用不同配置的工作流程不同。
如果您有兴趣详细了解设计,Karma 本身起源于一篇大学论文,该论文详细介绍了设计和实现,并且可以 在这里 阅读。