Я пытаюсь написать модульные тесты для моего приложения django с устаревшей базой данных SQL Server.
Так я в настоящее время обращаюсь к данным из базы данных.Я создал файл с именем db_service.py
.Его цель - выполнить необработанные SQL-запросы, запрошенные views.py
, и вернуть результат обратно.Запросы обычно довольно сложны и уже созданы (в устаревшем приложении Perl CGI).Так что я не слишком заинтересован в создании моделей и использовании набора запросов django для достижения того же.Пример показан ниже.
views.py
@login_required
def view_load_from_db (request):
params = request.GET.get('params')
result = db_service.get_something_from_db(params)
do something with result and return as JsonResponse
db_serivce.py
def get_something_from_db(params):
query = '''complex sql query with stored procedures/joins/outer apply etc'''
result = cursor.execute(query)
return result
Для единицытестируя представление, я высмеиваю db_service
методы и возвращаю статический предопределенный результат, как показано ниже:
test_views.py
class ExampleTest(TestCase):
@mock.patch('app.db_service.get_something_from_db')
def test_view_load_from_db (self, mock_get_something_from_db):
mock_get_something_from_db.return_value = {some static value}
response = self.client.get(url_to_view_load_from_db , params)
self.assertEquals(response.status_code, 200)
Но с тех пор,большая часть логики лежит в самом db_service
, я чувствую, что я на самом деле ничего не тестирую, а также я вижу, как может быть слишком сложно поддерживать макет (если несколько db_service
используются в одном представлении, каждый методнужно смоделировать с помощью патча)
Так что я мог бы придумать еще несколько вариантов -
- Использовать базу данных разработки (синхронизируется с базой данных prod каждую неделю) и использовать ее непосредственно вместоиздевательские
db_service
методы.Однако в этом случае, как я понимаю, это больше не будет модульным тестом, поскольку я проверяю не единицу функции, а службу, от которой она зависит.Так что это больше похоже на интеграционный тест. - Используйте пустую тестовую базу данных, которую django создает, и создайте все таблицы / представления / хранимые процедуры / функции в
setUpTestData
для каждого класса Test и вручную вставьте некоторые данные в таблицы, но, опять же, это также может быть очень громоздкимтак как есть много таблиц / хранимых процедур / .. для создания.(Несвязанный вопрос: если я последую этому подходу, будет ли он все еще рассматриваться как модульный тест или это интеграционный тест?) - Скопируйте производственную базу данных в тестовую базу данных без каких-либо данных на самом SQL-сервере и вставьте некоторыесмоделируйте данные и затем используйте
--keepdb
для тестирования (аналогично 2, но вместо использования setUpTestData
в django, просто создайте его на сервере SQL и сохраните его)
Я оченьновичок в тестировании и не совсем уверен, какой подход использовать в этом сценарии.Если бы кто-нибудь мог дать какой-нибудь совет и предложить подход, это было бы очень признательно!
Спасибо!