다른 테스트 방법
먼저 수행중인 작업을 정의하십시오. 단위 테스트 또는 통합 테스트 . 하나의 클래스 만 테스트하므로 레이어 수는 단위 테스트와 관련이 없습니다. 나머지는 당신이 조롱합니다. 통합 테스트의 경우 여러 계층을 테스트해야합니다. 적절한 단위 테스트가있는 경우 통합 테스트를 너무 복잡하지 않게하는 것이 요령입니다.
단위 테스트가 양호하면 통합 테스트를 수행 할 때 모든 세부 사항 테스트를 반복 할 필요가 없습니다.
우리가 사용하는 용어는 비트 플랫폼에 따라 다르지만 거의 모든 테스트 / 개발 플랫폼에서 찾을 수 있습니다.
적용 예
사용하는 기술에 따라 이름이 다를 수 있지만이를 예로 사용하겠습니다.
Product, ProductsController 모델과 제품이 포함 된 HTML 테이블을 생성하는 인덱스 뷰가있는 간단한 CRUD 애플리케이션이있는 경우 :
응용 프로그램의 최종 결과는 활성화 된 모든 제품 목록이있는 HTML 테이블을 표시합니다.
단위 테스트
모델
매우 쉽게 테스트 할 수있는 모델입니다. 다른 방법이 있습니다. 우리는 비품을 사용합니다. 이것이 바로 "가짜 데이터 세트"라고 생각합니다. 따라서 각 테스트를 실행하기 전에 테이블을 만들고 원래 데이터를 넣습니다. 대부분의 플랫폼에는이를위한 방법이 있습니다. 예를 들어, 테스트 클래스에서 각 테스트 전에 실행되는 setUp () 메소드.
그런 다음 testGetAllActive 제품 과 같은 테스트를 실행 합니다.
따라서 테스트 데이터베이스로 직접 테스트합니다. 우리는 데이터 소스를 조롱하지 않습니다. 우리는 항상 동일하게 만듭니다. 이를 통해 예를 들어 데이터베이스의 새 버전으로 테스트 할 수 있으며 쿼리 문제가 발생합니다.
현실 세계에서 항상 100 % 단일 책임을지는 것은 아닙니다 . 이 작업을 더 잘하려면 모의 데이터 소스를 사용할 수 있습니다. 기존 기술을 테스트하는 것과 같은 느낌을주는 우리 (ORM 사용)를 위해. 또한 테스트는 훨씬 더 복잡해지고 실제로 쿼리를 테스트하지는 않습니다. 그래서 우리는 이것을 이렇게 유지합니다.
하드 코딩 된 데이터는 조명기에 별도로 저장됩니다. 따라서 조명기는 create table 문을 사용하고 사용하는 레코드를 삽입하는 SQL 파일과 같습니다. 많은 레코드로 테스트해야 할 필요가없는 한 작은 크기로 유지합니다.
class ProductModel {
public function getAllActive() {
return $this->find('all', array('conditions' => array('active' => 1)));
}
}
제어 장치
컨트롤러는 모델을 테스트하지 않기 때문에 더 많은 작업이 필요합니다. 우리가하는 일은 모델을 조롱하는 것입니다. 의미 : 우리는 테스트 : 레코드 목록을 반환 해야하는 index () 메소드.
따라서 모델 메소드 getAllActive ()를 조롱하고 고정 된 데이터를 추가합니다 (예 : 두 개의 레코드). 이제 컨트롤러가 뷰로 보내는 데이터를 테스트하고이 두 레코드를 실제로 다시 가져 오는지 비교합니다.
function testProductIndexLoggedIn() {
$this->setLoggedIn();
$this->ProductsController->mock('ProductModel', 'index', function(return array(your records) ));
$result=$this->ProductsController->index();
$this->assertEquals(2, count($result['products']));
}
충분 해. 테스트를 어렵게 만들기 때문에 컨트롤러에 기능을 거의 추가하지 않습니다. 그러나 물론 코드가 항상 있습니다. 예를 들어, 다음과 같은 요구 사항을 테스트합니다. 로그인 한 경우에만이 두 레코드를 표시하십시오.
따라서 컨트롤러에는 일반적으로 하나의 모의와 하드 코딩 된 작은 데이터가 필요합니다. 로그인 시스템의 경우 다른 시스템 일 수 있습니다. 테스트에는 setLoggedIn () 도우미 메소드가 있습니다. 로그인이나 로그인없이 간단하게 테스트 할 수 있습니다.
class ProductsController {
public function index() {
if($this->loggedIn()) {
$this->set('products', $this->ProductModel->getAllActive());
}
}
}
조회수
뷰 테스트는 어렵다. 먼저 반복되는 논리를 분리합니다. 우리는 그것을 도우미에 넣고 엄격한 수업을 테스트합니다. 우리는 항상 같은 결과를 기대합니다. 예를 들어 generateHtmlTableFromArray ()입니다.
그런 다음 프로젝트 별 뷰가 있습니다. 우리는 그것들을 테스트하지 않습니다. 그것들을 단위 테스트하는 것은 실제로 바람직하지 않습니다. 통합 테스트를 위해 보관합니다. 많은 코드를 뷰로 가져 왔기 때문에 여기에서 위험이 줄어 듭니다.
테스트를 시작하면 대부분의 프로젝트에 유용하지 않은 HTML을 변경할 때마다 테스트를 변경해야합니다.
echo $this->tableHelper->generateHtmlTableFromArray($products);
통합 테스트
여기 플랫폼에 따라 사용자 스토리 등으로 작업 할 수 있습니다. Selenium 과 같은 웹 기반 일 수 있습니다. . 또는 기타 유사한 솔루션 .
일반적으로 비품과 함께 데이터베이스를로드하고 어떤 데이터를 사용할 수 있는지 확인합니다. 완전한 통합 테스트를 위해 일반적으로 매우 전 세계적인 요구 사항을 사용합니다. 따라서 : 제품을 활성으로 설정 한 다음 제품을 사용할 수 있는지 확인하십시오.
올바른 필드를 사용할 수 있는지 여부와 같이 모든 것을 다시 테스트하지는 않습니다. 여기서는 더 큰 요구 사항을 테스트합니다. 컨트롤러 나 뷰에서 테스트를 복제하고 싶지 않기 때문에. 응용 프로그램의 핵심 부분이거나 핵심적인 부분이거나 보안상의 이유로 (암호를 확인할 수 없음) 해당 항목이 올바른지 확인하기 위해 추가합니다.
하드 코딩 된 데이터는 조명기에 저장됩니다.
function testIntegrationProductIndexLoggedIn() {
$this->setLoggedIn();
$result=$this->request('products/index');
$expected='<table';
$this->assertContains($expected, $result);
// Some content from the fixture record
$expected='<td>Product 1 name</td>';
$this->assertContains($expected, $result);
}