1

以下のコードでは、フィードバック フォームは、名前、メール ID、コメントなどの 3 つのフィールドに入力を受け取ります。そのため、phpunit test を使用して検証をテストする必要があります。これについて助けてください。私はphp構文にまったく慣れていません。Phunit テストでレポートを提供するために検証をアサートおよびチェックする方法。

  if($_POST){
     //echo $sRc;
     //print "<pre>";print_r($_POST);exit;
     require_once(CLASSPATH."/utility.class.php");
     $oUtility      = new utility();
     $sRc           = base64_decode($_COOKIE['Rc_cf']);
     $sEmail            = trim($_POST['emailid']);
     $scomment      = trim($_POST['comment']);
     $syour_name        = trim($_POST['your_name']);
     $sOthereSubject = trim($_POST['subject']);

     $sName         = trim(strip_tags($oUtility->nonxmlcharreplace($_REQUEST['your_name'])));
     $sEmail            = trim(strip_tags($oUtility->nonxmlcharreplace($_REQUEST['emailid'])));
     $sComments     = trim(strip_tags($oUtility->nonxmlcharreplace($_REQUEST['comment'])));

     $iError=0;
     $sErrorMsg="";

     if(strlen($sName)==0){
        $sErrorMsg="Your name cannot be blank.";
        $iError=1;
    }     else if(strlen($sEmail)==0){
        $sErrorMsg="Email address cannot be blank.";
        $iError=1;
    }else if(strlen($sEmail)>0){

        $iValid = $oUtility->isValidEmail($sEmail);
        if($iValid!=1){
             $sErrorMsg="Please enter valid email address.";    
             $iError=1;
         }      
      }
      if(empty($sComments) && strlen($sErrorMsg)==0){
         $sErrorMsg="Comment cannot be blank.";
         $iError=1;
     }

     if(strlen($sErrorMsg)==0){
         require_once(CLASSPATH."feedback.class.php");      
         $oFeedback     = new feedback();

         if($iError==0){
            $aParameters=Array('name'=>$sName,'email'=>$sEmail,'comments'=>$sComments,'cdate'=>'now()',     'is_active'=>1,'cdate'=>'now()','udate'=>'now()');
            $iRes = $oFeedback->addUpdFeedback($aParameters);
            $sInserMsg = 1;
            $sEmail = $sName = $scomment='';

         }

      } 
4

1 に答える 1

1

メソッドが長すぎるため、テストが難しいはずです。テストをビルドするには、次の 3 つの手順に従う必要があります。

  1. コンテキストをセットアップします (ここでは、いくつかの入力データを定義します)
  2. 関数を実行します (ここでは、中間に if ステートメントがある大きな関数)
  3. 期待される動作が発生することをアサートします (ここでは、検証が失敗または合格し、大きな関数で他のことが発生します)

単体テストの目標は、小さなこと、単体のものをテストすることです。$_POSTしたがって、テストコンテキストで別の入力を定義するのが難しいため、テストを書くのは非常に困難です。関数がさまざまなことを行うため、これも困難です。

そのため、大きな関数を小さな関数に分割し、この関数を 1 つずつテストする必要があります。

たとえば、次のようなものです。

$errorsArray = $this->validation($_POST);
if (count($errorsArray) == 0) {
     require_once(CLASSPATH."feedback.class.php");      
     $oFeedback     = new feedback();
     $aParameters=Array('name'=>$sName,'email'=>$sEmail,'comments'=>$sComments,'cdate'=>'now()',     'is_active'=>1,'cdate'=>'now()','udate'=>'now()');
     $iRes = $oFeedback->addUpdFeedback($aParameters);
     $sInserMsg = 1;
     $sEmail = $sName = $
}

///

public static function validation($input)
{
    //Your validation here, return an array of error messages
}

次に、次のようないくつかのテスト ケースを作成する必要があります。

public function testValidationOk()
{
    $input = array('name' => 'John', 'email' => 'john@gmail.com');
    $errorsArray = MyClass::validation($input);
    assertCount(0, $errorsArray);
}

public function testValidationFailWithoutName()
{
    $input = array('name' => '', 'email' => 'john@gmail.com');
    $errorsArray = MyClass::validation($input);
    assertCount(1, $errorsArray);
}

public function testValidationFailWithInvalidEmail()
{
    $input = array('name' => 'John', 'email' => 'john.com');
    $errorsArray = MyClass::validation($input);
    assertCount(1, $errorsArray);
}

関数の残りの部分は、他のテスト ケースでテストされます。小さなメソッドは、テスト容易性、可読性、および保守容易性の鍵です。

于 2013-06-11T14:29:17.123 に答える