테스트 실패로 선언됨... 약간 더 짧은 단어를 원하고 너무 마음에 들면 -db- 부분을 생략할 수 있을 것 같습니다.
Test-DB-Acle은 데이터베이스 계층에 대한 쉽고 간결한 테스트 작성을 용이하게 하는 PHP 라이브러리입니다.
테스트 작성은 개발자에게 가능한 한 쉬워야 하고, 다른 개발자도 쉽게 읽을 수 있어야 한다는 것이 내 신념입니다.
이는 테스트의 모든 테스트 데이터가 테스트 시나리오에만 관련되어야 함을 의미합니다. 그러나 대부분의 데이터베이스 테이블에는 테스트에 인지적 잡음을 발생시키는 더미 데이터를 입력해야 하는 null이 아닌 열이 있습니다.
Test-Db-Acle은 개발자의 이러한 부담을 덜어주는 것을 목표로 합니다. 테스트 프레임워크는 데이터베이스 계층 클래스가 Doctrine, 저장 프로시저 또는 일반 SQL과 같은 ORM을 사용하는 경우 데이터베이스 계층 클래스가 작동하는 방식에 대해 어떠한 가정도 하지 않습니다. 원칙은 항상 동일하며 어느 시점에서는 코드가 DB 테이블의 데이터와 상호 작용합니다. , 우리는 이것을 테스트해야 합니다.
작곡가를 통한 설치
데이터베이스에서 외래 키 검사를 비활성화합니다.
null이 아닌 열을 자동으로 처리합니다.
값이 db 테이블에 있다고 주장할 때 mysql의 날짜/시간 열을 자동으로 자릅니다. 삽입된 타임스탬프에 유용합니다(Sqlite에서는 이 열을 지정해야 함).
거의 모든 구성 요소를 맞춤형 품종으로 교환 및 교체할 수 있습니다.
현재 Mysql과 Sqlite를 지원합니다.
프레임워크에 구애받지 않으며 예를 들어 ORM이 사용되고 다른 단위 테스트 프레임워크에 쉽게 적응할 수 있어야 하는지 가정하지 않습니다.
현재 지원되는 데이터베이스는 MySql(및 확장 MariaDB) 및 Sqlite입니다.
아키텍처에서는 추가 데이터베이스를 추가할 수 있어야 합니다.
이 라이브러리는 PHPUnit과 함께 즉시 사용할 수 있습니다. 제공된 특성을 사용하고 'assertEquals' 메소드를 동등한 메소드에 위임함으로써 다른 테스트 프레임워크와 함께 사용하는 것이 상당히 쉬울 것입니다(예를 들어 SimpleTest에서는 'assertEqual'이라는 것을 기억합니다).
PHP 5.4를 사용하고 있고 특성을 사용해도 괜찮다면 간단한 TestDbAclePhpUnitAbstractTestCase와 TestDbAclePhpUnitTraitsDatabaseHelperTrait를 제공했습니다.
좋아, 정말로 공평하게 말하자면, 데이터베이스 계층을 테스트하는 것은 비용이 많이 들고 테스트가 너무 느려지므로 가능한 경우 데이터베이스에 대한 모든 종속성을 조롱해야 합니다. 그러나 때로는 이 작업을 수행해야 하는 경우도 있습니다. 잘 구조화된 애플리케이션에서는 이 작업이 최소한으로 유지될 수 있기를 바랍니다.
데이터베이스 테스트에 도움이 되는 다양한 도구와 접근 방식(예: DBUnit 또는 단위 테스트에서 팩토리 메서드 사용)이 있으며 각각 고유한 장점이 있습니다. 이 접근 방식은 다음과 같은 이유로 저에게 효과적입니다.
null 열이나 외래 키 제약 조건에 대해 걱정할 필요가 없습니다.
테스트를 위해 최소한의 데이터 세트를 제공합니다.
테스트 위에서 그리드 형식으로 테스트 데이터를 볼 수 있으며 db에서 데이터를 어설션할 때 다시 볼 수 있습니다.
그래서 나는 내 자신의 솔루션을 설정했습니다.
###그럼 어떻게 작동하고 어떻게 생겼나요? 예를 보여주세요!###
아이디어는 "파이프로 구분된 값" 텍스트 문자열을 사용하는 것입니다. 이를 PSV라고 부르겠습니다(CSV에서와 같이 파이프 사용). 다음과 같이 테스트 픽스처를 설정합니다.
(PSV의 형식은 뛰어난 Behat BDD 프레임워크(https://github.com/Behat/Behat)에서 사용되는 형식과 매우 유사합니다.)
$dbTablesToSetup="[table_name]id |date |name |value |dependent_table_id10 |2001-01-01 |foo |900 |60[dependent_table]id |name20 |Bar60 |Baz";//원하지 않으면 이것을 사용하십시오 제공된 특성 또는 추상 테스트 케이스를 사용하십시오.$testDbAcle = TestDbAcleTestDbAcle::create($pdo);$testDbAcle->runCommand(new TestDbAcleCommandsSetupTablesCommand($dbTablesToSetup));//TestDbAclePhpUnitAbstractTestCase에서 테스트 케이스를 확장했거나 TestDbAclePhpUnitTraitsDatabaseHelperTrait:$this->setupTables($dbTablesToSetup);
프레임워크 자체는 테이블에서 NULL 가능하지 않은 열을 알고 기본값을 삽입합니다... 실제로 table_name 테이블에 모두 Null이 아닌 30개의 열이 있다고 가정해 보겠습니다....
또한 백그라운드에서 진행되는 다양한 외래 키 제약 조건이 있을 수 있습니다. Test-Db-Acle은 외래 키 검사를 일시적으로 비활성화하므로 이에 대해 걱정할 필요가 없으며 테스트 데이터를 삽입하는 순서도 없습니다.
###실제 테스트는 어떻습니까......?### 먼저 PHP5.4를 사용하는 경우 특성 버전을 사용할 수 있습니다.
클래스 exampleTest는 PHPUnit_Framework_TestCase를 확장하고 TestDbAclePhpUnitAbstractTestCaseInterface를 구현합니다. {TestDbAclePhpUnitTraitsDatabaseHelperTrait 사용; /** * 이 메소드는 구현되어야 하며, 데이터베이스 픽스쳐에서 사용될 PDO 객체를 반환해야 합니다. * * @return Pdo */public 함수 ProvidePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); } /* * 예제 테스트 */public 함수 test_AddressService() {$this->setupTables(" [주소] address_id |회사 1 |나 3 |당신 [사용자] user_id |이름 10 |John 20 |Mary "); $this->setAutoIncrement('주소', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [주소] address_id |회사 1 |나 3 |당신 100 |그들 [사용자] user_id |이름 10 |John 20 |Mary ", array(), "모든 것이 작동합니다"); } }
특성을 사용하지 않는 경우 AbstractTestCase
사용할 수 있지만 이 경우 자체 기본 테스트 클래스를 사용할 수 없습니다.
클래스 exampleTest는 TestDbAclePhpUnitAbstractTestCase를 확장합니다. { 보호된 $addressService;function Setup(){parent::Setup();$this->addressService = new ServicesAddressService(); }/** * 이 메소드는 구현되어야 하며, 데이터베이스 픽스쳐에서 사용될 PDO 객체를 반환해야 합니다. * * @return Pdo */public 함수 ProvidePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); }함수 test_AddressService() {$this->setupTables(" [주소] address_id |회사 1 |나 3 |당신 [사용자] user_id |이름 10 |John 20 |Mary "); $this->setAutoIncrement('주소', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [주소] address_id |회사 1 |나 3 |당신 100 |그들 [사용자] user_id |이름 10 |John 20 |Mary ", array(), "모든 것이 작동합니다"); } }
물론 여기에는 ServicesAddressService가 존재하지 않으며(테스트 우선입니다. 그렇죠?) 예제는 매우 간단합니다.
실제 생활에서는 getPdo 메소드를 프로젝트의 공통 기본 테스트 클래스에 넣을 것이며 여기서와는 상당히 다르게 얻을 수 있습니다. 그러나 이것은 하나의 예 입니다 .
보시다시피 setupTables는 한 번에 여러 테이블을 설정할 수 있으며, AssertTableStateContains는 동시에 다양한 테이블의 상태를 확인할 수도 있습니다.
setupTables가 지정된 열보다 더 많은 열이 있는 테이블을 설정하는 방법과 유사하게, AssertTableStateContains는 지정된 열의 값만 비교하고 어설션합니다.
Test-Db-Acle을 설치하는 가장 쉬운 방법은 작곡가를 사용하는 것입니다(자세한 내용은 여기에서 확인하세요: http://packagist.org ). 비록 패키지를 폴더에 압축을 풀고 자동 로드를 활성화할 수도 있지만 이 접근 방식을 사용하는 것이 좋습니다. 원하는 형식으로 수동으로 생성합니다(psr-0 명명 규칙을 사용함).
작곡가와 함께 사용하려면 작곡가.json 파일에 다음을 추가하세요.
"require": { "test-db-acle/test-db-acle" : "dev-master" }, "repositories" : [ { "type": "git", "url": "https://github.com/malteriesch/test-db-acle.git" } ]
원하는 경우 https://packagist.org/packages/test-db-acle/test-db-acle을 사용할 수도 있습니다.
기여(및 비판)는 환영입니다...!
###Test-Db-Acle 테스트를 실행하는 방법### 테스트를 실행하려면 선택한 MySql 서버에 빈 데이터베이스를 만들고, 테스트/Functional/config.php.dist를 테스트/에 복사해야 합니다. Functional/config.php를 선택하고 데이터베이스 세부정보를 입력하세요. 그런 다음 모든 테스트가 실행되기를 바랍니다. (데이터베이스는 실제로 기능적 연기 테스트에만 필요합니다)
PSV 구문
AbstractTestCase
TestDbAcle 확장 및 사용자 정의
변경 내역