ApiTestCase 는 Symfony API 개발자로서의 삶을 훨씬 쉽게 만들어줄 PHPUnit TestCase입니다. 몇 가지 멋진 기능으로 기본 Symfony WebTestCase를 확장합니다.
Readme에 따르면 PHP-Matcher 덕분에 "깡패처럼 예상되는 json 응답을 작성"할 수 있습니다. 우리는 확실히 동의합니다.
또한 Doctrine Fixture를 쉽게 로딩하기 위해 Alice를 사용합니다.
특징:
이미 Composer가 전역적으로 설치되어 있다고 가정합니다.
composer require --dev lchrusciel/api-test-case
그리고 끝났습니다! ApiTestCase는 기본 구성으로 작업 중입니다.
테스트 사례에 대해 JsonApiTestCase와 XmlApiTestCase라는 두 가지 기본 클래스를 제공합니다. 생성하려는 API 형식에 따라 하나를 선택하세요.
기본 TDD 작업흐름은 다음과 같습니다:
assertResponse
어설션 메서드를 사용하여 응답 내용이 예상과 일치하는지 확인합니다. 응답 파일의 이름이 필요합니다.src/AppBundle/Tests/Responses/Expected/hello_world.json
에 넣어야 합니다.간단한 예를 살펴보겠습니다! 다음 테스트를 작성하세요.
namespace AppBundle Tests Controller HelloWorldTest ;
use ApiTestCase JsonApiTestCase ;
class HelloWorldTest extends JsonApiTestCase
{
public function testGetHelloWorldResponse ()
{
$ this -> client -> request ( ' GET ' , ' / ' );
$ response = $ this -> client -> getResponse ();
$ this -> assertResponse ( $ response , ' hello_world ' );
}
}
이제 예상 응답 파일을 정의합니다.
{
"message" : " Hello ApiTestCase World! "
}
테스트를 실행하세요.
vendor/bin/phpunit
일부 오류로 인해 테스트가 실패해야 하며 컨트롤러와 라우팅이 누락되었을 수 있으므로 계속해서 정의하십시오! 컨트롤러를 구현하고 적절한 라우팅을 구성하자마자 테스트를 다시 실행할 수 있습니다.
응답 내용이 기대와 일치하면 콘솔에 간단한 메시지가 표시됩니다.
OK (1 tests, 2 assertions)
그렇지 않으면 수신된 메시지의 차이점이 표시됩니다.
" Hello ApiTestCase World " does not match " Hello ApiTestCase World! " .
@@ -1,4 +1,3 @@
{
- " message " : " Hello ApiTestCase World! "
+ " message " : " Hello ApiTestCase World "
}
-
먼저, assertResponse
함수는 응답 코드(200은 기본 응답 코드)를 확인한 다음 응답 헤더에 application/json
콘텐츠 유형이 포함되어 있는지 확인합니다. 마지막에는 응답 내용이 기대와 일치하는지 확인합니다. 때로는 응답의 일부 값(예: 데이터베이스에서 자동 생성된 날짜 또는 ID)을 예측할 수 없는 경우가 있습니다. PHP-Matcher가 도움의 손길과 함께 제공되므로 여기에는 마법이 필요하지 않습니다. 다음은 사용 가능한 패턴의 몇 가지 예입니다.
@string@
@integer@
@boolean@
@array@
PHP-Matcher 문서에서 자세한 내용을 확인하세요.
이러한 패턴을 사용하면 예상되는 응답은 다음과 같습니다.
{
"message" : " @string@ "
}
이를 사용하면 주요 message
아래의 모든 문자열이 패턴과 일치합니다. 더 복잡한 예상 응답은 다음과 같습니다.
[
{
"id" : " @integer@ " ,
"name" : " Star-Wars T-shirt " ,
"sku" : " SWTS " ,
"price" : 5500 ,
"sizes" : " @array@ " ,
"created_at" : " @[email protected]() "
},
{
"id" : " @integer@ " ,
"name" : " Han Solo Mug " ,
"sku" : " HSM " ,
"price" : 500 ,
"sizes" : " @array@ " ,
"created_at" : " @[email protected]() "
}
]
그리고 다음 제품 목록과 일치합니다.
array (
array (
' id ' => 1 ,
' name ' => ' Star-Wars T-shirt ' ,
' sku ' => ' SWTS ' ,
' price ' => 5500 ,
' sizes ' => array ( ' S ' , ' M ' , ' L ' ),
' created_at ' => new DateTime (),
),
array (
' id ' => 2 ,
' name ' => ' Han Solo Mug ' ,
' sku ' => ' HSM ' ,
' price ' => 500 ,
' sizes ' => array ( ' S ' , ' L ' ),
' created_at ' => new DateTime (),
),
)
ApiTestCase는 nelmio/alice
와 통합됩니다. 이 멋진 라이브러리 덕분에 필요할 때 조명기를 쉽게 로드할 수 있습니다. 조명기를 정의하고 적절한 디렉토리에 배치해야 합니다. 다음은 조명기 및 사용 사례를 정의하는 방법에 대한 몇 가지 예입니다. 조명기를 정의하는 방법에 대한 자세한 내용은 Alice의 문서를 확인하세요.
Alice with Doctrine을 사용하려면 다음 두 가지 추가 번들을 활성화해야 합니다.
심포니 4.0+
// config/bundles.php
return [
// ...
Nelmio Alice Bridge Symfony NelmioAliceBundle::class => [ ' test ' => true ],
Fidry AliceDataFixtures Bridge Symfony FidryAliceDataFixturesBundle::class => [ ' test ' => true ],
];
이제 애플리케이션에 Book이라는 매핑된 Doctrine 엔터티가 있다고 가정해 보겠습니다.
class Book
{
private $ id ;
private $ title ;
private $ author ;
// ...
}
테스트용 픽스처를 로드하려면 src/AppBundle/Tests/DataFixtures/ORM/books.yml
에 간단한 YAML
파일을 정의해야 합니다.
ApiTestCaseTestEntityBook :
book1 :
title : " Lord of The Rings "
author : " J. R. R. Tolkien "
book2 :
title : " Game of Thrones "
price : " George R. R. Martin "
마지막으로 테스트에서 이러한 픽스처를 사용하려면 적절한 메서드를 호출하면 됩니다.
public function testBooksIndexAction ()
{
// This method require subpath to locate specific fixture file in your DataFixtures/ORM directory.
$ this -> loadFixturesFromFile ( ' books.yml ' );
// There is another method that allows you to load fixtures from directory.
$ this -> loadFixturesFromDirectory ( ' big_library ' );
}
테스트 스위트 구성을 사용자 정의하려면 phpunit.xml에 몇 가지 옵션을 더 추가할 수 있습니다:
< php >
< server name = " KERNEL_CLASS " value = " AcmeKernel " />
< server name = " EXPECTED_RESPONSE_DIR " value = " /path/to/expected/responses/ " />
< server name = " FIXTURES_DIR " value = " /path/to/DataFixtures/ORM/ " />
< server name = " OPEN_ERROR_IN_BROWSER " value = " true/false " />
< server name = " OPEN_BROWSER_COMMAND " value = " open %s " />
< server name = " IS_DOCTRINE_ORM_SUPPORTED " value = " true/false " />
< server name = " TMP_DIR " value = " /tmp/path/to/temporary/folder/ " />
< server name = " ESCAPE_JSON " value = " true/false " />
</ php >
KERNEL_CLASS
사용하면 커널을 설정하기 위해 사용해야 하는 클래스를 정확하게 지정할 수 있습니다.ERESPONSE_DIR
변수에는 예상 응답이 있는 폴더에 대한 경로가 포함되어 있습니다. API 결과를 기존 json 파일과 비교할 때 사용됩니다. 이 값이 설정되지 않으면 ApiTestCase는 응답 위치를 추측하고 컨트롤러 테스트 클래스에 상대적으로 위치한 '../Responses' 폴더에서 응답을 찾습니다.FIXTURES_DIR
변수에는 데이터 고정물이 있는 폴더에 대한 경로가 포함되어 있습니다. 기본적으로 이 변수가 설정되지 않으면 테스트 클래스에 상대적으로 위치한 ../DataFixtures/ORM/
검색합니다. ApiTestCase는 폴더가 존재하지 않거나 로드할 파일이 없는 경우 RunTimeException을 발생시킵니다.OPEN_ERROR_IN_BROWSER
는 브라우저 창에 오류를 표시하는 플래그입니다. 기본값은 false입니다.OPEN_BROWSER_COMMAND
는 예외적으로 브라우저를 여는 데 사용되는 명령입니다.IS_DOCTRINE_ORM_SUPPORTED
는 편리한 데이터 고정 장치 로더 및 데이터베이스 제거기를 포함하는 교리 지원을 켜는 플래그입니다.TMP_DIR
변수에는 로그 파일이 저장될 임시 폴더의 경로가 포함됩니다.ESCAPE_JSON
은 예상 데이터와 비교하기 전에 JSON 출력의 이스케이프(유니코드 문자 및 슬래시)를 켜는 플래그입니다. 기본값은 false입니다. 이 플래그는 이전 버전의 ApiTestCase(켜진 경우)와의 하위 호환성을 위해서만 존재하며 향후 버전에서는 제거됩니다. test/
디렉터리에서 이 라이브러리를 사용하는 데 필요한 최소한의 구성이 포함된 샘플 Symfony 프로젝트를 찾을 수 있습니다.
PHPUnit 테스트 제품군을 실행하려면 다음 명령을 실행하세요.
composer install
test/app/console doctrine:database:create
test/app/console doctrine:schema:create
vendor/bin/phpunit
버그를 발견했거나 개선을 위한 좋은 아이디어가 있으면 이 저장소에서 문제를 열어주세요.
릴리스에는 major.minor.patch
형식으로 번호가 지정됩니다.
그리고 다음 지침에 따라 구성되었습니다.
SemVer에 대한 자세한 내용은 semver.org 웹사이트를 참조하세요.
라이센스는 여기에서 찾을 수 있습니다.
라이브러리는 원래 다음에 의해 만들어졌습니다.
https://github.com/Lakion/ApiTestCase 저장소 아래 Lakion 회사에서.
기여자 목록을 참조하세요.