PHPUnit - проверить правильность SQL-запроса - PullRequest
9 голосов
/ 23 марта 2011

Я в процессе тестирования заводского класса. Один из методов должен загрузить данные в массив для объекта, который будет создан другим методом.

Этот метод содержит запрос SQL, который содержит критическое условие, которое должно быть проверено. (в этом случае запрашивайте только те записи, которые «опубликованы». Пример: ГДЕ опубликовано = 1). Это различие в SQL-запросе - единственная деталь, которая отличает этот метод от другого, и я хочу проверить поведение при выполнении запроса.

Теперь я не могу по-настоящему насмехаться над своим объектом PDO и просить его вернуть фиксированный результат, так как я бы не проверял выполнение запроса mySQL. Это сделало бы бесполезный тест.

Это наводит меня на мысль, что мне нужно будет создать статическую базу данных с фиксированными тестовыми данными внутри нее. Я прав в этом или что-то пропустил?

Должен ли я отделить тест, требующий "базы данных тестов", от автономных тестов?

Ответы [ 2 ]

10 голосов
/ 23 марта 2011

Я полностью согласен с тем, чтобы не издеваться над PDO.В какой-то момент я хочу убедиться, что мои запросы работают с реальной базой данных.Хотя технически это может больше не быть модульным тестом.Для меня это намного больше информации о том, что мой код, который обрабатывает хранилище данных, действительно работает против БД.

Я стремлюсь создать своего рода класс доступа к данным для каждого класса, который должен общаться сБД и таким образом отделяют большую часть бизнес-логики от кода доступа к БД.

Таким образом, я могу смоделировать доступ к данным при тестировании классов и после этого создать «Тестовую базу данных» для каждого «доступа к данным».class "и посмотрите, работают ли они.

@ zerkms Ответ (+1) уже связан http://phpunit.de/manual/current/en/database.html, и единственный другой ресурс, который я нашел, имеет значение, когда дело доходит до DB-Testing, этоКнига Real-World Solutions for Developing High-Quality PHP Frameworks and Applications, в которой есть большая глава, посвященная этой теме.


Должен ли я отделить тест, требующий "базу данных тестов", от тестов, которые являются автономными?

Только если ваш набор тестов действительно очень большой, и у вас есть проблемы во время выполнения, которые заставляют вас сказать: «даже тестирование базы данных занимает много времени для всех моих тестов, поэтому я запускаю эти тесты».только на сервере непрерывной интеграции, а не в процессе разработки.

3 голосов
/ 23 марта 2011

Да, это обычная практика.

Это также специальные методы для загрузки светильников: http://phpunit.de/manual/current/en/database.html

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

...