Можливо, я можу дати вам смак нашого досвіду, коли ми почали дивитися на тестування підрозділу нашого середнього рівня, який включав тонну «бізнес-логіку» sql-операцій.
Спочатку ми створили рівень абстракції, який дозволив нам «прорізати» будь-яке розумне підключення до бази даних (у нашому випадку ми просто підтримували єдине з'єднання типу ODBC).
Як тільки це відбулося, ми змогли зробити щось подібне у нашому коді (ми працюємо в C ++, але я впевнений, що ви зрозуміли цю ідею):
GetDatabase (). ExecuteSQL ("ВСТАВЛЯЙТЕ в foo (bla, blah)")
У звичайний час роботи GetDatabase () повертає об'єкт, який подає всі наші sql (включаючи запити), через ODBC безпосередньо в базу даних.
Потім ми почали розглядати бази даних в пам'яті - найкращим, здається, є SQLite. ( http://www.sqlite.org/index.html ). Налаштування та використання надзвичайно просто, і дозволило нам підклас та переопределити GetDatabase () для пересилання sql до бази даних пам'яті, яка була створена та знищена для кожного проведеного тесту.
Ми все ще перебуваємо на ранніх етапах цього, але це добре виглядає поки що, однак ми маємо впевнитись, що ми створюємо потрібні таблиці та заповнюємо їх тестовими даними - проте ми дещо зменшили навантаження тут, створивши загальний набір допоміжних функцій, який може зробити багато всього для нас.
Загалом, це дуже допомогло в нашому TDD-процесі, оскільки внесення змін до виправлення певних помилок може мати досить дивні наслідки для інших (важко виявлених) областей вашої системи - через саму природу sql / баз даних.
Очевидно, що наш досвід був орієнтований на середовище розробки C ++, проте я впевнений, що ви могли б отримати щось подібне, працюючи під PHP / Python.
Сподіваюся, це допомагає.