如何使用 Codeception 来测试 laravel 5 个 API?
How to use Codeception to test laravel 5 APIs?
我是 Codeception 的新手,我正在尝试测试我使用 Laravel 5 构建的 Web 服务。我正在按照指南 here.
所以我首先创建了一个名为 api 的套件:
codecept generate:suite api
api.suite.yml
class_name: ApiTester
modules:
enabled:
- REST:
url: http://localhost:8000/api/
depends: Laravel5
AuthenticateUserCept.php
<?php
$I = new ApiTester($scenario);
$I->wantTo('authenticate a user');
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
$I->sendPOST('/authenticate', [
'username' => 'archive',
'email' => 'admin@admin.com',
'password' => 'password'
]);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
我已经用 Postman 试过了,运行良好。 /authenticate
路由采用 3 个参数并愉快地吐出一个 JWT 令牌,但我无法使其与 Codeception 一起使用。
1) Failed to authenticate a user in AuthenticateUserCept (tests/api//AuthenticateUserCept.php)
Step I see response code is 200
Fail Failed asserting that 500 matches expected 200.
Scenario Steps:
3. $I->seeResponseCodeIs(200)
2. $I->sendPOST("/authenticate",{"username":"archive","email":"admin@admin.com","password":"password"})
1. $I->haveHttpHeader("Content-Type","application/x-www-form-urlencoded")
我哪里错了?此外,我仍然不清楚如何重构此特定测试以便为我提出的其他请求提供 JWT。感谢任何帮助。
编辑 api.suite.yml
中的更改
class_name: ApiTester
modules:
enabled:
- REST:
url: http://localhost:8000/api/
depends: Laravel5
config:
Laravel5:
environment_file: .env.testing
在我回答之前,一些评论:
- 在 api.suite.yml 中的启用行上,我包括:启用:[PhpBrowser、REST、ApiHelper、Asserts]。
- REST 行中的 url 对 API 套件没有任何影响,它通常只用于验收套件。这应该是通过路由直接进入您的代码而不是使用 phpbrowser 模式或类似的方式进行 HTTP 调用。
- 您可以使用 Laravel5 模式而不是使用 PhpBrowser 模式——前者将通过中间件发送请求,Laravel5 模式不会通过中间件发送请求,如果 APP_ENV 设置为测试。
关于如何解决这个问题,我首先要弄清楚代码是如何处理 500 错误的。您可能会做的一件事是尝试在您的代码中插入一些 debug/log 行。另一件事是在测试用例中加入这样一行:
$I->seeResponseContains('blablabla');
当然会失败,但它会在 tests/_output 目录中产生一个输出,这样你就可以准确地看到你的代码返回了什么响应以及 500 错误(当然你需要这样做测试 200 条件之前的步骤,否则您的测试将在该步骤退出)。
测试用例中此类错误的一个常见原因是验证应用于传递到您的控制器方法的自定义请求 class。如果该验证失败,则控制器方法不会被命中,您将收到 500 错误,而无法在控制器中对其进行调试。我认为这种类型的自定义请求 classes 是个坏主意。
另一种可能的查询方式是构建一个测试相同路由的功能测试。通过 Laravel5 帮助程序模块进行的功能测试通常更容易开始工作和调试。一旦您进行了基本的功能测试并解决了您遇到的任何问题,那么 API 测试就更容易工作了。
我是 Codeception 的新手,我正在尝试测试我使用 Laravel 5 构建的 Web 服务。我正在按照指南 here.
所以我首先创建了一个名为 api 的套件:
codecept generate:suite api
api.suite.yml
class_name: ApiTester
modules:
enabled:
- REST:
url: http://localhost:8000/api/
depends: Laravel5
AuthenticateUserCept.php
<?php
$I = new ApiTester($scenario);
$I->wantTo('authenticate a user');
$I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded');
$I->sendPOST('/authenticate', [
'username' => 'archive',
'email' => 'admin@admin.com',
'password' => 'password'
]);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
我已经用 Postman 试过了,运行良好。 /authenticate
路由采用 3 个参数并愉快地吐出一个 JWT 令牌,但我无法使其与 Codeception 一起使用。
1) Failed to authenticate a user in AuthenticateUserCept (tests/api//AuthenticateUserCept.php)
Step I see response code is 200
Fail Failed asserting that 500 matches expected 200.
Scenario Steps:
3. $I->seeResponseCodeIs(200)
2. $I->sendPOST("/authenticate",{"username":"archive","email":"admin@admin.com","password":"password"})
1. $I->haveHttpHeader("Content-Type","application/x-www-form-urlencoded")
我哪里错了?此外,我仍然不清楚如何重构此特定测试以便为我提出的其他请求提供 JWT。感谢任何帮助。
编辑 api.suite.yml
中的更改class_name: ApiTester
modules:
enabled:
- REST:
url: http://localhost:8000/api/
depends: Laravel5
config:
Laravel5:
environment_file: .env.testing
在我回答之前,一些评论:
- 在 api.suite.yml 中的启用行上,我包括:启用:[PhpBrowser、REST、ApiHelper、Asserts]。
- REST 行中的 url 对 API 套件没有任何影响,它通常只用于验收套件。这应该是通过路由直接进入您的代码而不是使用 phpbrowser 模式或类似的方式进行 HTTP 调用。
- 您可以使用 Laravel5 模式而不是使用 PhpBrowser 模式——前者将通过中间件发送请求,Laravel5 模式不会通过中间件发送请求,如果 APP_ENV 设置为测试。
关于如何解决这个问题,我首先要弄清楚代码是如何处理 500 错误的。您可能会做的一件事是尝试在您的代码中插入一些 debug/log 行。另一件事是在测试用例中加入这样一行:
$I->seeResponseContains('blablabla');
当然会失败,但它会在 tests/_output 目录中产生一个输出,这样你就可以准确地看到你的代码返回了什么响应以及 500 错误(当然你需要这样做测试 200 条件之前的步骤,否则您的测试将在该步骤退出)。
测试用例中此类错误的一个常见原因是验证应用于传递到您的控制器方法的自定义请求 class。如果该验证失败,则控制器方法不会被命中,您将收到 500 错误,而无法在控制器中对其进行调试。我认为这种类型的自定义请求 classes 是个坏主意。
另一种可能的查询方式是构建一个测试相同路由的功能测试。通过 Laravel5 帮助程序模块进行的功能测试通常更容易开始工作和调试。一旦您进行了基本的功能测试并解决了您遇到的任何问题,那么 API 测试就更容易工作了。