>백엔드 개발 >PHP 튜토리얼 >PHPUnit 테스트를 위한 개인 속성 및 방법의 기능 분석

PHPUnit 테스트를 위한 개인 속성 및 방법의 기능 분석

不言
不言원래의
2018-06-12 16:43:421437검색

이 글에서는 주로 Private 속성과 메소드를 테스트하기 위한 PHPUnit의 기능을 소개하며, PHPUnit을 사용하여 Private 속성과 메소드를 테스트할 때 관련 운영 기술과 주의사항을 예제 형식으로 자세히 분석합니다. 이 기사에서는

개인 속성 및 메서드 함수를 테스트하는 PHPUnit에 대해 설명합니다. 참고용으로 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

1. 테스트 클래스의 전용 메서드:

class Sample
{
  private $a = 0;
  private function run()
  {
    echo $a;
  }
}

위는 단순히 클래스 포함, 전용 변수 및 전용 변수를 작성합니다. 방법. protected 메서드와 private 메서드의 경우 public 메서드처럼 직접 호출할 수 없기 때문에 단일 테스트를 위해 phpunit을 사용할 때 매우 불편합니다. 특히 클래스가 외부 세계에 소수의 인터페이스만 제공하고 다수의 private 메서드를 사용하는 경우에는 더욱 그렇습니다. 내부적으로.

보호된 메소드의 경우 테스트를 위해 상속을 사용하는 것이 권장되므로 여기서는 자세히 설명하지 않겠습니다. 비공개 메소드를 테스트하려면 PHP의 리플렉션 메커니즘을 사용하는 것이 좋습니다. 더 이상 고민하지 않고 코드는 다음과 같습니다.

class testSample()
{
    $method = new ReflectionMethod('Sample', 'run');
    $method->setAccessible(true); //将run方法从private变成类似于public的权限
    $method->invoke(new Sample()); //调用run方法
}

run 메소드가 다음과 같이 정적인 경우:

private static function run()
{
  echo 'run is a private static function';
}

Invoke 함수는 다음과 같이 작성할 수도 있습니다.

$method->invoke(null); //只有静态方法可以不必传类的实例化

실행에 여전히 Pass 매개변수가 필요한 경우(예:

private function run($x, $y)
{
  return $x + $y;
}

) 그런 다음 테스트 코드를 다음과 같이 변경할 수 있습니다.

$method->invokeArgs(new Sample(), array(1, 2));
//array中依次写入要传的参数。执行结果返回3

[참고]: 프라이빗 메서드를 테스트하려면 리플렉션을 사용하는 것이 좋지만 , setAccessible 함수는 php5.3.2 버전입니다. 향후에만 지원됩니다(>=5.3.2).

2. 비공개 속성 가져오기/설정

비공개 메서드에 대해 이야기한 후 다음을 살펴보겠습니다. 여전히 Sample 클래스를 예로 들어 Sample 클래스에서 $a 개인 속성의 값을 가져오거나 설정하려면 다음 방법을 사용할 수 있습니다.

public function testPrivateProperty()
{
  $reflectedClass = new ReflectionClass('Sample');
  $reflectedProperty = $reflectedClass->getProperty('a');
  $reflectedProperty->setAccessible(true);
  $reflectedProperty->getValue(); //获取$a的值
  $reflectedProperty->setValue(123); //给$a赋值:$a = 123;
}

The 위의 방법은 정적 속성에 대해 여전히 유효합니다.

이제 프라이빗 메서드나 속성 테스트가 순식간에 쉬워진 것 같은 느낌이 듭니다. N 첨부 파일: PHPUNIT 비공개 메소드 테스트(영어)

이 기사는 UNTESTable 코드 테스트 시리즈의 일부입니다:

Prives 테스트

  • 싱글톤을 사용하는 코드 테스트

  • 정적 메소드 스터빙

  • 하드 코딩된 종속성을 스터빙

  • 아니요, 그런 개인에게는 아닙니다. 도움이 필요하다면 이 책이 도움이 될 수 있습니다.

  • 단위 테스트에 관해 이야기할 때 제가 계속해서 받는 질문 중 하나는 다음과 같습니다.

"객체의 개인 속성과 메서드를 어떻게 테스트하나요?"

Foo 클래스가 있다고 가정하겠습니다:

<?php
class Foo
{
  private $bar = &#39;baz&#39;;
  public function doSomething()
  {
    return $this->bar = $this->doSomethingPrivate();
  }
  private function doSomethingPrivate()
  {
    return &#39;blah&#39;;
  }
}
?>

보호 속성과 개인 속성과 메서드를 직접 테스트하는 방법을 알아보기 전에 다음을 살펴보겠습니다. 간접적으로 테스트할 수 있는 방법을 살펴보세요.

다음 테스트에서는 testDoSomething() 메서드를 호출하고 이 메서드는 doSomethingPrivate() 메서드를 호출합니다.

<?php
class FooTest extends PHPUnit_Framework_TestCase
{
  /**
   * @covers Foo::doSomething
   * @covers Foo::doSomethingPrivate
   */
  public function testDoSomething()
  {
    $foo = new Foo;
    $this->assertEquals(&#39;blah&#39;, $foo->doSomething());
  }
}
?>

위 테스트에서는 testDoSomething( )이 testDothingSomePrivate일 때만 올바르게 작동한다고 가정합니다. ()는 올바르게 작동합니다. 이는 testDoSomethingPrivate()을 간접적으로 테스트했음을 의미합니다. 이 접근 방식의 문제점은 테스트가 실패할 때 실패의 근본 원인이 testDoSomething() 또는 testDoSomethingPrivate(에 있을 수 있다는 것입니다. ) 이로 인해 테스트의 가치가 떨어집니다.

PHPUnit은 PHPUnit_Framework_Assert::readAttribute() 메서드를 통해 보호 및 비공개 속성 읽기를 지원합니다. PHPUnit_Framework_TestCase::assertAttributeEquals()와 같은 편의 래퍼는 보호 및 비공개 속성에 대한 주장을 표현하기 위해 존재합니다.

PHP 5.3.2에는 Reflection API를 통해 보호된 메서드와 비공개 메서드를 호출할 수 있는 ReflectionMethod::setAccessible() 메서드가 도입되었습니다.

<?php
class FooTest extends PHPUnit_Framework_TestCase
{
  public function testPrivateAttribute()
  {
    $this->assertAttributeEquals(
     &#39;baz&#39;, /* expected value */
     &#39;bar&#39;, /* attribute name */
     new Foo /* object     */
    );
  }
}
?>

위 테스트에서는 실패할 때 testDoSomethingPrivate( )을 직접 테스트합니다. 우리는 근본 원인을 어디서 찾을 수 있는지 즉시 알 수 있습니다.

저는 "Pragmatic Unit Testing"이라는 책에서 쓴 Dave Thomas와 Andy Hunt의 의견에 동의합니다.

"일반적으로 캡슐화를 깨고 싶지는 않습니다. 테스트를 위해(또는 엄마가 "개인 정보를 노출하지 마세요!"라고 말씀하셨듯이) 대부분의 경우 숨겨진 중요한 기능이 있는 경우 클래스를 테스트할 수 있습니다. 비공개 또는 보호된 액세스 뒤에는 다른 클래스가 빠져나오기 위해 고군분투하고 있다는 경고 신호일 수 있습니다."

그래서: 보호된 속성과 비공개 속성 및 메서드에 대한 테스트가 가능하다고 해서 이것이 "좋은 것"입니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 추천:

PHP와 redis에서 구현된 비관적 잠금 메커니즘 분석

PHP의 변수 함수 사용 요약

위 내용은 PHPUnit 테스트를 위한 개인 속성 및 방법의 기능 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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