以前の回答はすべて古いものでしたが、現在は Actor クラスを引数として取る _before メソッドで直接行われています。
<?php
namespace Test\Api;
use ApiTester;
class TrainingCest
{
public function _before(ApiTester $I)
{
$I->amLoggedInAs('kgkg');
}
public function _after(ApiTester $I)
{
}
// tests
public function testForLoggedInUser(ApiTester $I)
{
}
public function anotherTestForLoggedInUser(ApiTester $I)
{
}
}
また、すべての CEST ファイルに対して 1 回だけログインする場合は、レジストリ デザイン パターンを実装するグローバル レジストリ クラスを使用できます ( https://dzone.com/articles/practical-php-patterns/basic/practical-php-patterns-を参照)。 0 ) といくつかの遅延読み込み。Actor クラス (私の場合は ApiTester) で定義された API 統合テストの作業コードを次に示します。
public function amLoggedInAs($userLogin)
{
$I = $this;
if (Registry::getInstance()->exists($userLogin)) {
// get data from registry
$storedUserData = Registry::getInstance()->get($userLogin);
$newAccessToken = $storedUserData['accessToken'];
$playerId = $storedUserData['playerId'];
}
else {
// no registry data - log in and save data in registry
$I->tryToLogin($userLogin);
$newAccessToken = $I->grabDataFromResponseByJsonPath('data.newToken');
$playerId = (int)$I->grabDataFromResponseByJsonPath('data.userId');
Registry::getInstance()->set($userLogin, [
'accessToken' => $newAccessToken,
'playerId' => $playerId
]);
}
// finally set headers and some other data
$I->haveHttpHeader('X-Token', $newAccessToken);
$I->havePlayerId($playerId);
}
protected function tryToLogin($userLogin)
{
$I = $this;
$I->wantTo('login into api');
$I->amGoingTo('try to log to API using login and password');
$I->sendPOST('/system/login', ['login' => $userLogin, 'password' => self::getPassword($userLogin)]);
// ...some other checking if user was correctly logged in ...
}
このコードは基本的に、ユーザーが初めてログインした後、いくつかの追加データとともに accessToken をレジストリに保存します。$I->amLoggedInAs('kgkg') への別の呼び出しが呼び出されると、レジストリからこれらの値が取得されます。この方法で多数のユーザーをログに記録できます。各ユーザーはスイートごとに 1 回だけログに記録されます。
カスタム トークンの代わりに別の認証方法を使用できますが、ロジックは同じです。
また、 (PhpBrowser ではなく) WebDriver を使用している場合は、Registry の代わりに loadSessionSnapshot と saveSessionSnapshot を使用して、まったく同じ結果を得ることができます。