我正在开发一个 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。
有什么解决办法吗?
在硒中这是不可能的。 需要在其他驱动程序上进行测试,例如 guzzle
据我所知,硒驱动程序铅铬,但不是它的工作原理。在我看来,建议检查使用其他驱动程序(例如 guzzle),您可以在其中设置标头,这是一个答案。
不,我发现你还可以有其他选择。建议您使用代理向浏览器生成的请求注入额外的标头。
为此我发现 * http://wiremock.org/
您应该使用 behatch 包,其中包含
behatch/rest
上下文。
但是,仅当您特别需要浏览器(例如 JavaScript)时才应使用 selenium 驱动程序。在这种情况下,当您测试 API 端点时,使用浏览器只会减慢您的速度,不会带来任何好处。
可以使用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"
不幸的是,我在 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);
}