完整配置指南)
WebdriverIO Jasmine 框架适配器wdio/jasmine-framework完整配置指南【免费下载链接】webdriverioNext-gen browser and mobile automation test framework for Node.js项目地址: https://gitcode.com/GitHub_Trending/we/webdriverio导读本文全面讲解 WebdriverIO 官方 Jasmine 测试框架适配器wdio/jasmine-framework的安装、配置与底层实现原理。它作为 WebdriverIO 测试运行器与 Jasmine 框架之间的桥接插件让你能在 E2E 测试中使用熟悉的describe/it/beforeEach等 Jasmine 语法同时接入 WebdriverIO 的全局expect、断言匹配器与钩子机制。读完本文你将掌握jasmineOpts全部选项的语义与默认值、如何用expectationResultHandler在断言失败时自动截图、如何用grep精确筛选用例并理解适配器如何通过源码级封装将 WebdriverIO 的能力注入 Jasmine 运行时。一、适配器是什么wdio/jasmine-framework是一个 WebdriverIO 插件package.json 中description为 A WebdriverIO plugin. Adapter for Jasmine testing framework.。它的职责是将 WebdriverIO 测试运行器wdio/runner与 Jasmine^5.0.0桥接起来加载规格spec文件、helpers 与 requires 模块把 Jasmine 的 suite/spec 生命周期事件转发为 WebdriverIO 运行器能够理解的事件流将 WebdriverIO 的expect全局与expect-webdriverio的自定义匹配器注入 Jasmine 环境。从源码结构看该包由四个模块组成src/index.ts核心适配器JasmineAdapter、src/reporter.ts事件转发与堆栈清理、src/utils.tsJest 风格结果到 Jasmine 结果的转换、src/types.tsJasmineOpts等类型定义。二、安装推荐将wdio/jasmine-framework作为devDependency安装npm install wdio/jasmine-framework --save-dev根据 package.json该包要求 Node.js18.20.0并声明了 peerDependencieswdio/runner^9.31.2与webdriverio^9.28.0均为必选运行时依赖jasmine^5.0.0、wdio/globals、wdio/logger、wdio/types、wdio/utils以及types/jasmine。三、基础配置在wdio.conf.js中设置framework: jasmine并通过jasmineOpts传入 Jasmine 专属配置// wdio.conf.js module.exports { // ... framework: jasmine, jasmineOpts: { defaultTimeoutInterval: 10000 } // ... };适配器在构造函数中会兼容读取历史遗留的jasmineNodeOpts字段见 src/index.ts 中this._config.jasmineOpts || this._config.jasmineNodeOpts的合并逻辑默认值cleanStack: true。同时注意即使未设置src/index.ts 中定义了DEFAULT_TIMEOUT_INTERVAL 60000当defaultTimeoutInterval未提供时会回退到该值。四、jasmineOpts 全部选项详解以下选项的类型与默认值以 src/types.ts 为准结合原文档与源码实现展开说明。defaultTimeoutInterval每个 spec 的超时时间毫秒超时后该 spec 会被标记为失败。类型Number默认值10000在 src/index.ts 中它被直接写回 Jasmine 的全局jasmine.DEFAULT_TIMEOUT_INTERVAL this._jasmineOpts.defaultTimeoutInterval || DEFAULT_TIMEOUT_INTERVAL。需要说明的是类型注释中标注的默认值为60000对应 Jasmine 自身的默认值而原文档示例给出的10000是推荐示例值两者均在源码中有据可查实际生效值以你配置为准。expectationResultHandlerJasmine 允许在每次断言之后拦截结果从而根据断言结果记录应用或网站状态。最典型的用法是在断言失败时自动截图。类型Function签名(passed: boolean, data: ResultHandlerPayload) void见 src/types.ts默认值null实现原理位于 src/index.ts适配器将jasmine.Spec.prototype.addExpectationResult替换为包装函数在每次断言结果返回前先调用你的处理器。ResultHandlerPayload包含passed、message、error三个可选字段src/types.ts。一个失败截图示例// wdio.conf.js module.exports { framework: jasmine, jasmineOpts: { expectationResultHandler: function(passed, assertion) { if (!passed) { browser.saveScreenshot(./assertionError_ assertion.error.message .png) } } } }一个重要的边界行为有测试佐证见 tests/adapter.test.ts如果断言本身通过但你的自定义处理器抛出了异常适配器会把本次断言改写为失败错误消息为expectationResultHandlerError: 你的错误信息而如果断言本来就失败、处理器又抛错则保留原始失败结果。grep用于从 spec 文件中选择性挑选it/describe用例运行的模式。类型RegExp | string默认值undefinedinvertGrep反转grep的匹配结果只运行不匹配grep表达式的用例。类型Boolean默认值false两者的匹配逻辑在customSpecFilter中实现src/index.ts它使用spec.getFullName().match(new RegExp(grep))判断用例全名是否命中模式当grepMatch Boolean(invertGrep)时通过spec.pend(grep)将用例置为 pending 并排除。注意grep只有在你未提供自定义specFilter函数时才生效见 src/types.ts。相关测试见 tests/adapter.test.ts。cleanStack清理堆栈追踪去除所有 node 模块包的痕迹。类型Boolean默认值true实现位于 src/reporter.ts通过正则STACKTRACE_FILTER /(node_modules(\/|\\)(\w)*|wdio\/sync\/(build|src)|- - - - -)/g过滤堆栈行。该选项也会在适配器构造函数中作为cleanStack传给JasmineReportersrc/index.ts。注意wdio/jasmine-framework的类型接口src/types.ts里标注的默认值为 false而 README 与适配器构造逻辑均以true为准——实际以源码中cleanStack: true的合并默认值为准。random以半随机顺序运行 spec。类型Boolean默认值false对应 Jasmineenv.configure({ random })同时可配合seed指定随机种子src/index.ts。stopOnSpecFailure在第一个it失败时停止当前describe套件执行其他套件继续运行。类型Boolean默认值falsestopSpecOnExpectationFailure在第一个期望失败时停止当前it的执行其他it继续运行。类型Boolean默认值false源码中该选项会被映射为 Jasmine 的oneFailurePerSpecsrc/index.ts即oneFailurePerSpec: this._jasmineOpts.stopSpecOnExpectationFailure || this._jasmineOpts.oneFailurePerSpec兼容旧属性名。对应的env.configure完整调用及测试断言见 tests/adapter.test.ts。requires在加载任何 helper 或 spec 文件之前先引入的模块。类型String[]默认值[]helpers在加载任何 spec 文件之前先引入的 helper 文件。类型String[]默认值[]两者的加载逻辑在_loadFiles中src/index.ts先通过jrunner.addRequires(requires)与jrunner.addMatchingHelperFiles(helpers)注册再依次loadRequires()、loadHelpers()、loadSpecs()。相关测试见 tests/adapter.test.ts。补充types.ts 中额外暴露的选项除 README 列出的选项外src/types.ts 还声明了更多可透传到jasmineEnv.configure的选项包括failFast布尔默认 false首个 spec 失败即停止整个套件已被stopOnSpecFailure取代标记为 deprecatedfailSpecWithNoExpectations布尔默认 falsespec 未执行任何断言时报告为失败oneFailurePerSpec布尔默认 false每个 spec 只报告第一个期望失败specFilter函数自定义 spec 过滤函数提供后grep/invertGrep不再生效seed随机化种子。其中failSpecWithNoExpectations若开启报告器会在失败用例无任何断言时注入一条toHaveAssertion风格的失败信息src/reporter.ts。五、适配器如何将 WebdriverIO 能力注入 Jasmine全局 expect 与匹配器桥接JasmineAdapter.setupExpectsrc/index.ts负责把wdio/runner传入的 WebdriverIOexpect与expect-webdriverio匹配器注册进 Jasmine使用 Jasmine 的expectAsync作为全局expect通过#setupMatchers将 WebdriverIO 匹配器包装为异步 matcher含compare/negativeCompare并将 Jasmine 自身同步 matcher 也转换#transformMatchers为异步形式将any、anything、arrayContaining、objectContaining、stringContaining、stringMatching、not等非对称匹配器从 WebdriverIOexpect附加到 Jasmineexpect上最终通过wdio/globals的_setGlobal(expect, ...)覆盖全局expect确保用例内expect(browser).toHaveTitle(...)等 WebdriverIO 风格断言可用。结果转换逻辑集中在 src/utils.tsjestResultToJasmine将expect-webdriverio返回的{ pass, message: () string }结果转换成 Jasmine 期望的{ pass, message }并处理 Promise 与isNot取反场景。全局测试接口包装与钩子适配器通过wrapGlobalTestMethod来自wdio/utils包装beforeAll、beforeEach、it、xit、fit、afterEach、afterAll这组 BDD 接口src/index.ts使 WebdriverIO 的beforeTest/afterTest/beforeHook/afterHook等生命周期钩子能够感知到当前测试上下文。同时对beforeAll/afterAll额外注入hook:start/hook:end事件发射器把钩子失败信息如error随事件一同上报对应测试见 tests/adapter.test.ts。事件转发与报告器src/reporter.ts 中的JasmineReporter实现了 Jasmine 的suiteStarted/specStarted/specDone/suiteDone将它们转换为suite:start、test:start、test:fail/pass/pending、test:end、suite:end等 WebdriverIO 事件并转发给wdio/runner。几个细节被xdescribe/xit排除的用例状态excluded会被改写为pending若cleanStack开启每个失败期望的堆栈都会被过滤若某个 suite 运行时报错但没有产生任何 spec会自动生成一个unknown test来承载该错误避免失败被静默吞掉src/reporter.ts若 spec 文件缺少根级describe包裹报告器会发出告警建议每个 spec 都以describe(..., () {...})开头src/reporter.ts。加载失败场景的处理_loadFiles捕获加载 spec 时的异常并仅记录警告src/index.ts提示如果 spec 在顶层就依赖尚未初始化完成的browser对象初始化阶段browser仅有capabilities和isMobile等标志位应将相关逻辑移到before钩子中执行。六、实用组合示例按标签筛选用例// wdio.conf.js module.exports { framework: jasmine, jasmineOpts: { grep: smoke, // 只运行全名包含 smoke 的用例 invertGrep: false // 置为 true 则反向运行不包含 smoke 的用例 } }// 对应的 spec 写法 describe(Login flow, () { it(should login with valid credentials smoke, () { browser.url(https://example.com/login) expect(browser.getTitle()).toBe(Login) }) })开启失败即停与随机顺序module.exports { framework: jasmine, jasmineOpts: { stopOnSpecFailure: true, // 本 suite 第一个 it 失败即停止本 suite stopSpecOnExpectationFailure: true // 当前 it 首个断言失败即停止该 it } }依赖预处理与 helpermodule.exports { framework: jasmine, jasmineOpts: { requires: [babel/register], // 在 helpers/spec 之前加载用于转译或打补丁 helpers: [./test/helpers/setup.js] // 在 spec 之前加载公共工具 } }七、注意事项与兼容性提示jasmineNodeOpts是历史遗留字段jasmineOpts优先两者同时存在时以jasmineOpts为准grep/invertGrep仅在没有自定义specFilter时生效stopSpecOnExpectationFailure与旧属性oneFailurePerSpec语义相同二者均可用于控制单 spec 首个断言失败即停failFast已被标记为 deprecated新项目请使用stopOnSpecFailureJasmine 下若要对单个用例配置重试需要注意第二个参数被保留为 timeout——需写成it(..., fn, jasmine.DEFAULT_TIMEOUT_INTERVAL, 3)的形式见 website/docs/Retry.md若在 spec 顶层依赖未初始化的browser命令导致加载失败请将相关逻辑移入before钩子该包当前为 ESMtype: module类型定义指向./build/index.d.ts。八、进一步阅读适配器核心实现packages/wdio-jasmine-framework/src/index.ts事件转发与堆栈清理packages/wdio-jasmine-framework/src/reporter.ts选项类型定义packages/wdio-jasmine-framework/src/types.ts单元测试覆盖环境配置、grep、expectationResultHandler、requires/helpers 等packages/wdio-jasmine-framework/tests/adapter.test.ts、tests/reporter.test.ts框架选型与配置总览website/docs/Frameworks.md、website/docs/Configuration.mdJasmine 下的重试语法website/docs/Retry.mdTypeScript 支持说明website/docs/TypeScript.md【免费下载链接】webdriverioNext-gen browser and mobile automation test framework for Node.js项目地址: https://gitcode.com/GitHub_Trending/we/webdriverio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考