HTTP 기능 테스트
기능 테스트(Feature Testing)를 사용하면 애플리케이션에 대한 단일 호출의 결과를 확인할 수 있습니다. 단일 웹 폼의 결과를 반환하거나 API 엔드포인트를 호출하는 것 등이 이에 해당합니다. 이 방법은 단일 요청의 전체 생명주기를 테스트하여 라우팅이 올바르게 작동하는지, 응답이 올바른 형식인지, 결과를 분석하는 등 다양한 검증을 할 수 있어 편리합니다.
테스트 클래스
기능 테스트를 사용하려면 모든 테스트 클래스에서 CodeIgniter\Test\DatabaseTestTrait와 CodeIgniter\Test\FeatureTestTrait 트레이트를 사용해야 합니다. 이 테스트 도구들은 데이터베이스의 올바른 준비 과정에 의존하므로, 자체 메서드를 구현할 경우 반드시 parent::setUp()과 parent::tearDown()이 호출되도록 해야 합니다.
<?php
namespace Tests\Feature;
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;
use CodeIgniter\Test\FeatureTestTrait;
class FooTest extends CIUnitTestCase
{
use DatabaseTestTrait;
use FeatureTestTrait;
protected function setUp(): void
{
parent::setUp();
$this->myClassMethod();
}
protected function tearDown(): void
{
parent::tearDown();
$this->anotherClassMethod();
}
}
페이지 요청
기본적으로 기능 테스트는 애플리케이션의 엔드포인트를 호출하고 결과를 반환받을 수 있게 해줍니다. 이를 위해 call() 메서드를 사용합니다.
첫 번째 매개변수는 사용할 HTTP 메서드입니다 (주로
GET또는POST).두 번째 매개변수는 테스트할 사이트의 URI 경로입니다.
세 번째 매개변수
$params는 사용 중인 HTTP 동사에 해당하는 슈퍼글로벌 변수를 채우는 데 사용되는 배열을 받습니다. 따라서 GET 메서드는$_GET변수를 채우고, POST 요청은$_POST배열을 채웁니다.$params는 요청 형식 지정에서도 사용됩니다.참고
$params배열이 모든 HTTP 동사에 적합한 것은 아니지만, 일관성을 위해 포함되어 있습니다.
// Get a simple page
$result = $this->call('GET', '/');
// Submit a form
$result = $this->call('post', 'contact', [
'name' => 'Fred Flintstone',
'email' => 'flintyfred@example.com',
]);
축약 메서드
각 HTTP 동사에 대한 축약 메서드가 있어 더 간결하고 명확하게 작성할 수 있습니다:
$this->get($path, $params);
$this->post($path, $params);
$this->put($path, $params);
$this->patch($path, $params);
$this->delete($path, $params);
$this->options($path, $params);
다른 라우트 설정
withRoutes() 메서드에 “routes” 배열을 전달하여 커스텀 라우트 모음을 사용할 수 있습니다. 이렇게 하면 시스템의 기존 라우트가 재정의됩니다:
$routes = [
['GET', 'users', 'UserController::list'],
];
$result = $this->withRoutes($routes)->get('users');
각 “route”는 HTTP 동사(모든 메서드의 경우 “add”), 매칭할 URI, 라우팅 대상으로 구성된 3개 요소의 배열입니다.
세션 값 설정
withSession() 메서드를 사용하여 단일 테스트에서 사용할 커스텀 세션 값을 설정할 수 있습니다. 이 메서드는 요청 시 $_SESSION 변수에 존재해야 하는 키/값 쌍의 배열을 받거나, 현재 $_SESSION 값을 사용하도록 null을 받습니다. 인증 테스트 등에 유용합니다.
$values = [
'logged_in' => 123,
];
$result = $this->withSession($values)->get('admin');
// Or...
$_SESSION['logged_in'] = 123;
$result = $this->withSession()->get('admin');
헤더 설정
withHeaders() 메서드를 사용하여 헤더 값을 설정할 수 있습니다. 이 메서드는 호출 시 헤더로 전달될 키/값 쌍의 배열을 받습니다:
$headers = [
'CONTENT_TYPE' => 'application/json',
];
$result = $this->withHeaders($headers)->post('users');
이벤트 건너뛰기
이벤트는 애플리케이션에서 유용하게 사용되지만, 테스트 중에는 문제가 될 수 있습니다. 특히 이메일을 발송하는 이벤트가 그렇습니다. skipEvents() 메서드를 사용하여 모든 이벤트 처리를 건너뛰도록 시스템에 지시할 수 있습니다:
$result = $this->skipEvents()->post('users', $userInfo);
요청 형식 지정
withBodyFormat() 메서드를 사용하여 요청 본문의 형식을 설정할 수 있습니다. 현재 json 또는 xml을 지원합니다. 컨트롤러가 기대하는 형식으로 요청을 설정할 수 있어 JSON 또는 XML API를 테스트할 때 유용합니다.
이 메서드는 call(), post(), get() 등에 전달된 매개변수를 받아 지정된 형식으로 요청 본문에 할당합니다.
이 메서드는 요청에 맞게 Content-Type 헤더도 함께 설정합니다.
// If your feature test contains this:
$result = $this->withBodyFormat('json')->post('users', $userInfo);
// Your controller can then get the parameters passed in with:
$userInfo = $this->request->getJson();
본문 설정
withBody() 메서드를 사용하여 요청 본문을 직접 설정할 수 있습니다. 원하는 형식으로 자유롭게 본문을 작성할 수 있습니다. 복잡한 XML을 테스트해야 하는 경우 이 메서드를 사용하는 것을 권장합니다.
이 메서드는 Content-Type 헤더를 자동으로 설정하지 않습니다. 필요한 경우 withHeaders() 메서드를 사용하여 설정할 수 있습니다.
응답 확인
FeatureTestTrait::call()은 TestResponse의 인스턴스를 반환합니다. 테스트 케이스에서 추가 어설션 및 검증을 수행하는 방법은 응답 테스트를 참고하십시오.