2011-04-09 3 views
4

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

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

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

ответ

3

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

Ниже приведены примеры тестирования интеграции с помощью Enhance PHP framework. Он проверяет класс репозитория, который сохраняет и извлекает объект Арендатора.

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

<?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

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

Я не использовал ни тестовую структуру через несколько лет, но Я помню хорошие результаты с PHPUnit.