>백엔드 개발 >PHP 튜토리얼 >PHP 마스터 | 모의 객체 테스트 소개

PHP 마스터 | 모의 객체 테스트 소개

William Shakespeare
William Shakespeare원래의
2025-02-26 11:27:11730검색

PHP Master | An Introduction to Mock Object Testing

시뮬레이션 된 객체 유닛 테스트의 핵심 사항

모의 개체는 실제 객체를 대체하고 실제 객체의 실행중인 동작을 시뮬레이션하기 위해 단위 테스트에 사용되는 대체물입니다. 객체 시뮬레이션은 객체의 종속성이 아직 구현되지 않았거나 시뮬레이션하기 어려운 요소에 의존 할 때 유용합니다.

테스트에서 모의 ​​객체를 생성하고 시스템에 의존성을 만족시키기 위해 시스템에 주입하여 개발자가 비즈니스 논리를 작성하기 시작할 수 있습니다.
    수제 모의 객체는 처음에 사용할 수 있지만 테스트 요구 사항이 더욱 복잡해지면 실제 모의 프레임 워크가 필요할 수 있습니다. 시뮬레이션 프레임 워크는 시간을 절약하고 더 깨끗한 코드를 생성 할 수 있습니다.
  • PHPUNIT의 시뮬레이션 프레임 워크는 테스트를위한 모의 개체를 만드는 데 사용할 수있는 도구입니다. 이 프로세스에는 시뮬레이션 할 객체를 식별하고 시뮬레이션 할 메소드를 정의하며 매개 변수 및 리턴 값을 지정하는 것이 포함됩니다.
  • 시뮬레이션 된 객체는 주로 테스트중인 시스템을 분리하기 위해 단위 테스트에 사용됩니다. 복잡한 실제 객체의 실행 동작을 시뮬레이션하고 응용 프로그램의 특정 모듈이 다른 모듈과 어떻게 상호 작용하는지 테스트하는 데 매우 유용합니다.
  • 개발 팀의 일원 인 경우 코드는 일반적으로 팀원이 작성한 코드에 따라 다릅니다. 그러나 현재 코드를 사용할 수 없으면 팀원이 아직 글쓰기가 끝나지 않았습니까? 또는 필요한 코드에 설정하기 어려운 다른 외부 종속성이 필요한 경우 어떻게해야합니까? 제어 할 수없는 다른 요인으로 인해 코드를 테스트 할 수 없다면 어떻게해야합니까? 팀이 끝나기를 기다리거나 모든 것이 준비되기를 기다리고 있습니까? 물론! 이 기사에서는이 종속성 문제를 해결하기 위해 코드를 작성하는 방법을 설명합니다. 이상적으로는 단위 테스트에 대한 배경 지식이 필요하며, Sitepoint에서 Michelle Saver가 작성한 단위 테스트에 대한 훌륭한 입문 기사가 이미 있습니다. 이 기사에는 필요하지 않지만 자동화 된 데이터베이스 테스트에 대한 다른 기사를 확인하십시오.
  • 시뮬레이션 된 물체의 케이스
  • 당신이 추측했듯이, 조롱하는 물건은 소개에서 언급 한 까다로운 상황을 해결할 수 있습니다. 그러나 모의 물체는 무엇입니까? Mock Object는 실제 객체의 실제 구현을 대체하는 대체 객체입니다. 왜 실제 개체 대신 대체 물체를 원하십니까? 모의 객체는 테스트 케이스에서 실제 객체의 실행 동작을 시뮬레이션하기 위해 단위 테스트에 사용됩니다. 그것들을 사용하면 구현중인 객체의 기능을 쉽게 테스트 할 수 있습니다. 모의 개체를 사용할 때 유용한 상황은 다음과 같습니다.
    1. 객체의 하나 이상의 종속성의 실제 구현은 아직 구현되지 않았습니다. 귀하의 작업이 데이터베이스에서 일부 데이터를 처리하는 것이라고 가정합니다. 객체 또는 데이터 저장소에 대한 일부 형태의 데이터 액세스를 호출 할 수 있지만 데이터베이스가 아직 설정되지 않은 경우 어떻게해야합니까? 데이터를 사용할 수있는 데이터가 없거나 (너무 많은 시간이 발생했는지) 또는 데이터베이스가 아직 작성되지 않은 코드가 있으면 어떻게됩니까? 데이터 액세스 개체 시뮬레이션 사전 정의 된 값을 반환하여 실제 데이터 액세스 개체를 시뮬레이션합니다. 이로 인해 데이터베이스 설정, 데이터 찾기 또는 데이터베이스를 쿼리하는 코드를 작성하는 부담이 절약됩니다.

    2. 객체의 종속성의 실제 구현은 시뮬레이션하기 어려운 요소에 따라 다릅니다. Facebook 게시물의 좋아요와 의견을 매일 세고 싶다고 가정 해 봅시다. 데이터는 어디서 얻습니까? Facebook 개발자 계정이 새롭습니다. 죄송합니다, 당신은 여전히 ​​친구가 없습니다! 좋아요와 댓글을 어떻게 시뮬레이션 할 것인가? 객체를 시뮬레이션하면 동료에게 문제를 일으키는 것보다 일부 게시물을 좋아하거나 댓글을 달 수 있습니다. 하루에 데이터를 표시하려면 시간 프레임으로 이러한 모든 작업을 어떻게 시뮬레이션합니까? 월간은 어떻습니까? 상상할 수없는 일이 발생하면 Facebook이 현재 다운되면 어떻게해야합니까? Mock Object는 Facebook 라이브러리 인 척하고 필요한 데이터를 반환 할 수 있습니다. 당신은 내가 당신의 작업을 수행하기 위해 방금 언급 한 문제를 겪을 필요가 없습니다.

    3. 실제로 시뮬레이션 객체의

    이제 우리는 모의 개체가 무엇인지 알았으므로 몇 가지 실제 예를 살펴 보겠습니다. Facebook 게시물에 대한 좋아요 및 의견을 계산하는 것과 같이 앞에서 언급 한 간단한 기능을 구현합니다. 우리는 객체의 호출 방법과 반환 값이 무엇인지에 대한 기대치를 정의하기 위해 다음 단위 테스트부터 시작합니다. 이 테스트를 실행하면 결과가 실패합니다. 아직 아무것도 구현하지 않았기 때문에 예상됩니다! 이제 서비스 구현을 작성해 봅시다. 물론 첫 번째 단계는 Facebook에서 데이터를 가져 오는 것입니다. 먼저 해보겠습니다. 이 테스트는 Facebook 객체가 비어 있기 때문에 실패합니다. Facebook 응용 프로그램 ID 등을 사용하여 실제 인스턴스를 작성하여 실제 구현을 삽입 할 수 있습니다. 우리는 그렇게하는 것이 당신이 당면한 과제의 고통에서 벗어날 수 있다는 것을 알고 있습니다. 모의 물체를 주입하여 이것을 피할 수 있습니다! Mock Objects (적어도 우리의 경우)를 사용하는 방법은 get () 메소드가있는 클래스를 만들고 모의 값을 반환하는 것입니다. 이것은 실제로 우리의 고객이 실제 객체의 구현을 실제로 조롱 당할 때 부름을 부르는 것이라고 생각해야합니다.

    이제 모의 클래스가 있으므로 인스턴스를 인스턴스화하고 그것을 사용할 수 있도록 statusservice에 주입합시다. 그러나 먼저 Setter를 사용하여 Facebook 라이브러리와 함께 사용하기 위해 StatusService를 업데이트하십시오.

    Mock Facebook 라이브러리 주입 지금 :
    <code class="language-php"><?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);
        }
    
    }</code>
    테스트는 여전히 실패하지만 적어도 우리는 더 이상 비 객체에서 메소드를 호출하는 것에 대한 오류를받지 않습니다. 더 중요한 것은이 의존성을 충족시켜야 할 필요성을 해결했다는 것입니다. 이제 지정된 작업에 대한 비즈니스 로직을 작성하고 테스트를 통과 할 수 있습니다.

    한 단계 더 나아가십시오 : 시뮬레이션 프레임 워크
    <code class="language-php"><?php
    class StatuService
    {
        private $facebook;
    
        public function getAnalytics($id, $from, $to) {
            $post = $this->facebook->get($id);
        }
    }</code>
    를 사용하십시오 처음 시작할 때 수제 모의 물체를 사용할 수 있지만, 내가 발견 한 것처럼, 당신의 요구가 더 복잡해지면 실제 모의 프레임 워크를 사용해야 할 수도 있습니다. 이 기사에서는 PhPunit과 함께 제공되는 모의 프레임 워크를 사용하는 방법을 보여 드리겠습니다. 내 경험상 수동으로 작성된 모의 개체를 사용하는 것과 비교하여 모의 프레임 워크를 사용하면 몇 가지 이점이 있습니다.

    당신은 게으르다. 나는 많은 추상적 인 방법으로 추상 클래스를 다룰 때 특히 사실을 알게됩니다. 초록 클래스 나 인터페이스의 일부 방법을 시뮬레이션 할 수 있습니다. 이 작업을 수동으로 수행하면 이러한 모든 방법을 수동으로 구현해야합니다. 일부 타이핑 작업을 저장하고 유형 프롬프트를 준비합니다. 클리너 코드를 쓸 수 있습니다. 가독성이 여기서 핵심입니다. 프레임 워크 기반 시뮬레이션은 시뮬레이션이 테스트에 작성되었으므로 테스트를보다 쉽게 ​​이해할 수 있도록합니다. 다른 곳에 쓰여진 자체 쓰기 시뮬레이션을보기 위해 아래로 스크롤하거나 파일 사이를 스크롤하거나 전환 할 필요가 없습니다. Mock Objects를 여러 번 호출하고 다른 결과를 얻으려면 어떻게해야합니까? 프레임 워크 기반 시뮬레이션을 사용하여이를 수행하는 데 필요한 IF-ELSE 보일러 플레이트 코드는 이미 잘 캡슐화되었습니다. 따라서 이해하기가 더 쉽습니다.

    phpunit

    를 사용한 시뮬레이션 프레임 워크 이제 phpunit을 사용한 시뮬레이션 프레임 워크에 초점을 맞추겠습니다. 단계는 실제로 매우 직관적이며 일단 파악하면 두 번째 특성이됩니다. 이 섹션에서는 PhPunit의 시뮬레이션 프레임 워크를 사용하여 예제의 경우 모의 개체를 만듭니다. 그러나이 작업을 수행하기 전에 수제 모의 개체를 사용하는 테스트에서 코드 줄을 주석 또는 삭제하십시오. 우리는 통과 할 수 있도록 먼저 실패해야합니다. 나중에 새로운 시뮬레이션 구현을 주입합니다.

      phpunit을 실행할 때 테스트가 실패했는지 확인하십시오. 이제 객체를 수동으로 시뮬레이션 할 수있는 방법과 호출하려는 방법에 대해 생각해보십시오. 우리는 무엇을 했습니까?
    • 첫 번째 단계는 시뮬레이션 할 객체를 식별하는 것입니다. 위의 분석 예제 기능에서 Facebook 라이브러리를 시뮬레이션했습니다. 우리는 첫 단계에서와 같은 일을하고 있습니다.

    이제 클래스를 조롱 할 클래스를 정의 했으므로 클래스의 조롱 방법을 알아야하며 방법이 존재하는 경우 매개 변수와 리턴 값을 지정합니다. 대부분의 경우 내가 사용하는 기본 템플릿은 대략 다음과 같습니다. 메소드가 호출되는 횟수를 지정합니다 (필수).

    메소드 이름 (필수)을 지정합니다.

    메소드가 기대하는 매개 변수 (선택 사항)를 지정합니다.

    리턴 값 (선택 사항)을 지정하십시오
    <code class="language-php"><?php
    class StatusServiceTest extends PHPUnit_Framework_TestCase
    {
        // test here
    }
    
    class MockFacebookLibrary
    {
        public function get($id) {
            return array(
                // mock return from Facebook here
            );
        }
    }</code>

    지금 언급 한 단계를 샘플 테스트에 적용해 봅시다.
      <code class="language-php"><?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);
          }
      
      }</code>
      우리가 Mock Facebook 객체를 다시 만든 후에 다시 서비스에 다시 주입하십시오 : .

      이제 테스트를 다시 통과해야합니다. 축하해요! 모의 물체로 테스트를 시작했습니다! 바라건대, 당신은 미래의 종속성에서 당신이 겪는 장애물을보다 효과적으로 프로그램 할 수 있기를 바랍니다.

      <code class="language-php"><?php
      class StatuService
      {
          private $facebook;
      
          public function getAnalytics($id, $from, $to) {
              $post = $this->facebook->get($id);
          }
      }</code>
      Fotolia의 사진

      (모의 객체 테스트에 대한 FAQ 섹션은 여기에 추가되어야합니다. 여기에는 컨텐츠가 입력 텍스트의 FAQ 부분과 일치하지만 복제를 피하기 위해 약간 다시 작성하고 연마해야합니다)

위 내용은 PHP 마스터 | 모의 객체 테스트 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.