首页 > 解决方案 > 是否有任何选项可以通过量角器以任何方式读取服务状态?

问题描述

当我们运行任何 Web 应用程序时,应用程序会在内部调用 Web 服务,通过什么方式我们可以知道量角器中 http 服务调用的状态吗?我知道 node-fetch 包,它通过发送请求和获取响应来作为典型的服务调用。但我正在寻找的是,当应用程序运行时,我们可以获得服务的状态,如果它返回成功 200 或失败 400 等。我们在量角器中有这样的选择吗?

标签: javascriptnode.jsserviceprotractor

解决方案


在我的测试环境中,我遇到了类似的问题。我需要访问应用程序内部功能,例如检查某个请求是否完成。

最终的解决方案是通过window对象公开功能。测试可以window使用browser.executeScript().

教程

在网络应用程序中:

  1. 创建一个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
    }
}
  1. 将此类注入到window对象中。
const global = window as any
global.e2e_driver = new E2EDriver()

在量角器测试中:

现在,window 对象保存了新添加的E2EDriver类。是时候在我们的测试中访问驱动程序了:

  1. 通过创建桥梁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 的函数。Promiseasync

  1. 在一些测试中使用驱动程序:
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")
        })

    })
})

我希望这有帮助。询问是否有任何不清楚的地方。

干杯。!


推荐阅读