javascript - 检查 TestCafe 装置中失败的 http 请求

标签 javascript testing automated-tests httprequest testcafe

有时,我在访问应用程序的某些部分时会遇到 500 和 502 错误,我们希望能够捕获该错误并使 TestCafe 测试失败。

我们目前有此设置 https://stackoverflow.com/a/52443604/7551391当我们调用 waitForFailedRequest 函数时它工作得很好,并且它包裹着测试的内容,但我们希望在固定装置或全局中调用它,以便它始终在上查找 500 等错误每次测试。

我的主要问题是在 failed_requests.waitForFailedRequest() 中使用什么 action 参数,以便在每次测试时调用它。

failed_request_hooks.js

import EventEmitter from 'events'
import { RequestHook } from 'testcafe'


export class FailedRequestsLogger extends RequestHook {
    constructor (requestFilterRules, responseEventConfigureOpts) {
        super(requestFilterRules, responseEventConfigureOpts)

        this.events = new EventEmitter()
        this.failedRequestPromise = new Promise(resolve => this.events.once('failed-request', resolve))
    }

    async onRequest (event) {
    }

    async onResponse (event) {
        if (event.statusCode >= 500) {
            this.events.emit('failed-request', event.statusCode)
        }
    }

    async waitForFailedRequest (action) {                                                                                                          
        return Promise.race([                                                                                                                
                action(),                                                                                                                    
                this.failedRequestPromise.then(statusCode => Promise.reject(new Error(`Request failed with the ${statusCode} status code`))) 
        ])                                                                                                                
    }
}

测试文件

import { ClientFunction, Selector } from 'testcafe'
import { FailedRequestsLogger } from '../../api/failed_request_hook'
import data from '../../data/data.json'
import EditUrlRedirectsObjects from '../../pom/sites/url_redirects/edit_redirects_page_repo'
import GooglePreviewPageObjects from '../../pom/sites/url_redirects/google_preview_page_repo'
import HelperObjects from '../../pom/helpers'
import LoginPageObjects from '../../pom/login/login_page_repo'
import SitesPageObjects from '../../pom/sites/sites_page_repo'
import URLRedirectsPageObjects from '../../pom/sites/url_redirects/url_redirects_page_repo'
import WorkspaceMainNavPageObjects from '../../pom/navigation/workspace_main_nav_page_repo'


const failed_requests = new FailedRequestsLogger(/.*reborncf\.com/)

fixture `sites - url redirects`
  .page `${HelperObjects.get_base_url()}`
  .requestHooks(failed_requests)
  .beforeEach(async t => {
    await LoginPageObjects.login_with_password()
    await failed_requests.waitForFailedRequest()
  })

最佳答案

有几种方法可以在您的用例中实现这一点。您可以创建a request hook globally并按如下所示使用它:https://stackoverflow.com/a/52443604/7551391 :

//customRequestHook.js
const EventEmitter = require('events');
const { RequestHook } = require('testcafe');

class CustomRequestHook extends RequestHook {
    constructor (...args) {                                                                                                                  
        super(...args);                                                                                                                      

        this.events = new EventEmitter();                                                                                                    
        this.failedRequestPromise = new Promise(resolve => this.events.once('failed-request', resolve));                                     
    }                                                                                                                                        

    onRequest (request) {                                                                                                                    
    }                                                                                                                                        

    onResponse (response) {                                                                                                                  
        if (response.statusCode >= 500)                                                                                                      
            this.events.emit('failed-request', response.statusCode);                                                                         
    }                                                                                                                                        

    waitForFailedRequest (action) {                                                                                                          
        return Promise.race([                                                                                                                
                action(),                                                                                                                    
                this.failedRequestPromise.then(statusCode => Promise.reject(new Error(`Request failed with the ${statusCode} status code`))) 
        ])                                                                                                                                   
    }    
}

module.exports = new CustomRequestHook();
//.testcafers.js
const customRequestHook = require('./customRequestHook.js');

module.exports = {
  hooks: {
    request: customRequestHook,
  },
};
//test.js
import customRequestHook from './customRequestHook.js';

fixture`Fixture`
    .page('https://devexpress.github.io/testcafe/example/')
    .beforeEach(async t => {
        await customRequestHook.waitForFailedRequest(5000)
    });

test('Test', async t => {
    //test
});

如果您不想覆盖自定义代码,可以重新组织 waitForFailedRequest 并在其中插入超时:

//customRequestHook.js
const EventEmitter = require('events');
const { RequestHook } = require('testcafe');

class CustomRequestHook extends RequestHook {
    constructor (...args) {                                                                                                                  
        super(...args);                                                                                                                      

        this.events = new EventEmitter();                                                                                                    
        this.failedRequestPromise = new Promise(resolve => this.events.once('failed-request', resolve));                                     
    }                                                                                                                                        

    onRequest (request) {                                                                                                                    
    }                                                                                                                                        

    onResponse (response) {                                                                                                                  
        if (response.statusCode >= 500)                                                                                                      
            this.events.emit('failed-request', response.statusCode);                                                                         
    }                                                                                                                                        

    waitForFailedRequest(timeout) {
        return Promise.race([
            new Promise(resolve => setTimeout(resolve, timeout)),
            this.failedRequestPromise.then(statusCode => Promise.reject(new Error(`Request failed with the ${statusCode} status code`)))
        ])
    } 
}

module.exports = new CustomRequestHook();
//.testcafers.js
const customRequestHook = require('./customRequestHook.js');

module.exports = {
  hooks: {
    request: customRequestHook,
  },
};
//test.js
import customRequestHook from './customRequestHook.js';

fixture`Fixture`
    .page('https://devexpress.github.io/testcafe/example/')
    .beforeEach(async t => {
        await customRequestHook.waitForFailedRequest(5000)
    });

test('Test', async t => {
    //test
});

请记住,您可以根据需要更改 waitForFailedRequest 方法,因为它不是 TestCafe 方法。只有 JS 语法限制了你。

关于javascript - 检查 TestCafe 装置中失败的 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73327020/

相关文章:

performance - 测量页面加载时间

testing - 升级到 Microsoft Visual Studio Team Foundation Server 后缺少 "TEST"选项卡

javascript - 使用 JQuery Ajax 将 Json 对象数组发送到 Web 方法

javascript - 尝试向此工具提示添加额外的字符串,但不知道如何添加行空间

javascript - 动态加载javascript?

javascript - Appium - 滚动到一个不起作用的按钮

automated-tests - 在 Github 操作上运行的机器人框架无法获取测试返回代码

javascript - 氨基A140开发(机顶盒)

ruby - 愚蠢的 ruby 货币

java - 如何使用apache poi将动态Excel文件(列数可以超过)写入java对象