문제

나는 확신의 혜택을 단위의 테스트,그리고 시작하고 싶 개념을 적용하는 대형 기존 codebase written in PHP.의 10%이 코드가 객체-지향합니다.

나는 보았다에 여러 장치 테스트 프레임워크(이 라이브러리,SimpleTest 및 phpt).그러나지 않았을 발견한 예에 대한 이러한 테스트 절차 상의 코드입니다.최선을 위한 프레임워크 내의 상황은 없는 예의 단위 테스트 PHP 를 사용하여 non-OOP 코드?

도움이 되었습니까?

해결책

절차 적 PHP를 단위 테스트 할 수 있습니다. 코드가 HTML과 혼합되어 있다면 운이 좋지 않습니다.

응용 프로그램 또는 수락 테스트 수준에서 절차 적 PHP는 아마도 슈퍼 글로벌의 값에 따라 다릅니다 ($_POST, $_GET, $_COOKIE, 템플릿 파일을 포함시키고 출력을 뱉어 동작을 결정하고 끝납니다.

응용 프로그램 수준 테스트를 수행하려면 SuperGlobal 값을 설정할 수 있습니다. 출력 버퍼를 시작합니다 (화면을 범람하는 것을 막기 위해 많은 HTML을 유지하려면); 페이지를 호출하십시오. 버퍼 내부의 물건에 대해 주장; 마지막에 버퍼를 버립니다. 따라서 다음과 같은 일을 할 수 있습니다.

public function setUp()
{
    if (isset($_POST['foo'])) {
        unset($_POST['foo']);
    }
}

public function testSomeKindOfAcceptanceTest()
{
    $_POST['foo'] = 'bar';
    ob_start();
    include('fileToTest.php');
    $output = ob_get_flush();
    $this->assertContains($someExpectedString, $output);
}

많은 포함을 가진 엄청난 "프레임 워크"에도 이러한 종류의 테스트는 응용 프로그램 수준 기능이 작동하는지 여부를 알려줍니다. 데이터베이스 커넥터가 이전보다 여전히 작동하고 더 좋아 보인다고 확신하더라도 버튼을 클릭하고 여전히 볼 수 있기 때문에 코드 개선을 시작하면 코드를 개선하기 시작하면 정말 중요합니다. 데이터베이스를 통해 로그인 및 로그 아웃.

낮은 레벨에서는 가변 범위와 기능이 부작용으로 작동하는지 (참 또는 거짓 리턴) 또는 결과를 직접 반환하는지 여부에 따라 약간의 변형이 있습니다.

변수는 함수 사이의 매개 변수 또는 배열로 명시 적으로 전달됩니까? 아니면 변수가 여러 곳에 설정되어 있으며, 글로벌로 암시 적으로 전달됩니까? 그것이 (좋은) 명시 적 사례 인 경우, (1) 함수를 고정하는 파일을 포함하여 함수를 테스트 한 다음 (2) 함수 테스트 값을 직접 공급하고 (3) 출력을 캡처하고 이에 대한 주장을 할 수 있습니다. 글로벌을 사용하는 경우 테스트 간의 모든 글로벌을 신중하게 무효화하려면 ($ _post 예제에서와 같이) 조심해야합니다. 또한 많은 글로벌을 밀고 당기는 함수를 다룰 때 테스트를 매우 작게 유지하는 것이 도움이됩니다 (5-10 라인, 1-2 라인, 1-2 어서).

또 다른 기본 문제는 함수가 출력을 반환하거나 전달 된 매개 변수를 변경하여 대신 참/거짓을 반환하여 작동하는지 여부입니다. 첫 번째 경우 테스트가 더 쉽지만 두 경우 모두가 가능합니다.

// assuming you required the file of interest at the top of the test file
public function testShouldConcatenateTwoStringsAndReturnResult()
{
  $stringOne = 'foo';
  $stringTwo = 'bar';
  $expectedOutput = 'foobar';
  $output = myCustomCatFunction($stringOne, $stringTwo);
  $this->assertEquals($expectedOutput, $output);
}

나쁜 경우, 코드가 부작용으로 작동하고 참 또는 거짓을 반환하는 경우에도 여전히 쉽게 테스트 할 수 있습니다.

/* suppose your cat function stupidly 
 * overwrites the first parameter
 * with the result of concatenation, 
 * as an admittedly contrived example 
 */
public function testShouldConcatenateTwoStringsAndReturnTrue()
    {
      $stringOne = 'foo';
      $stringTwo = 'bar';
      $expectedOutput = 'foobar';
      $output = myCustomCatFunction($stringOne, $stringTwo);
      $this->assertTrue($output);
      $this->Equals($expectedOutput, $stringOne);
    }

도움이 되었기를 바랍니다.

다른 팁

어떤 단위 테스트를 잘 하고,무엇을 사용해야 합니다 그들은 있는 때는 조각의 코드는 일부를 제공의 번호를 입력하고,당신이 얻을 것으로 예상하는 일부의 수 출력한다.는 아이디어는 때,당신은 기능을 추가,나중에 실행할 수 있는 테스트를 확인 그것은 아직도 실행하고 오래된 기능을 동일한 방법입니다.

그래서,당신은 절차 상의 코드 베이스,당신은 이것을 달성할 수 있는 호출의 기능에서 시험 방법

require 'my-libraries.php';
class SomeTest extends SomeBaseTestFromSomeFramework {
    public function testSetup() {
        $this->assertTrue(true);
    }

    public function testMyFunction() {
        $output = my_function('foo',3);

        $this->assertEquals('expected output',$output);
    }
}

이릭 PHP 코드 베이스가 자주 당신의 라이브러리 코드를 방해 실행하는 테스트 프레임워크로 여러분의 코드 기반 시험 프레임워크를 많이 해야와 관련된 코드를 설정하는 애플리케이션 환경에서 웹브라우저(세션 글로벌 공유 변수,etc.).을 언젠가는 받을 포함할 수 있습니다 당신의 라이브러리 코드와 실행 먼지 간단한 테스트(testSetup 능 위).

코드가 없는 함수와의 시리즈 PHP 파일을 출력하는 HTML 페이지로,당신은 종류의 운입니다.귀하의 코드를 분리할 수 없습으로 개별 단위,즉 단위 테스트하지 않을 많이 사용 될 수 있습니다.당신은 더 나을 것을 보내는 시간"에서 승인 테스트"수준 제품 셀레늄Watir.이러한 것입자에게 자동화 된 브라우저 확인하고 다음 페이지에 대한 내용으로는 특정 위치에서 형태입니다.

Nonop 코드를 사용하여 테스트 클래스에 포함 시키려고 노력할 수 있습니다.

require_once 'your_non_oop_file.php' # Contains fct_to_test()

PHPUNIT를 사용하면 테스트 기능을 정의합니다.

testfct_to_test() {
   assertEquals( result_expected, fct_to_test(), 'Fail with fct_to_test' );
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top