BDD-Tests in PHPUnit

  • Niemand in meinem Team kann BDD-Tests schreiben, also habe ich angefangen, einige zu schreiben, und es funktioniert gut. Ich denke, es ist an der Zeit, die Codequalität zu verbessern.

    Diese enthält eine Menge duplizierten Codes und nicht verwendete Funktionen:

     [pre> <?php
    require_once ('core/v3/engine.php');
    require_once 'PHPUnit/Extensions/Story/TestCase.php';
    
    class cHelperValidationSpec extends PHPUnit_Extensions_Story_TestCase {
    
        /**
         * Check all the output for the right cases
         * @scenario
         */
        public function specForJobId() {
            $this->given('For a mValue (mixedValue) and we want to validate if it is an integer')
                ->when('sJobId is a positive integer', 123)
                ->then('return of positive integer should be', 'TRUE')
                ->when('sJobId is a negative integer', -123)
                ->then('return of a negative integer should be', 'FALSE')
                ->when('sJobId is a float', 1.23)
                ->then('return of a float should be', 'FALSE')
                ->when('sJobId is a string containing only digits', '123')
                ->then('return of a string (containing only digits) should be', 'TRUE')
                ->when('sJobId is a string containing not only digits', '123abc-?')
                ->then('return of a string (containing not only digits) should be', 'TRUE');
        }
    
        public function runGiven(&$world, $action, $arguments) {
            switch($action) {
                case 'For a mValue (mixedValue) and we want to validate if it is an integer': {
                    $world['helper'] = new cHelperValidation();
                }
                break;
    
                default: {
                    return $this->notImplemented($action);
                }
            }
        }
    
        public function runWhen(&$world, $action, $arguments) {
            switch($action) {
                case 'sJobId is a positive integer': {}
                case 'sJobId is a negative integer': {}
                case 'sJobId is a float': {}
                case 'sJobId is a string containing only digits': {}
                case 'sJobId is a string containing not only digits': {}
                break;
    
                default: {
                    return $this->notImplemented($action);
                }
            }
        }
    
        public function runThen(&$world, $action, $arguments) {
            switch($action) {
                case 'return of positive integer should be': {
                    $this->assertEquals(TRUE, $world['helper']->isId(123));
                }
                case 'return of a negative integer should be': {
                    $this->assertEquals(FALSE, $world['helper']->isId(-123));
                }
                case 'return of a float should be': {
                    $this->assertEquals(FALSE, $world['helper']->isId(1.23));
                }
                case 'return of a string (containing only digits) should be': {
                    $this->assertEquals(TRUE, $world['helper']->isId('123'));
                }
                case 'return of a string (containing not only digits) should be': {
                    $this->assertEquals(FALSE, $world['helper']->isId('123abc-?'));
                }
                break;
                default: {
                    return $this->notImplemented($action);
                }
            }
        }
    
    }
     

    Die einzige Referenz, die ich für BDD verwende, ist hier . Es gibt also viel Potenzial, diesen Code zu verbessern.

    27 September 2015
    Jamal
1 answer
  • Ihre switch-Anweisungen werden durchlaufen, bis sie eine break-Anweisung finden. Die geschweiften Klammern {} definieren nur einen Codeblock und wirken sich nicht auf den Fall aus.

     switch (1)
    {
    case 1: {
       echo 'One';
    }
    case 2: {
       echo 'Two';
    }
    default: {
       echo 'Also default';
          }
    }
     

    Der obenstehende Ausdruck gibt "OneTwoAlso default" aus, der folgende Ausdruck "One".

     switch (1)
    {
    case 1:
       echo 'One';
       break;
    case 2:
       echo 'Two';
       break;
    default:
       echo 'Also default';
    }
     

    Ich denke Ihr Test wäre sauberer, wenn Sie die Methoden then und when nicht verwenden würden. Normalerweise erstelle ich ein Array von Testdaten und erwarteten Ergebnissen und durchlaufe diese. Während Sie den Test für die Methode isId schreiben, würde ich Folgendes haben:

     public function test_isID()
    {
       $object = new Object_That_You_Are_Testing();
    
       $tests = array(
          array('Data'            => 123,
                'Expected_Result' => true,
                'Test_Name'       => 'Positive Integer'),
          array('Data'            => -123,
                'Expected_Result' => false,
                'Test_Name'       => 'Negative Integer'));
    
       foreach ($tests as $test)
       {
          $this->assertEquals($test['Expected_Result'],
                              $object->isID($test['Data']),
                              $test['Test_Name'] . ' Failed');
       }
    }
     

    Sie könnten tue klügere Dinge als das. Auch ein Test wird nicht immer so einfach sein. Normalerweise stelle ich fest, dass ich Objekte verspottet habe, und sorge dafür, dass sie ordnungsgemäß aufgerufen werden.

    27 September 2015
    MastAlvaro Rodriguez