根据空手道中预期和不允许的标头列表验证响应

问题描述 投票:0回答:1

我遇到一个问题,客户希望保证某些 HTTP 标头始终在所有 API 响应中返回(即必需标头),并且某些标头永远不会在所有 API 响应中返回(即受限标头)。

我想要做的是拥有一个必需标头列表和一个受限标头列表,然后对于每个 HTTP 响应,如果在受限列表中找到标头,则测试用例失败,并且类似地如果响应缺少所需列表中的标头,测试也会失败。这感觉像是一个需要解决的非常微不足道的问题,但我很难弄清楚如何使其工作,而不必将重复的代码复制并粘贴到数十个功能文件中。

有没有一种惯用的方法可以在 karate-config.js 中进行全局设置?

[免责声明:Karate 开发者在此添加常见问题解答,以造福用户社区]

karate
1个回答
0
投票

是的,创建一个在

karate-config.js
中设置的通用功能应该很容易。这是一个例子:

function fn(config) {
    if (!config) {
        config = {};
    }
    if (!config.present) {
        config.present = [];
    }
    if (!config.notpresent) {
        config.notpresent = [];
    }
    var headers = karate.get('responseHeaders');
    var keys = Object.keys(headers).map(x => x.toLowerCase());
    // karate.log('header keys:', keys);
    config.present.forEach(present => {
        if (!keys.includes(present)) {
            karate.fail('expected header not present: ' + present);
        }
    });
    keys.forEach(key => {
        if (config.notpresent.includes(key)) {
            karate.fail('header present but not expected: ' + key);
        }
    });
}

假设上面的文件名为

header-check.js
并与
karate-config.js
并排。现在你可以这样做:

function fn() {
    return { headerCheck: read('classpath:header-check.js') }
}

现在您的功能只需调用

headerCheck()
:

* url 'https://httpbin.org/anything'
* request {}
* method post
* status 200
* headerCheck({ present: ['content-type'], notpresent: ['connection'] })

我希望这能为您提供一个起点,您可以采用各种策略来动态设置标头列表或对它们进行硬编码。请注意如何通过

karate.fail()
API 使空手道测试失败并显示友好的错误消息。

我认为每次通话后都必须打电话给

headerCheck()
是合理的。如果您确实希望将其抽象化,唯一的方法是使用 Java hook,并且
RuntimeHook
有一个
afterHttpCall()
回调。

© www.soinside.com 2019 - 2024. All rights reserved.