> 백엔드 개발 > PHP 튜토리얼 > 조롱으로 테스트 종속성을 조롱하십시오

조롱으로 테스트 종속성을 조롱하십시오

William Shakespeare
풀어 주다: 2025-02-20 09:07:09
원래의
153명이 탐색했습니다.

Mock your Test Dependencies with Mockery 모든 사람 이이 작업을 수행하는 것은 아니지만 응용 프로그램을 테스트하는 것은 개발자가되는 가장 기본적인 부분 중 하나입니다. 단위 테스트는 가장 일반적인 테스트입니다. 단위 테스트를 사용하면 클래스가 예상대로 정확히 실행되는지 확인할 수 있습니다. 때로는 응용 프로그램에서 타사 서비스를 사용하고 있으며 단위 테스트를 위해 모든 것을 설정하기가 어렵습니다. 시뮬레이션이 시작될 때입니다.

키 포인트

조롱은 단위 테스트에서 실제 객체를 대체하는 과정으로, 종속성 주입에 크게 의존하는 응용 프로그램을 테스트 할 때 특히 유용합니다. 조롱은 Pádraic Brady가 만든 라이브러리로 단위 테스트에서 물체를 조롱하는 데 사용될 수 있으며 PhPunit의 기본 조롱 기능에 대한 대안을 제공합니다. 조롱을 통해 개발자는 수신 할 메소드 호출 수, 수신 할 매개 변수 및 반환 할 값에 대한 기대치를 정의 할 수 있으므로 단위 테스트에서 종속성을 분리하는 강력한 도구입니다.

PhPunit은 이미 물체를 조롱 할 수 있지만 Mockery는 다른 클래스의 영향을받지 않도록하려는 개발자에게 유연성과 편의성을 제공합니다.
  • 시뮬레이션이란 무엇입니까?
  • 객체를 조롱하는 것은 단위 테스트에서 실제 객체를 대체하는 대체 객체를 만드는 것 이상입니다. 응용 프로그램이 의존성 주입에 크게 의존하는 경우 조롱은 실행 가능한 방법입니다.
  • 개체를 조롱하는 데 몇 가지 이유가있을 수 있습니다
  • 단위 테스트를 수행 할 때 클래스를 분리하는 것이 가장 좋습니다. 다른 클래스 나 서비스가 장치 테스트를 방해하기를 원하지 않습니다.
  • 객체는 아직 존재하지 않습니다. 먼저 테스트를 작성한 다음 최종 객체를 작성할 수 있습니다.
  • 모의 개체는 일반적으로 테스트를 위해 전체 데이터베이스를 준비하는 것보다 빠릅니다.
  • 단위 테스트를 실행할 때 PHPUNIT를 사용할 수 있습니다. PHPUnit에는 문서에 표시된대로 몇 가지 기본 시뮬레이션 기능이 제공됩니다. Jeune Asuncion이 작성한이 기사에서는 시뮬레이션 및 PHPUnit의 시뮬레이션 기능에 대한 자세한 내용을 읽을 수 있습니다.
이 기사에서는 Pádraic Brady가 만든 도서관 조롱으로 뛰어들 것입니다. 현재 존재하지 않는 기상 서비스를 주입 할 온도 클래스를 만들 것입니다.

설정 프로젝트를 설정하여 시작하겠습니다. 다음 내용이 포함 된 Composer.json 파일로 시작합니다. 이것은 우리가 조롱과 phpunit을 보장 할 것입니다.

우리는 또한 phpunit.xml 라는 phpunit 구성 파일을 만듭니다 이 리스너를 정의하는 것이 중요합니다. 리스너가 없으면 , 및
  • 메소드가 잘못 사용되면 오류가 발생하지 않습니다. 이것은 나중에 자세히 설명합니다.
  • 나는 또한 2 개의 디렉토리를 만들었습니다. SRC 디렉토리는 클래스를 유지하는 데 사용되며 테스트 디렉토리는 테스트를 저장하는 데 사용됩니다. SRC 디렉토리에서 Path SitepointWeather를 만들었습니다.
  • 우리는 먼저 weatherserviceinterface를 만듭니다. 존재하지 않는 기상 서비스는이 인터페이스를 구현합니다. 이 경우 우리는 섭씨의 온도를 제공하는 하나의 방법 만 제공합니다.

    따라서, 우리는 섭씨 온도를 제공하는 서비스가 있습니다. 나는 화씨를 얻고 싶다. 이를 위해 온도 서비스라는 새로운 클래스를 만들었습니다. 이 서비스는 기상 서비스를 주입합니다. 이 외에도 섭씨를 화씨로 변환하는 방법도 정의합니다.
    <code>{
        "name": "sitepoint/weather",
        "license": "MIT",
        "type": "project",
        "require": {
            "php": ">=5.3.3"
        },
        "autoload": {
            "psr-0": { "": "src/" }
        },
        "require-dev": {
            "phpunit/phpunit": "4.1.*",
            "mockery/mockery": "0.9.*"
        }
    }</code>
    로그인 후 복사
    로그인 후 복사

    단위 테스트를 만듭니다 우리는 단위 테스트를 설정할 준비가되었습니다. Tests 디렉토리에서 온도 서비스 클래스를 만듭니다. 이 클래스에서 우리는 화씨 방법을 테스트 할 메소드

    를 만듭니다.
    <phpunit>
        <testsuite name="SitePoint Weather">
            <directory>./tests</directory>
        </testsuite>
        <listeners>
            <listener class="\Mockery\Adapter\Phpunit\TestListener"
                      file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
        </listeners>
    </phpunit>
    로그인 후 복사
    로그인 후 복사
    이 방법에서 수행해야 할 첫 번째 단계는 새로운 온도 서비스 객체를 만드는 것입니다. 우리가 그렇게하는 것처럼, 우리의 생성자는 weatherserviceinterface를 구현하는 객체를 요청합니다. 우리는 아직 그런 물건이 없기 때문에 (우리는 그것을 원하지 않습니다), 우리는 조롱을 사용하여 우리를 위해 모의 개체를 만들 것입니다. 완료 후 메소드가 어떻게 보이는지 봅시다.

    먼저 모의 개체를 만듭니다. 우리는 조롱에 우리가 조롱하고 싶은 조롱을 말한다. 두 번째 단계는이 모의 개체에서 호출 될 방법을 설명하는 것입니다. 메소드에서 호출 될 메소드의 이름을 정의합니다.

    우리는이 방법이 호출되는 횟수를 정의합니다. 우리는 testGetTempFahrenheit(),

    를 사용할 수 있습니다. 이 경우 한 번만 호출 될 것으로 예상됩니다. 호출되지 않거나 과도한 통화가 호출되면 단위 테스트가 실패합니다.

    마지막으로,
    namespace SitePoint\Weather;
    
    interface WeatherServiceInterface
    {
        /**
         * 返回摄氏温度
         *
         * @return float
         */
        public function getTempCelsius();
    }
    로그인 후 복사
    메소드에서 반환 할 값을 정의합니다. 이 경우 25로 돌아옵니다. 조롱에는 또한 <🎜 🎜>,

    및 <🎜 shouldReceive()와 같은 반환 메소드가 있습니다. 그것이 당신이 기대하는 것이라면, 조롱은 예외를 던질 수 있습니다.

    이제 온도 서비스 객체를 만들고 평소와 같이 테스트 할 수있는 모의 개체가 있습니다. 섭씨 25도는 화씨 77도이므로 <🎜 🎜> 방법에서 77을 받는지 확인합니다.

    <<> 루트 디렉토리에서 once()를 실행하면 phpunit에서 녹색 표시등이 생겨 모든 것이 완벽하다는 것을 나타냅니다. twice() 고급 사용량 <🎜 🎜> 위의 예는 매우 간단합니다. 매개 변수가없고 간단한 호출 만 있습니다. 일을 더 복잡하게 만들어 봅시다. times(X) 우리의 기상 서비스가 정확한 시간에 온도를 얻을 수있는 방법이 있다고 가정합니다. 현재 WeatherserviceInterface에 다음 방법을 추가합니다.

    우리는 평균 온도가 오후 0시에서 6시 사이인지 알고 싶습니다. 이를 위해 온도 서비스에서 평균 온도를 계산하기위한 새로운 방법을 만듭니다. 이를 위해 Weatherservice에서 7 개의 온도를 검색하고 평균을 계산합니다. andReturn()

    <code>{
        "name": "sitepoint/weather",
        "license": "MIT",
        "type": "project",
        "require": {
            "php": ">=5.3.3"
        },
        "autoload": {
            "psr-0": { "": "src/" }
        },
        "require-dev": {
            "phpunit/phpunit": "4.1.*",
            "mockery/mockery": "0.9.*"
        }
    }</code>
    로그인 후 복사
    로그인 후 복사
    테스트 방법을 살펴 보겠습니다.

    우리는 인터페이스를 다시 시뮬레이션하고 호출 할 메소드를 정의합니다. 다음 으로이 방법이 호출되는 횟수를 정의합니다. 우리는 이전 예에서 를 사용했으며 이제
    <phpunit>
        <testsuite name="SitePoint Weather">
            <directory>./tests</directory>
        </testsuite>
        <listeners>
            <listener class="\Mockery\Adapter\Phpunit\TestListener"
                      file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
        </listeners>
    </phpunit>
    로그인 후 복사
    로그인 후 복사
    를 사용 하여이 방법을 7 번이라고 기대합니다. 메소드가 정확히 7 번 호출되지 않으면 테스트가 실패합니다. phpUnit.xml 구성 파일에서 리스너를 정의하지 않으면 이에 대한 알림을받지 못합니다.

    다음으로 once() 메소드를 정의합니다. 메소드에서는 예상되는 매개 변수를 정의 할 수 있습니다. 이 경우 7 시간이 걸립니다. times(7) 마지막으로, 우리는

    메소드가 있습니다. 이 경우 7 개의 반환 값을 나타냅니다. 더 많은 리턴 값을 정의하면 마지막으로 사용 가능한 반환 값이 매번 반복됩니다.

    물론, 조롱은 더 많은 일을 할 수 있습니다. 전체 안내서 및 문서를 보려면 Github 페이지를 확인하는 것이 좋습니다. with() 위의 프로젝트 코드에 관심이 있으시면이 github 페이지를 확인할 수 있습니다. with

    결론 PhPunit을 사용하면 이미 객체를 조롱 할 수 있습니다. 그러나 위의 예에서 설명한대로 조롱을 사용할 수도 있습니다. 수업을 단위 테스트하고 다른 클래스가 테스트에 영향을 미치는 것을 원하지 않는 경우, 조롱은 쉽게 도움이 될 수 있습니다. 기능 테스트를 실제로하고 싶다면 실제 테스트를 통합 할 수 있는지 확인하는 것이 좋습니다. 현재 PHPUNIT 시뮬레이션을 사용하고 있으며 조롱으로 전환하는 것을 고려하고 있습니까? 후속 게시물에서 더 큰 조롱 예제를보고 싶습니까? 아래 의견에 알려주십시오.

    조롱 및 테스트 종속성에 대한 FAQ (FAQ) 조롱은 무엇이며 PHP 테스트에서 중요한 이유는 무엇입니까? andReturn() 조롱은 단위 테스트를위한 강력하고 유연한 PHP 모의 객체 프레임 워크입니다. PHPUnit의 모의 객체 기능에 대한 직접적인 대안으로 설계되었습니다. 조롱을 통해 개발자는 테스트 된 코드를 분리하고 복잡한 객체의 동작을 시뮬레이션하는 테스트 스탠드 인을 생성 할 수 있습니다. 테스트중인 코드가 외부 요인이나 상태에 의존하지 않도록하기 때문에 단위 테스트에 중요합니다.

    내 PHP 프로젝트에 조롱을 설치하고 설정하는 방법은 무엇입니까?

    조롱을 설치하려면 Composer, PHP 종속성 관리자가 있어야합니다. 명령을 실행하여 조롱을 설치할 수 있습니다. 설치 후 테스트 찢어짐 방법에서

    를 호출하여 모의 개체를 정리하여 테스트 파일에 모킹을 설정할 수 있습니다.

    조롱을 사용하여 모의 개체를 만드는 방법은 무엇입니까?

    조롱에서 모의 ​​물체를 만드는 것은 간단합니다. 메소드를 사용하여 모의 객체를 만들 수 있습니다. 예를 들어,

    는 myclass에 대한 모의 개체를 만듭니다.

    조롱의 기대를 정의하는 방법은 무엇입니까?

    조롱에서는 메소드를 조롱하여 객체를 조롱하여 기대치를 정의합니다. 예를 들어,

    이 코드는 "mymethod"가 한 번 호출 될 것으로 예상하고 "조롱 된 가치"를 반환 해야하는 Mockery를 지시합니다.

    조롱의 시뮬레이션과 스터브의 차이점은 무엇입니까? $mock->shouldReceive('myMethod')->once()->andReturn('mocked value'); 조롱에서, 모의는 우리가 원하는 것을 설정할 수있는 대상이며, 스터브는 사전 프로그래밍 된 응답을 갖는 모의 객체입니다. 응답이 유일한 중요한 경우, 스터브가 일반적으로 사용되며 상호 작용 자체를 테스트 할 때는 모의가 사용됩니다.

    개인 방법을 테스트하기 위해 조롱을 사용하는 방법은 무엇입니까?

    캡슐화 원리를 위반하기 때문에 개인 메소드를 직접 테스트하는 것이 좋습니다. 그러나 원한다면 조롱 및 개인 방법을 허용하기 위해 조롱에

    메소드를 사용할 수 있습니다.

    조롱에서 생성자 매개 변수를 처리하는 방법은 무엇입니까?

    시뮬레이션하려는 클래스에 인수가있는 생성자가있는 경우 메소드로 배열로 전달할 수 있습니다. 예를 들어,

    는 $ arg1과 $ arg2를 MyClass의 생성자에게 전달합니다.

    정적 메소드를 시뮬레이션하기 위해 조롱을 사용하는 방법은 무엇입니까?

    Mockery는 접두사를 사용하여 정적 메소드를 시뮬레이션하는 메소드를 제공합니다. 예를 들어, shouldAllowMockingProtectedMethods()는 MyClass의 정적 메소드의 원하는 설정을 설정하는 데 사용할 수있는 모의 객체를 만듭니다.

    모든 기대가 조롱에서 충족되는지 확인하는 방법은 무엇입니까?

    테스트 분해 방법에서

    메소드를 사용하여 모든 기대가 충족되었는지 확인할 수 있습니다. 기대치가 충족되지 않으면 조롱은 예외를 던질 것입니다.

    조롱의 예외를 처리하는 방법은 무엇입니까? mock() $mock = Mockery::mock('MyClass', [$arg1, $arg2]); 메소드를 사용하여 모의 객체를 설정하여 예외를 던질 수 있습니다. 예를 들어,

    는 "mymethod"가 호출되면 예외가 발생합니다.

  • 위 내용은 조롱으로 테스트 종속성을 조롱하십시오의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    저자별 최신 기사
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿