시뮬레이션 된 객체 유닛 테스트의 핵심 사항
모의 개체는 실제 객체를 대체하고 실제 객체의 실행중인 동작을 시뮬레이션하기 위해 단위 테스트에 사용되는 대체물입니다. 객체 시뮬레이션은 객체의 종속성이 아직 구현되지 않았거나 시뮬레이션하기 어려운 요소에 의존 할 때 유용합니다.
테스트에서 모의 객체를 생성하고 시스템에 의존성을 만족시키기 위해 시스템에 주입하여 개발자가 비즈니스 논리를 작성하기 시작할 수 있습니다.
수제 모의 객체는 처음에 사용할 수 있지만 테스트 요구 사항이 더욱 복잡해지면 실제 모의 프레임 워크가 필요할 수 있습니다. 시뮬레이션 프레임 워크는 시간을 절약하고 더 깨끗한 코드를 생성 할 수 있습니다. -
PHPUNIT의 시뮬레이션 프레임 워크는 테스트를위한 모의 개체를 만드는 데 사용할 수있는 도구입니다. 이 프로세스에는 시뮬레이션 할 객체를 식별하고 시뮬레이션 할 메소드를 정의하며 매개 변수 및 리턴 값을 지정하는 것이 포함됩니다.
시뮬레이션 된 객체는 주로 테스트중인 시스템을 분리하기 위해 단위 테스트에 사용됩니다. 복잡한 실제 객체의 실행 동작을 시뮬레이션하고 응용 프로그램의 특정 모듈이 다른 모듈과 어떻게 상호 작용하는지 테스트하는 데 매우 유용합니다. -
개발 팀의 일원 인 경우 코드는 일반적으로 팀원이 작성한 코드에 따라 다릅니다. 그러나 현재 코드를 사용할 수 없으면 팀원이 아직 글쓰기가 끝나지 않았습니까? 또는 필요한 코드에 설정하기 어려운 다른 외부 종속성이 필요한 경우 어떻게해야합니까? 제어 할 수없는 다른 요인으로 인해 코드를 테스트 할 수 없다면 어떻게해야합니까? 팀이 끝나기를 기다리거나 모든 것이 준비되기를 기다리고 있습니까? 물론! 이 기사에서는이 종속성 문제를 해결하기 위해 코드를 작성하는 방법을 설명합니다. 이상적으로는 단위 테스트에 대한 배경 지식이 필요하며, Sitepoint에서 Michelle Saver가 작성한 단위 테스트에 대한 훌륭한 입문 기사가 이미 있습니다. 이 기사에는 필요하지 않지만 자동화 된 데이터베이스 테스트에 대한 다른 기사를 확인하십시오. -
시뮬레이션 된 물체의 케이스
당신이 추측했듯이, 조롱하는 물건은 소개에서 언급 한 까다로운 상황을 해결할 수 있습니다. 그러나 모의 물체는 무엇입니까? Mock Object는 실제 객체의 실제 구현을 대체하는 대체 객체입니다. 왜 실제 개체 대신 대체 물체를 원하십니까? 모의 객체는 테스트 케이스에서 실제 객체의 실행 동작을 시뮬레이션하기 위해 단위 테스트에 사용됩니다. 그것들을 사용하면 구현중인 객체의 기능을 쉽게 테스트 할 수 있습니다. 모의 개체를 사용할 때 유용한 상황은 다음과 같습니다.
-
객체의 하나 이상의 종속성의 실제 구현은 아직 구현되지 않았습니다. 귀하의 작업이 데이터베이스에서 일부 데이터를 처리하는 것이라고 가정합니다. 객체 또는 데이터 저장소에 대한 일부 형태의 데이터 액세스를 호출 할 수 있지만 데이터베이스가 아직 설정되지 않은 경우 어떻게해야합니까? 데이터를 사용할 수있는 데이터가 없거나 (너무 많은 시간이 발생했는지) 또는 데이터베이스가 아직 작성되지 않은 코드가 있으면 어떻게됩니까? 데이터 액세스 개체 시뮬레이션 사전 정의 된 값을 반환하여 실제 데이터 액세스 개체를 시뮬레이션합니다. 이로 인해 데이터베이스 설정, 데이터 찾기 또는 데이터베이스를 쿼리하는 코드를 작성하는 부담이 절약됩니다.
-
객체의 종속성의 실제 구현은 시뮬레이션하기 어려운 요소에 따라 다릅니다. Facebook 게시물의 좋아요와 의견을 매일 세고 싶다고 가정 해 봅시다. 데이터는 어디서 얻습니까? Facebook 개발자 계정이 새롭습니다. 죄송합니다, 당신은 여전히 친구가 없습니다! 좋아요와 댓글을 어떻게 시뮬레이션 할 것인가? 객체를 시뮬레이션하면 동료에게 문제를 일으키는 것보다 일부 게시물을 좋아하거나 댓글을 달 수 있습니다. 하루에 데이터를 표시하려면 시간 프레임으로 이러한 모든 작업을 어떻게 시뮬레이션합니까? 월간은 어떻습니까? 상상할 수없는 일이 발생하면 Facebook이 현재 다운되면 어떻게해야합니까? Mock Object는 Facebook 라이브러리 인 척하고 필요한 데이터를 반환 할 수 있습니다. 당신은 내가 당신의 작업을 수행하기 위해 방금 언급 한 문제를 겪을 필요가 없습니다.
실제로 시뮬레이션 객체의
이제 우리는 모의 개체가 무엇인지 알았으므로 몇 가지 실제 예를 살펴 보겠습니다. Facebook 게시물에 대한 좋아요 및 의견을 계산하는 것과 같이 앞에서 언급 한 간단한 기능을 구현합니다. 우리는 객체의 호출 방법과 반환 값이 무엇인지에 대한 기대치를 정의하기 위해 다음 단위 테스트부터 시작합니다.
이 테스트를 실행하면 결과가 실패합니다. 아직 아무것도 구현하지 않았기 때문에 예상됩니다! 이제 서비스 구현을 작성해 봅시다. 물론 첫 번째 단계는 Facebook에서 데이터를 가져 오는 것입니다. 먼저 해보겠습니다.
이 테스트는 Facebook 객체가 비어 있기 때문에 실패합니다. Facebook 응용 프로그램 ID 등을 사용하여 실제 인스턴스를 작성하여 실제 구현을 삽입 할 수 있습니다. 우리는 그렇게하는 것이 당신이 당면한 과제의 고통에서 벗어날 수 있다는 것을 알고 있습니다. 모의 물체를 주입하여 이것을 피할 수 있습니다! Mock Objects (적어도 우리의 경우)를 사용하는 방법은 get () 메소드가있는 클래스를 만들고 모의 값을 반환하는 것입니다. 이것은 실제로 우리의 고객이 실제 객체의 구현을 실제로 조롱 당할 때 부름을 부르는 것이라고 생각해야합니다.
이제 모의 클래스가 있으므로 인스턴스를 인스턴스화하고 그것을 사용할 수 있도록 statusservice에 주입합시다. 그러나 먼저 Setter를 사용하여 Facebook 라이브러리와 함께 사용하기 위해 StatusService를 업데이트하십시오.
Mock Facebook 라이브러리 주입 지금 : <?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
private $statusService;
private $fbID = 1;
public function setUp() {
$this->statusService = new StatusService();
}
public function testGetAnalytics() {
$analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02"));
$this->assertEquals(array(
"2012-01-01" => array(
"comments" => 5,
"likes" => 3,
),
"2012-01-02" => array(
"comments" => 5,
"likes" => 3,
),
"2012-01-03" => array(
"comments" => 5,
"likes" => 3,
),
"2012-01-04" => array(
"comments" => 5,
"likes" => 3,
),
"2012-01-05" => array(
"comments" => 5,
"likes" => 3,
)
), $analytics);
}
}
로그인 후 복사
로그인 후 복사
테스트는 여전히 실패하지만 적어도 우리는 더 이상 비 객체에서 메소드를 호출하는 것에 대한 오류를받지 않습니다. 더 중요한 것은이 의존성을 충족시켜야 할 필요성을 해결했다는 것입니다. 이제 지정된 작업에 대한 비즈니스 로직을 작성하고 테스트를 통과 할 수 있습니다.
<🎜 🎜> <<> 한 단계 더 나아가십시오 : 시뮬레이션 프레임 워크 <?php
class StatuService
{
private $facebook;
public function getAnalytics($id, $from, $to) {
$post = $this->facebook->get($id);
}
}
로그인 후 복사
로그인 후 복사
<🎜 🎜>를 사용하십시오
위 내용은 PHP 마스터 | 모의 객체 테스트 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!