Модульное тестирование PHP MySQL - PullRequest
4 голосов
/ 09 апреля 2011

Мне нужно протестировать ряд функций, созданных мной с использованием PHP 5, которые выполняют необходимые действия типа CRUD базы данных (SELECT, UPDATE, INSERT, DELETE), которые требуются моему веб-приложению.

Я смотрел на наборы модульного тестирования PHP, такие как Simple Test и PHP Unit, которые, кажется, предлагают то, что мне нужно, однако я не уверен, как мне это нужно, так как разделение на эквивалентность и анализ границ не так уж и ясны , Мне просто нужно ввести разные переменные и изменить это? Это кажется довольно бессмысленным, поскольку строка, которая отличается от других, не обязательно может иметь какое-либо значение.

Любое руководство по этому вопросу было бы полезно, так как я не сталкивался с этим раньше.

Ответы [ 2 ]

3 голосов
/ 29 августа 2011

Если вы тестируете взаимодействие между вашим PHP-кодом и базой данных MySQL, вы выполняете интеграционное тестирование, а не модульное тестирование.

Вот несколько примеров интеграционного тестирования с Enhance PHP Framework , он тестирует класс репозитория, который сохраняет и получает объект Tenant.

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

<?php
class TenantRepositoryTestFixture extends EnhanceTestFixture {
    private $Target;

    public function SetUp() {
        $tables = new TableHelper();
        $tables->CreateTenantTable();
        $this->Target = Enhance::GetCodeCoverageWrapper('TenantRepository');
    }

    public function TearDown() {
        $tables = new TableHelper();
        $tables->DropTenantTable();
    }

    public function SaveWithNewTenantExpectSavedTest() {
        $tenant = new Tenant();
        $tenant->Name = 'test';

        $saved = $this->Target->Save($tenant);
        $result = $this->Target->GetById($saved->Id);

        Assert::AreNotIdentical(0, $result->Id);
        Assert::AreIdentical($tenant->Name, $result->Name);
    }

    public function SaveWithExistingTenantExpectSavedTest() {
        $tenant = new Tenant();
        $tenant->Name = 'test';
        $saved = $this->Target->Save($tenant);
        $saved->Name = 'changed';
        $saved = $this->Target->Save($saved);

        $result = $this->Target->GetById($saved->Id);

        Assert::AreIdentical($saved->Id, $result->Id);
        Assert::AreIdentical($saved->Name, $result->Name);
    }
}
?>
1 голос
/ 09 апреля 2011

Как правило, идея модульного тестирования заключается в том, чтобы в случае внесения изменений можно было просто запустить простую серию тестов, чтобы убедиться, что ни одна из существующих функций не сломается.Таким образом, вы захотите охватить типичные данные, которые вы ожидаете, а также крайние / граничные случаи, которые могут включать строки с кавычками (чтобы убедиться, что они экранированы правильно), атаки с использованием SQL-инъекций (то же самое), пустые строки, строки различной кодировки, NULL, логическое значение true и т. д. Каждый тест должен проверять, что при вводе данных вы получаете ожидаемый результат, в данном случае (соответственно): вставленная экранированная строка,вставлена ​​экранированная строка, вставлена ​​пустая строка, другая кодировка преобразована или выброшена, затем вставлена, выдана ошибка, содержащая значение NULL, вставлена ​​строка 'true' и т. д.несколько лет, но я помню хорошие результаты с PHPUnit.

...