Если у тебя банальный CRUD API с отчетиками, то функционал это создание вещей, чтение, отчетики и прочее
Но если тебе пришлось писать какие-то самописные решения для бд, то их же тебе тоже по-хорошему придется покрыть тестами, хотя в моем понимании это не связано с функционалом
Есть тесты на целостность классов и типов данных - у тебя есть кастомер и у него поля имени и адреса - это стринги, ты тестишь, что ты можешь получить доступ к полям класса, если ты гетер сделал в процессе разработки приватным - получи ошибку в тесте
Есть юнит-тесты - на функциональность, условно для калькулятора - что 2+2 он выдаст 4, а не что-то другое (примитивный пример)
Есть интеграционные тесты - когда ты прогоняешь условно часть юзер-стори - добавление данных в БД, их получение, взаимодействие с другими сервисами и прочее
тесты самописок - это юнит-тесты
они гарантируют, что тот функционал, который ты прописал в тестах - они соблюдают - не более и не менее... тесты не могут гарантировать, что твой калькулятор работает ПРАВИЛЬНО и БЕЗ БАГОВ - они гарантируют лишь то, что если ты прописал в тесте ожидаемый результат 2+2 == 5 и твой калькулятор это отдаёт, то ты соответствуешь СВОИМ ожиданиям, но не ожиданиям заказчика или тестировщика... позже, если тестер прибегает с багом - ты его фиксишь и добавляешь тест на это (в идеальном мире) - и вот твои тесты расширяются - они уже ещё и под тестера/документацию/заказчика подстраиваются... и всё, не более и не менее...