절차 형 PHP를 단위 테스트 할 수 있습니다. 문제가 없습니다. 그리고 코드가 HTML과 섞여 있다면 확실히 운이 나지 않을 것입니다.
응용 프로그램 또는 수락 테스트 레벨에서 절차 용 PHP는 동작을 결정하기위한 수퍼 전역 변수 ($_POST, $_GET, $_COOKIE
등)의 값에 의존하고 템플릿 파일을 포함하고 출력을 내뱉어 끝냅니다.
응용 프로그램 수준 테스트를 수행하려면 수퍼 전역 값을 설정할 수 있습니다. 출력 버퍼를 시작하십시오 (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);
}
비록 당신이 작동 여부 응용 프로그램 수준의 기능을 가지고있는 경우, 시험의 종류를 알려줍니다 포함이 많은 거대한 "프레임 워크"를 참조하십시오. 이것은 코드 개선을 시작할 때 매우 중요합니다. 왜냐하면 데이터베이스 커넥터가 여전히 작동하고 이전보다 훨씬 좋아 보이더라도 버튼을 클릭하여 볼 수 있습니다. 그렇습니다. 데이터베이스를 통한 로그인 및 로그 아웃.
하위 수준에서는 변수 범위 및 함수가 부작용 (true 또는 false 반환)으로 작동하는지 직접 결과를 반환하는지에 따라 사소한 차이가 있습니다.
변수가 함수 사이의 매개 변수 또는 매개 변수 배열로 명시 적으로 전달됩니까? 또는 변수가 여러 곳에서 설정되고 암시 적으로 전역 변수로 전달됩니까? 그것이 (좋은) 명백한 경우라면, (1) 함수를 포함하는 파일을 포함하여 함수를 단위 테스트하고, (2) 함수 테스트 값을 직접 입력하고, (3) 출력을 캡쳐하고 그것에 대해 어설트함으로써 함수를 단위 테스트 할 수 있습니다. 전역 변수를 사용하고 있다면 위의 $ _POST 예제와 같이 조심해서 모든 전역 변수를주의 깊게 무시해야합니다. 또한 많은 전역 변수를 밀고 당기는 함수를 처리 할 때 테스트를 매우 작게 유지하는 것이 특히 유용합니다 (5-10 행, 1-2 어설트).
또 다른 기본적인 문제는 함수가 출력을 반환하는지 또는 전달 된 매개 변수를 변경하여 true/false를 반환하는지 여부입니다. 첫 번째 경우, 시험은 쉽게, 그러나 다시, 그것은 두 경우 모두 가능 :
는
// 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);
}
코드가 부작용으로 작동 true 또는 false를 반환 나쁜 경우, 당신은 여전히 아주 쉽게 테스트 할 수 있습니다 :
/* 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);
}
희망이 있습니다.
테스트중인 코드가'exit;'문으로 흩어져있는 경우에는 좋지 않습니다. ( –
@ YarekT'exit' 또는'die' 문으로 코드가 흩어져있는 경우 테스트 할 수 없습니다. 예상 된 스크립트 종료를 처리하는 것은 예외를 throw하고 발생했을 때 사용자 정의 예외 유형을 무시할만큼 똑똑한 사용자 정의 예외 처리기를 등록하는 것입니다. 그런 다음 예상 된 예외가 발생했는지 테스트 할 수 있습니다 물론 물론 잘 설계된 응용 프로그램은 실제로 ' 어쨌든 부트 스트랩 단계 이후에 '종료'또는 '죽기'가 필요합니다. – rdlowrey