Краткият отговор е Прочетете записа в The Fine Manual за тестване на бази данни в ръководството на PHPUnit .
А сега дългият отговор...
Първото нещо, което трябва да запомните за модулното тестване е, че то трябва да се извършва изолирано от всички останали компоненти. Често тази цел се опростява с помощта на техники за инверсия на контрола (IoC), като инжектиране на зависимост . Когато вашите класове изрично поискат техните зависимости в методите на конструктора, това е проста операция за подигравка тези зависимости, така че да можете да тествате останалия код изолирано.
Тестването на код, който взаимодейства с модели, обаче е малко по-различно. Обикновено не е практично или препоръчително да инжектирате вашите модели в класа, в който трябва да имате достъп до тях. Вашите модели обикновено са "тъпи" структури от данни, които излагат ограничени или никакви възможности. В резултат на това обикновено е приемливо (от гледна точка на възможност за тестване) да създавате екземпляри на вашите модели в движение във вашите иначе инжектирани класове. За съжаление, това затруднява тестването на кода на базата данни, тъй като, както отбелязва документацията на PHPUnit:
И така, как да изолирате и тествате код, който взаимодейства с базата данни, ако моделите не са директно инжектирани? Най-лесният начин да направите това е да използвате тестови приспособления .
Тъй като определено вече използвате PDO
или ORM библиотека, която се основава на PDO
(нали?), настройката на приспособленията е толкова проста, колкото да заредите основна SQLite база данни или XML файл с данни, за да приспособите вашите тестови случаи и да използвате тази специална връзка с базата данни, когато тествате кода, който взаимодейства с базата данни. Можете да посочите тази връзка във вашия начален файл на PHPUnit, но вероятно е семантично по-подходящо да настроите PHPUnit Database TestCase
.
Общоприетите стъпки за най-добра практика за тестване на DB код (те също са повторени в документацията на PHPUnit за тестване на DB):
- Настройване на приспособление
- Система за упражнения в процес на тест
- Потвърдете резултата
- Разглобяване
И така, за да обобщим, всичко, което трябва да направите, е да създадете „фиктивна“ база данни и вашият код да взаимодейства с тези известни данни, вместо с действителна база данни, която бихте използвали в производството. Този метод ви позволява успешно да изолирате тествания код, тъй като той работи с известни данни, а това означава, че можете да правите конкретни/проверяеми твърдения относно резултатите от операциите на вашата база данни.
АКТУАЛИЗАЦИЯ
Просто защото е изключително полезно ръководство за какво не какво да направите във вашия код, ако искате да популяризирате възможността за тестване, добавям връзка към Как да напиша 3v1L, нетестваем код . Не е свързан конкретно с тестване на бази данни, но въпреки това е полезно. Приятно тестване!
АКТУАЛИЗАЦИЯ 2
Исках да отговоря на коментара относно отлагането на тестването на модела, защото съществуващата кодова база не прилага PDO
за достъп до база данни:
Вашите модели не трябва да използват PDO, за да внедрят разширението DbUnit на PHPUnit.
Ще улесни малко живота ви, ако използвате PDO, но не сте длъжни да го правите. Да кажем, например, че сте създали вашето приложение с вградения pg_*
на PHP Функции на PostgreSQL. PHPUnit все още ви позволява да указвате фикстури и все още може да ги изгради отново за всеки тест -- просто ще трябва да насочите връзката си, когато извършвате тестове към същия ресурс, който разширението DbUnit използва за фикстурата си.