【问题标题】:azure function unit test cases for retry scenario - nodejs重试场景的天蓝色函数单元测试用例 - nodejs
【发布时间】:2022-01-10 12:03:09
【问题描述】:

我已经使用 NodeJs 构建了一个 azure 函数。使用 Jest 进行测试。

场景: 从函数进行 API 调用时,如果第 3 方返回 Timeout,我需要再重试 1 次然后退出。这工作正常,服务器正在自动重试。

逻辑:

函数.json

"retry": {
    "strategy": "exponentialBackoff",
    "maxRetryCount": 1,
    "minimumInterval": "00:00:10",
    "maximumInterval": "00:00:40"
}

index.js - 在 try/catch 下

catch (err) {
                let errorCode = err.errorCode || err.code || 500;                   
                let errorMessage = err.message|| err.errorMessage;
                if (errorMessage && errorMessage.indexOf("ETIMEDOUT") >= 0 ) {
                    errorCode = 429; //setting errorCode as 429 to retry automatically from azure function
                    let retryError = new Error("retrying requests");
                    retryError.code = 429;
                    throw retryError;
                }else{
                   context.done();
                }
           };

index.test.js

测试套件无法运行 重试请求

一旦从主类抛出错误,测试类会在“let retryError = new Error("retrying requests");”这一行中断。

那么,如果服务器重试耗尽,仍然响应为 429,如何编写测试用例?

【问题讨论】:

    标签: node.js jestjs azure-functions retry-logic


    【解决方案1】:

    我正在关注Doc 在 Nodejs Azure 功能中实现自动化测试。步骤如下:

    要在 VS 代码扩展中测试 Azure 功能,请使用 Jest。

    使用npm i jest安装jest

    更新 package.json 以用以下命令替换现有的测试命令

    "scripts": {
        "test": "jest"
    }
    

    对于自动化测试,您可以创建一个模块来运行测试。创建一个您喜欢的新文件夹 (testing) 在创建的文件夹中添加一个新文件 (defaultContext.js) 并添加以下命令以记录函数默认执行上下文。

    module.exports = {
        log: jest.fn()
    };
    

    然后在 HTTP 函数触发器文件夹中添加一个新文件 index.test.js 并添加以下代码

    const httpFunction = require('./index');
    const context = require('../testing/defaultContext')
    test('Http trigger should return known text', async () => {
        const request = {
        query: { name: 'Bill' }
    };
    await httpFunction(context, request);
    expect(context.log.mock.calls.length).toBe(1);
    expect(context.res.body).toEqual('Hello Bill');
    });
    

    使用npm test 命令运行单元测试。

    尝试在你的天蓝色函数中添加retry policy

    在您的触发器中使用 fixedDelayexponentialBackoff

    function.json 中添加重试策略
    {
        "disabled": false,
        "bindings": [
        {
            ....
        }
        ],
        "retry": {
            "strategy": "exponentialBackoff",
            "maxRetryCount": 5,
            "minimumInterval": "00:00:10",
            "maximumInterval": "00:15:00"
        }
    }
    

    使用npm test 添加所有运行测试后,我可以看到结果:

    重试限制:

    在消费计划中,

    在重试队列中的最终消息时,应用程序可能会缩小到 &

    在执行重试时,应用程序可能会缩小。选择重试间隔 重试以获得更好的结果。

    警告 不建议将诸如服务总线队列之类的触发器的传递计数设置为 1,这意味着消息将在单个函数重试周期后立即变为死信。这是因为触发器通过重试提供弹性,而函数重试策略是尽力而为,可能会导致重试总数低于预期。

    参考here

    【讨论】:

    • 如果回答对您有帮助,请Accept it as an Answer,以便遇到相同问题的其他人可以找到此解决方案并解决他们的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    相关资源
    最近更新 更多