2015-11-10 3 views
3

Предположим, я хочу, чтобы проверить согласованность базы данных в трех состояниях:Многоразовые тесты в PHPUnit

  1. Когда данные были вставлены - Я хочу, чтобы убедиться, что определенное количество строк были вставлены в таблицы базы данных.

  2. Когда данные были обновлены - Я хочу повторять строки теста количество (сумма должна быть такой же, как после вставки)

  3. Когда данные были удалены - Я хочу, чтобы убедиться, что все данные были удалены.

Также, когда я вставляю или обновляю, некоторые файлы (изображения) могут быть загружены на сервер, а пути к файлам будут сохранены в базе данных. Поэтому я также хотел бы проверить, соответствует ли количество файлов количеству строк в таблице файлов базы данных.

Другими словами, я хочу повторно использовать два метода: testRowsAmountOnAddUpdate и testFilesAmountOnAddUpdate после вставки и обновления.

Каков наилучший способ организовать мой код? Должен ли я использовать светильники?

+0

Как правило, вы не будете беспокоиться о фактическом тестировании базы данных в своем коде и высмеивать вызовы базы данных. Это позволяет вашему коду продолжать, как если бы строки были добавлены или не были основаны на возврате. В конце концов, вы проверяете свой код, а не базу данных. Однако, если вы хотите протестировать свою библиотеку, которая взаимодействует с базой данных, то вы хотите сделать проверки, о которых вы говорите. Для этого требуется расширение DBUnit для PHPUnit, поэтому вы можете работать с базой данных в модульных тестах для своих библиотек. IE: Не загружайте данные в БД для запроса и подсчета возвращенных записей. –

+0

Позвольте мне объяснить весь процесс, который я переживаю. Прежде всего - я использую php-структуру. Структура имеет ORM-модели, которые помогают мне получить доступ к данным в базе данных. Также в настройках базы данных хранятся настройки подключения к БД. Соединение DB инициализировано в исходном коде. –

+0

Второй - У меня есть внешний источник данных. Я загружаю данные из этого источника, разбираю его и применяю к моделям ORM.В этот момент разница между данными внешнего источника и данными локальной базы данных может быть описана тремя состояниями: новые строки поступают из внешнего источника - я должен вставить его в свою БД, в источнике есть строки - я должен обновлять строки в моем DB (в основном, удалить unrelevent и вставлять новые), и если некоторые строки существуют в моей локальной базе данных, и они не поступают из источника - я должен удалить их из своей БД. Итак, у меня есть рабочий, который все это делает. –

ответ

0

Как некоторые комментарии сказал, всякий раз, когда это возможно, лучше дразнить intarction базы данных слоя, однако иногда вы просто должны проверить взаимодействие между кодом и базой данных, особенно для сложных запросов. Я лично использую это для светильников база данных и утверждений: (ERM, оговорки, я alsow наизусть это так я пристрастен)

https://github.com/malteriesch/test-db-acle

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

$this->setupTables(" 
     [address] 
     address_id |company 
     1   |me 
     3   |you 

     [user] 
     user_id |name 
     10  |John 
     20  |Mary 

    "); 
// excercise the SUT, e.g. 
$this->addressService->addEntry("them"); 

$this->assertTableStateContains(" 
     [address] 
     address_id |company 
     1   |me 
     3   |you 
     100   |them #this is the new row inserted 

     [user] 
     user_id |name 
     10  |John 
     20  |Mary 
     "); 
} 

Может быть, вы можете обернуть их в testRowsAmountOnAddUpdate и testFilesAmountOnAddUpdate, для загрузки файла, я бы прочитать значение поля, а затем утверждать, что указанный файл существует.

Обратите внимание, что DBUnit также является хорошим способом, лично мне нравится писать тесты как можно проще и лаконичнее и сосредоточиться только на информации, которая фактически изменяется/имеет значение в тесте. Другие инструменты для меня были просто немного подробными.

0

На самом деле я пришел к этой структуре (код simplyfied):

class MyTest extends PHPUnit_Framework_TestCase 
{ 

    private static $expectedRowsAmountInDB; 

    private function getRowsAmountFromDB() 
    { 
      //using this method to get rows count from DB 
    } 

    public function setUp() 
    { 
      //import initial data, set up the world 
    } 

    public function testRowsAmountOnAdd() 
    { 
      //count rows amount after setup 
      //using getRowsAmountFromDB helper method 
      $this->assertEquals(self::$expectedRowsAmountInDB, $this->getRowsAmountFromDB()); 
    } 

    public function testRowsAmountOnUpdate() 
    { 
      //...here comes update rows code 
      $this->assertEquals(self::$expectedRowsAmountInDB, $this->getRowsAmountFromDB()); 
    } 

    public function testRowsAmountOnDelete() 
    { 
      //...here comes delete rows code 
      $this->assertEquals(self::$expectedRowsAmountInDB, $this->getRowsAmountFromDB()); 
    } 

    public function tearDown() 
    { 
      //delete all rows that were created in this test 
      //and back DB to the original state 
    } 


} 
Смежные вопросы