Тесты БДД в помощью PHPUnit


Никто в моей команде знает, как писать тесты БДД, поэтому я начал писать, и это довольно хорошо работает. Я думаю, что настало время, чтобы улучшить качество кода.

Это содержит много дублирующегося кода и неиспользуемых функций:

<?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);
            }
        }
    }

}

Единственная ссылка, что я использую для БДД это здесь, так что есть большой потенциал для совершенствования этого кода.



824
2
задан 7 декабря 2011 в 01:12 Источник Поделиться
Комментарии
1 ответ

Ваш оператор будет выполняться до тех пор, пока они не найдут оператор break. Имея фигурные скобки {} определяет только блок кода, и не имеет никакого эффекта на выходе из корпуса.

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

Один выше выводит надпись "по умолчанию OneTwoAlso" принимая во внимание следующие выводит "один".

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

Я думаю, что ваше тестирование станет чище, если вы не пользовались потом и когда методов. Обычно я создаю массив тестовых данных и ожидаемых результатов и петли над ними. Как вы пишете тест для исид способ я бы что-то вроде этого:

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');
}
}

Вы могли бы делать более умные вещи, чем это. Также Тест не всегда будет так просто. Обычно я нахожу, что я издевался над объектами и гарантируя, что они вам назвали правильно.

2
ответ дан 11 декабря 2011 в 09:12 Источник Поделиться