Так как проект боевой, то придется делать не так как в учебниках:
- Сначала нужно будет писать приемочные/функциональные тесты (тк юнит-тесты скорее всего будут ни к месту, да и покрывать все кейсы будет долго) на критичные места и те, на которые дотянетесь
- Новые фичи должны максимально возможно покрыты юнитами, и по пути старые кейсы, которых затрагивают изменения. Там где не возможны юниты -- делайте функциональные
- Старайтесь делать тесты на места, которые меняются
- Помогайте тестам: пишите код с declare(strict_types=1), чтобы сам код отчасти себя тестировал и был уверен в аргументах, пишите код проще и надежнее
Чисто практические аспекты -- ну тут нюансов много, целые учебники
Отдельно:
- Возьмите Codeception к примеру как тестовый фулл-стек фреймворк
- Учитесь, у меня например :) (в личку)