스냅샷 테스트는 실제 테스트 케이스를 작성하지 않고 테스트하는 방법입니다.
Laravel 테스트 과정의 무료 동영상을 통해 더 자세히 알아볼 수 있습니다. Laravel이 아닌 프로젝트에서도 이 패키지를 사용할 수 있으니 걱정하지 마세요.
SpatieSnapshotsMatchesSnapshots;class OrderTest 사용 {MatchesSnapshots 사용;공개 함수 test_it_casts_to_json() {$order = new Order(1);$this->assertMatchesJsonSnapshot($order->toJson()); } }
첫 번째 실행에서 테스트 실행기는 새 스냅샷을 생성합니다.
> ./vendor/bin/phpunit There was 1 incomplete test: 1) OrderTest::test_it_casts_to_json Snapshot created for OrderTest__test_it_casts_to_json__1 OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1.
후속 실행에서는 스냅샷이 변경되지 않는 한 테스트가 통과됩니다.
> ./vendor/bin/phpunit OK (1 test, 1 assertion)
회귀가 있으면 테스트가 실패합니다!
$orderId = 새로운 주문(2); // 회귀! '1'이었다
> ./vendor/bin/phpunit 1) OrderTest::test_it_casts_to_json Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ Failed asserting that '{"id":2}' matches JSON string "{ "id": 1 } FAILURES! Tests: 1, Assertions: 1, Failures: 1.
우리는 동급 최고의 오픈 소스 패키지를 만드는 데 많은 리소스를 투자합니다. 유료 제품 중 하나를 구매하여 우리를 지원할 수 있습니다.
귀하가 사용하고 있는 당사 패키지를 언급하면서 귀하의 고향에서 엽서를 보내주셔서 진심으로 감사드립니다. 연락처 페이지에서 주소를 확인하실 수 있습니다. 우리는 수신된 모든 엽서를 가상 엽서 월에 게시합니다.
작곡가를 통해 패키지를 설치할 수 있습니다.
작성기에는 --dev spatie/phpunit-snapshot-assertions가 필요합니다.
스냅샷 어설션을 만들려면 테스트 케이스 클래스에서 SpatieSnapshotsMatchesSnapshots
특성을 사용하세요. 그러면 클래스에 어설션 메서드 집합이 추가됩니다.
assertMatchesSnapshot($actual)
assertMatchesFileHashSnapshot($actual)
assertMatchesFileSnapshot($actual)
assertMatchesHtmlSnapshot($actual)
assertMatchesJsonSnapshot($actual)
assertMatchesObjectSnapshot($actual)
assertMatchesTextSnapshot($actual)
assertMatchesXmlSnapshot($actual)
assertMatchesYamlSnapshot($actual)
assertMatchesImageSnapshot($actual)
간단한 문자열 "foo"에 대한 스냅샷 어설션을 수행해 보겠습니다.
공개 함수 test_it_is_foo() {$this->assertMatchesSnapshot('foo'); }
어설션이 처음 실행될 때 문자열을 비교할 스냅샷이 없습니다. 테스트 실행기는 새 스냅샷을 생성하고 테스트를 불완전한 것으로 표시합니다.
> ./vendor/bin/phpunit There was 1 incomplete test: 1) ExampleTest::test_it_matches_a_string Snapshot created for ExampleTest__test_it_matches_a_string__1 OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1.
스냅샷 ID는 테스트 및 테스트 케이스 이름을 기반으로 생성됩니다. 기본 스냅샷은 실제 값의 일반 텍스트 또는 YAML 표현을 반환합니다.
푸
테스트를 다시 실행해 보겠습니다. 테스트 실행기는 어설션에 대한 스냅샷이 이미 있는지 확인하고 비교를 수행합니다.
> ./vendor/bin/phpunit OK (1 test, 1 assertion)
실제 값을 "bar"로 변경하면 스냅샷이 여전히 "foo"를 반환하므로 테스트가 실패합니다.
공개 함수 test_it_is_foo() {$this->assertMatchesSnapshot('bar'); }
> ./vendor/bin/phpunit 1) ExampleTest::test_it_matches_a_string Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'foo' +'bar' FAILURES! Tests: 1, Assertions: 1, Failures: 1.
변경된 값이 예상되면 테스트에 실패하는 대신 기존 스냅샷을 업데이트하도록 테스트 실행기에 지시해야 합니다. 이는 phpunit
명령에 -d --update-snapshots
플래그를 추가하거나 UPDATE_SNAPSHOTS
env var를 true
로 설정하면 가능합니다.
> ./vendor/bin/phpunit -d --update-snapshots OK (1 test, 1 assertion)
결과적으로 스냅샷 파일은 "foo" 대신 "bar"를 반환합니다.
술집
MatchesSnapshots
특성은 파일이 테스트가 처음 실행될 때 생성된 스냅샷과 동일하다고 주장하는 두 가지 방법을 제공합니다.
assertMatchesFileHashSnapshot($filePath)
어설션은 함수에 전달된 파일의 해시와 스냅샷에 저장된 해시가 일치하는지 확인합니다. 이 어설션은 빠르며 디스크 공간을 거의 사용하지 않습니다. 이 주장의 단점은 테스트가 실패할 경우 두 파일이 어떻게 다른지 쉽게 확인할 수 있는 방법이 없다는 것입니다.
assertMatchesFileSnapshot($filePath)
어설션은 실제로 전체 파일을 snapshots 디렉터리에 저장한다는 점을 제외하면 파일 해시 어설션과 거의 동일한 방식으로 작동합니다. 어설션이 실패하면 실패한 파일을 스냅샷 파일 옆에 배치하여 쉽게 수동으로 비교할 수 있습니다. 지속된 실패 파일은 테스트가 통과되면 자동으로 삭제됩니다. 이 어설션은 이미지나 PDF와 같이 수동으로 비교해야 하는 바이너리 파일로 작업할 때 가장 유용합니다.
assertImageSnapshot
을 사용하려면 spatie/pixelmatch-php 패키지를 설치해야 합니다.
주어진 이미지가 테스트가 처음 실행되었을 때 생성된 스냅샷과 거의 동일하면 이 어설션은 통과됩니다. 어설션에 두 번째 인수를 전달하여 임계값을 사용자 지정할 수 있습니다. 값이 높을수록 비교가 더욱 민감해집니다. 임계값은 0과 1 사이여야 합니다.
$this->assertMatchesImageSnapshot($imagePath, 0.1);
스냅샷 ID는 MatchesSnapshot
특성의 getSnapshotId
메소드를 통해 생성됩니다. ID를 맞춤설정하려면 메서드를 재정의하세요. 기본적으로 테스트 이름, 테스트 케이스 이름 및 증분 값의 스냅샷 ID가 존재합니다(예: Test__my_test_case__1
.
__
구분 기호를 --
로 바꾸기보호된 함수 getSnapshotId(): string{return (new ReflectionClass($this))->getShortName().'--'.$this->name().'--'.$this->snapshotIncrementor; }
기본적으로 스냅샷은 테스트 클래스와 관련된 __snapshots__
디렉터리에 저장됩니다. 이는 getSnapshotDirectory
메소드를 대체하여 변경할 수 있습니다.
__snapshots__
디렉터리 이름을 snapshots
으로 변경보호된 함수 getSnapshotDirectory(): string{return dirname((new ReflectionClass($this))->getFileName()).DIRECTORY_SEPARATOR.'snapshots'; }
데이터를 직렬화하는 데 사용되는 드라이버는 assertMatchesSnapshot
메서드의 두 번째 인수로 지정될 수 있으므로 필요에 더 적합한 드라이버를 선택할 수 있습니다.
SpatieSnapshotsDriversJsonDriver 사용; SpatieSnapshotsMatchesSnapshots 사용;클래스 OrderTest {MatchesSnapshots 사용;공개 함수 test_snapshot_with_json_driver() {$order = new Order(1);$this->assertMatchesSnapshot($order->toJson(), new JsonDriver()); } }
드라이버는 다양한 유형의 데이터를 고유한 방식으로 직렬화하고 일치시킬 수 있도록 합니다. 드라이버는 SpatieSnapshotsDriver
인터페이스를 구현하는 클래스로, serialize
, extension
및 match
세 가지 메서드 구현이 필요합니다.
JsonDriver
를 빠르게 살펴보겠습니다.
네임스페이스 SpatieSnapshotsDrivers; PHPUnitFrameworkAssert 사용; SpatieSnapshotsDriver 사용; SpatieSnapshotsExceptionsCantBeSerialized 사용; JsonDriver 클래스가 드라이버 구현 {public function serialize($data): string{if (!is_string($data)) {throw new CantBeSerialized('문자열만 json으로 직렬화할 수 있습니다.'); }return json_encode(json_decode($data), JSON_PRETTY_PRINT).PHP_EOL; }공용 함수 확장(): string{return 'json'; }공개 함수 일치($expected, $actual) { Assert::assertJsonStringEqualsJsonString($actual, $expected); } }
serialize
메소드는 스냅샷 파일에 기록될 문자열을 반환합니다. JsonDriver
에서는 스냅샷이 보기 좋게 인쇄되도록 json 문자열을 디코딩하고 다시 인코딩합니다.
json 스냅샷을 json 파일로 저장하려고 하므로 파일 확장자로 json
사용하겠습니다.
예상 데이터를 실제 데이터와 일치시킬 때 PHPUnit에 내장된 json 어설션을 사용하려고 하므로 특정 assertJsonStringEqualsJsonString
메서드를 호출하겠습니다.
드라이버는 assertMatchesSnapshot
의 두 번째 인수로 전달하여 사용할 수 있습니다.
$this->assertMatchesSnapshot($something->toYaml(), new MyYamlDriver());
지속적 통합에서 테스트를 실행할 때 스냅샷 생성을 비활성화할 수 있습니다.
--without-creating-snapshots
매개변수를 사용하거나 CREATE_SNAPSHOTS
환경 변수를 false
로 설정하면 스냅샷이 없으면 PHPUnit이 실패합니다.
> ./vendor/bin/phpunit -d --스냅샷 생성 없이 1) 예제테스트::test_it_matches_a_string 스냅샷 "ExampleTest__test_it_matches_a_string__1.txt"가 존재하지 않습니다. `CREATE_SNAPSHOTS=false` 환경 변수 또는 PHPUnit CLI 인수의 `-d --no-create-snapshots`를 제거하여 자동으로 생성할 수 있습니다.
Paratest와 같은 도구나 Laravel의 php artisan test --parallel
명령을 사용하여 테스트를 병렬로 실행하려면 환경 변수를 사용해야 합니다.
> CREATE_SNAPSHOTS=false php artisan 테스트 --parallel 1) 예제테스트::test_it_matches_a_string 스냅샷 "ExampleTest__test_it_matches_a_string__1.txt"가 존재하지 않습니다. `CREATE_SNAPSHOTS=false` 환경 변수 또는 PHPUnit CLI 인수의 `-d --no-create-snapshots`를 제거하여 자동으로 생성할 수 있습니다.
Windows 사용자는 .gitattributes
에서 줄 끝을 구성해야 합니다.
# 테스트에 사용되는 스냅샷은 직렬화된 데이터를 보유하며 해당 줄 끝은 변경되지 않은 상태로 유지되어야 합니다tests/**/__snapshots__/** 바이너리
최근 변경된 사항에 대한 자세한 내용은 CHANGELOG를 참조하세요.
작곡가 테스트
자세한 내용은 CONTRIBUTING을 참조하세요.
보안 관련 버그를 발견한 경우 이슈 트래커를 사용하는 대신 [email protected]로 메일을 보내주세요.
이 패키지를 무료로 사용할 수 있지만, 귀하의 프로덕션 환경에 적용된다면 귀하가 사용하고 있는 패키지를 언급하면서 고향에서 엽서를 보내주시면 감사하겠습니다.
주소는 Spatie, Kruikstraat 22, 2018 Antwerp, Belgium입니다.
우리는 받은 모든 엽서를 회사 웹사이트에 게시합니다.
세바스티안 드 데이네
알렉스 밴더비스트
모든 기여자
MIT 라이센스(MIT). 자세한 내용은 라이센스 파일을 참조하십시오.