Как предотвратить перезагрузку Fixtures между тестами с CakePHP и PHPUnit - PullRequest
2 голосов
/ 14 декабря 2011

Как предотвратить тестовый пример CakePHP 2.0, который расширяет CakeTestCase (использует PHPUnit), от перезагрузки приборов между тестами?

Справочная информация: Существует набор интеграционных тестов, которые мы написали для CakePHP 2.0 с использованием PHPUnit. Мы расширили класс тестовых примеров до стандарта CakeTestCase. Для этого набора тестов у нас есть несколько настроек для заполнения данных из базы данных. Естественно, эти тесты занимают много времени. В основном, все время идет от разгрузки Cake и повторной загрузки всех приборов между тестами.

Все тесты действуют только для чтения. Мы просто отправляем вызовы find в базу данных и тестируем логику среди набора взаимодействий классов на основе этих результатов. На самом деле, тесты можно свести к:

class ALongRunningTest extends CakeTestCase {
    public $fixtures = array('app.class1', 'app.class2', ... 'app.class8');

    /**
     * @dataProvider provider
     * @test
     */
    public function checkCompositionLogic($val1, $val2, $val3) {
        // internally calls class1 and class3
        $data = $this->ModelX->generateComplexStructure($val1);

        // internally calls other classes & models, which touch the
        // other loaded fixtures
        $results = $this->ModelY->checkAllWhichApply($val2, $data);

        $this->assertEquals($val3, $results);
    }

    public function provider() {
        return array(
            array(stuff, stuff1, stuff2),
            array(x_stuff, x_stuff1, x_stuff2),
            array(y_stuff, y_stuff1, y_stuff2),
            array(z_stuff, z_stuff1, z_stuff2),
            array(a_stuff, a_stuff1, a_stuff2),
            // More test cases
        );
    }
}

Я не смог ничего найти о том, как это предотвратить. В классе CakeTestCase я видел открытую переменную autoFixtures с комментарием, в которой говорится, что если вы измените ее на false, она не будет загружать приборы. Это делает заметку о том, что вы должны загрузить их вручную. Однако я не вижу документации о том, как на самом деле загрузить их вручную.

1 Ответ

2 голосов
/ 09 марта 2012

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

Однако, поскольку вы выполняете действия только для чтения с базой данных, вы можете удалить все ссылки на приборы в ваших тестовых примерах и настроить записи базы данных перед запуском набора тестов (например, импортировать его из файла SQL) ,

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

class AllTest extends CakeTestSuite {
    public static function suite() {
        self::loadDB();
        $suite = new CakeTestSuite('All tests');
        $suite->addTestDirectoryRecursive(TESTS . 'Case');
        return $suite;
    }
    public static function loadDB() {
         //Do some set up here using your models
    }
}

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

...