Я пытаюсь сосредоточиться на модульном тестировании с использованием 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(); }