如何在行为测试中设置请求标头?

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

我正在开发一个 Rest API 并使用 Behat 和 mink-selenium2-driver 对其进行测试(第一次)。出于安全考虑,每次调用都需要在请求标头中包含 apikey。

我的问题是,我无法设置标题。我的测试看起来像这样:

Given I add "X_ApiKey" header equal to "test"
When I send a GET request to "/notice"
Then the response status code should be 200

但我不断收到 403。

有什么解决办法吗?

header request behat
4个回答
2
投票

在硒中这是不可能的。 需要在其他驱动程序上进行测试,例如 guzzle

据我所知,硒驱动程序铅铬,但不是它的工作原理。在我看来,建议检查使用其他驱动程序(例如 guzzle),您可以在其中设置标头,这是一个答案。

不,我发现你还可以有其他选择。建议您使用代理向浏览器生成的请求注入额外的标头。

为此我发现 * http://wiremock.org/


0
投票

您应该使用 behatch 包,其中包含

behatch/rest
上下文。

但是,仅当您特别需要浏览器(例如 JavaScript)时才应使用 selenium 驱动程序。在这种情况下,当您测试 API 端点时,使用浏览器只会减慢您的速度,不会带来任何好处。


0
投票

可以使用Restler,这是一个微型框架,可以帮助在 Behat 中进行 RESTful API 测试。它支持使用 Behat 和 Guzzle 进行行为驱动的 API 测试。

这是例子:

Given that "X_ApiKey" header is set to "test"
When I request "/notice"
Then the response status code should be 200

这是来自

negotiation-format.feature
文件的另一个示例

Scenario: One with more `q` should be selected, q = 1 when not defined
  Given that "Accept" header is set to "application/json;q=0.8,application/xml"
  When I request "/examples/_003_multiformat/bmi"
  Then the response status code should be 200
  And the response is XML
  And the type is "array"

0
投票

不幸的是,我在 2024 年遇到同样的问题时偶然发现了这个 2014 年的问题。虽然我们幸运地在上面得到了一些很好的答案,但 Behatch 软件包已于 2021 年停产(是一个不错的软件包!)。如果你只是想用它来进行测试,我觉得 Restler 有点矫枉过正。

Mink 的内部,它要求所有标头以

HTTP_
开头,并将过滤掉其他参数。因此,如果您有一个 Context 扩展
RawMinkContext
(就像 behatch 所做的那样)并且想要设置自定义请求标头,您可以使用如下方法来实现:

public function iAddHeaderEqualTo($name, $value)
{
    if (!str_starts_with($name, 'HTTP_')) {
        $name = 'HTTP_' . $name;
    }

    $client = $this->getSession()->getDriver()->getClient();
    $client->setServerParameter($name, $value);
}
© www.soinside.com 2019 - 2024. All rights reserved.