public function buildClassTests($class)
{
$methods = $class->xpath("method");
$tests = array();
foreach($methods as $method)
{
$tests[] = build_Tests($method);
}
$filename = $class["name"] . ".tests.php";
$test_file = join("",$tests);
file_put_contents($filename, $test_file);
}
private function build_tests($method)
{
$tests = $method->xpath("test");
$test_name = $method["name"];
foreach($test as $test)
{
$test_name = $test["name"];
$parameters = $test->xpath("cons_parameter");
foreach($parameter as $param)
{
if($param["value"] == "DEFAULT")
break;
$cons_p[] = """.$param["value"] .".";
}
$parameters = $test->xpath("parameter");
$p = array();
foreach($parameter as $param)
{
if($param["value"] == "DEFAULT")
break;
$p[] = """ . $param["value"] .""";
}
$p = join(",",$p);
$assert = array();
$exception = "Exception";
$exceptionReturn = "FAIL";
$assertions = $test->xpath("assertion");
/* 현재 코드는 하나의 어썰션만 지원하지만, 때론 하나 이상이 더 유용할것이다*/
foreach($assertions as $a)
{
switch($a["type"])
{
case "return":
$assert[] = sprintf("%11s%20s%4s%20s","","$result",$a["cond"],$a["value"]);
break;
case "exception":
$exception = $a["exception"];
$exceptionReturn = "PASS";
}
}
if($exception != "Exception")
$exep = " catch (Exception $e) \n".
" {\n".
" return FAIL;".
" \n}\n";
else
$exep = "";
if($assert)
{
$assert_block = " if(\n". join("&&\n",$assert) . " )\n";
$assert_block = " return PASS\n";
$assert_block = " else\n";
$assert_block = " return FAIL\n";
}
$code = <<$name($p);
$assert
}
catch ($exception \$e)
{
return $exceptionReturn
}
$excp
CODE;
$tests[] = $code;
}
return join("\n\n\n",$tests);
}
이것은 간단한 테스트 케이스이다. 만약에 메소드가 true를 리턴하면 통과하고,
만약에 false나 예외를 리턴하면 실패 하게 된다.
function test_test4()
{
try
{
$class = new testClass();
$result = $class->execute("12345");
if($result == true)
return PASS;
else
return FAIL;
}
catch (Exception $e)
{
return FAIL;
}
여기에 코드 실행프로그램(code runner)을 기재 하기 위해(for listing) 생성된 코드가 있다:
";
else
{
echo "$i Test $test FAIL
";
$fail = true;
break;
}
}
if($fail)
echo "SOME TESTS FAILED";
else
echo "ALL TESTS PASSED";
?>
이전 글 : 데이터로서의 코드: PHP의 Reflection(1)
다음 글 : lighttpd 웹서버
최신 콘텐츠