Intereting Posts

Тестирование Phpunit с помощью базы данных

Я пытаюсь сосредоточиться на модульном тестировании с использованием PHPunit.

Я нашел очень хороший учебник здесь http://blog.nickbelhomme.com/php/phpunit-training-course-for-free_282

Но есть кое-что, что я пропускаю и еще не понимаю, как это сделать.

У меня есть пользовательский модуль, который поддерживает всю информацию о пользователях. И есть функция save, которая сохраняет пользователя в базе данных. Итак, у меня есть testFunction

public function testCanCreateUser() { $userData = array( 'userName' => 'User1', 'firstName' => 'Joey', 'lastName' => 'Hendricks', 'email' => 'Joey@hendricks.com', 'password' => 'f$tfe8F' ); $user = new Model_User($userData); $user->save(); } 

В первый раз, когда я проведу свой тест, эта работа. Поскольку база данных пуста. Но когда я запускаю свои тесты во второй раз, это не сработает, так как моя система не позволяет одному и тому же пользователю дважды в db. Поэтому для этого мне нужно каждый раз воссоздавать свою тестовую базу, прежде чем запускать тесты. Каков наилучший способ сделать это? Или эта проблема должна быть решена по-другому?

Tnx.

Если вы хотите проверить свою бизнес-логику: отбросьте класс базы данных и верните поддельные данные

Если вы хотите протестировать класс, который запускает операторы sql (и imho, вы можете проверить это тоже, так как я хочу узнать, работает ли мой код с реальным db в бэкэнд), он становится немного сложным, но есть способы сделать это :

  • Используя setUp () и tearDown (), чтобы получить согласованное состояние для данных перед запуском ваших тестов, это (imho) прекрасный способ записи db-driven unittests. Однако может возникнуть раздражение, чтобы написать много пользовательских sql вручную.

  • Чтобы сделать вашу жизнь проще, вы можете изучить расширение DbUnit и посмотреть, работает ли это для вашего приложения.

  • Если вы действительно хотите погрузиться в взаимодействие с базами данных Unittesting, лучше всего читать на эту тему (imho) в главе о db-unittesting в книге Sebastian Bergmanns phpqa .

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

Запустите тесты с другой копией базы данных, которая пуста и / или очищена в setUp() или tearDown() , но будьте осторожны, чтобы не делать то, что делал github .

Если вы используете хорошую базу данных (то есть не MySQL с таблицами MyISAM), вы можете обернуть тест в транзакцию и отбросить ее после теста:

  function setUp() { $this->db->exec("BEGIN"); } function tearDown() { $this->db->exec("ROLLBACK"); } 

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

В идеале вы должны использовать инъекции зависимостей и запускать тесты на поддельный класс базы данных:

 $fakedb = new DatabaseThatDoesntReallySaveThings(); $user = new Model_User($fakedb, $userData); $user->save(); $this->assertTrue($fakedb->wasAskedToSaveUser()); 

Я думаю, вы можете использовать tearDown() для очистки сохраненных данных.

 protected $_user; public function testCanCreateUser() { ... $this->_user = new Model_User($userData); $this->_user->save(); } public function tearDown() { $this->_user->delete(); }