javascript - 是否有任何选项可以通过量角器以任何方式读取服务状态?
问题描述
当我们运行任何 Web 应用程序时,应用程序会在内部调用 Web 服务,通过什么方式我们可以知道量角器中 http 服务调用的状态吗?我知道 node-fetch 包,它通过发送请求和获取响应来作为典型的服务调用。但我正在寻找的是,当应用程序运行时,我们可以获得服务的状态,如果它返回成功 200 或失败 400 等。我们在量角器中有这样的选择吗?
解决方案
在我的测试环境中,我遇到了类似的问题。我需要访问应用程序内部功能,例如检查某个请求是否完成。
最终的解决方案是通过window
对象公开功能。测试可以window
使用browser.executeScript()
.
教程
在网络应用程序中:
- 创建一个
class
包含您想在protractor
测试中使用的所有功能。在这种特殊情况下,我们想将一个字符串传递给 Web 应用程序,记录它,然后将其传递回测试。
export class E2EDriver {
public give_id_back = async (id: string): Promise<string> => {
// Application internal logic here. We can access anything since we are
// within the real application.
console.log("Driver is running something within web-application!, id:",id)
return id
}
}
- 将此类注入到
window
对象中。
const global = window as any
global.e2e_driver = new E2EDriver()
在量角器测试中:
现在,window 对象保存了新添加的E2EDriver
类。是时候在我们的测试中访问驱动程序了:
- 通过创建桥梁
browser.executeScript()
// This is a string of code which is passed to browser.executeAsyncScript()
const javascript_run_driver_fn = `
// remove function name from args
var args = [...arguments].splice(1);
// remove callback provided by protractor from args
var cb = args.splice(args.length-1, 1)[0];
// invoke requested function with given args and respond using cb()
e2e_driver[arguments[0]](...args).then(cb).catch(cb);
`;
// the real bridge..
const run_in_driver = async <T = void>(_browser: ProtractorBrowser, key: string, ...args: any[]): Promise<T> => {
return await _browser.executeAsyncScript<T>(javascript_run_driver_fn, key, ...(args || []))
}
let driver: E2EDriver = null
// For gettign access to the driver in protractor tests.
export class E2eDriverApi {
public static driver = async (_browser: ProtractorBrowser): Promise<E2eDriver> => {
if(driver) {
return driver
}
// get existing e2e-driver functions
const real_driver = await _browser.executeScript<E2eDriver>("return e2e_driver;")
const test_driver = { }
// expose functions from real_driver using browser.executeScript() API
// this creates the bridge..
Object.keys(real_driver).forEach(k => {
test_driver[k] = (...args: any[]) => run_in_driver(_browser, k, ...args)
})
driver = test_driver as E2eDriver
return driver
}
}
此代码从中获取e2e_driver
对象window
并将其包装在一个新对象中。在这个新对象中,所有函数都将被使用browser.executeAsyncScript()
并返回结果。
不幸的是,由于我们使用了这个api ,E2EDriver
因此仅限于使用返回 a 的函数。Promise
async
- 在一些测试中使用驱动程序:
import { E2eDriverApi } from "./path/to/file"
import { browser } from "protractor"
describe("Given, web application", () => {
describe("When started", () => {
it("should e2e-driver be available", async () => {
const driver = await E2eDriverApi.driver(browser)
const id = await driver.give_id_back("I should be written to console")
expect(id).toEqual("I should be written to console")
})
})
})
我希望这有帮助。询问是否有任何不清楚的地方。
干杯。!
推荐阅读
- shell - 从多个文件夹中复制文件,其中文件名是文件夹的一部分
- php - Laravel 多对多过滤器和总和
- jquery - 使用 jQuery Resizable 来控制 Margin 而不是 Size
- controller - 什么是 MegaRAID,它与 RAID 有什么关系?
- scikit-learn - 通过 mlxtend 或其他工具与原始数据堆叠
- angular - 使用 ngx-bootstrap 从角度更新模态数据
- python - 使用 Hyperopt 时出现 Trials() 问题?
- c# - 从列表 Linq 中删除重复的起始名称
- spring-kafka - 使用 Spring KafkaListener 处理 JSON 反序列化错误
- sql - 带有可选列的 Excel 插入脚本 SQL server 2004