Модульное тестирование в django с устаревшим приложением, управляемым сервером sql - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь написать модульные тесты для моего приложения 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 используются в одном представлении, каждый методнужно смоделировать с помощью патча)

Так что я мог бы придумать еще несколько вариантов -

  1. Использовать базу данных разработки (синхронизируется с базой данных prod каждую неделю) и использовать ее непосредственно вместоиздевательские db_service методы.Однако в этом случае, как я понимаю, это больше не будет модульным тестом, поскольку я проверяю не единицу функции, а службу, от которой она зависит.Так что это больше похоже на интеграционный тест.
  2. Используйте пустую тестовую базу данных, которую django создает, и создайте все таблицы / представления / хранимые процедуры / функции в setUpTestData для каждого класса Test и вручную вставьте некоторые данные в таблицы, но, опять же, это также может быть очень громоздкимтак как есть много таблиц / хранимых процедур / .. для создания.(Несвязанный вопрос: если я последую этому подходу, будет ли он все еще рассматриваться как модульный тест или это интеграционный тест?)
  3. Скопируйте производственную базу данных в тестовую базу данных без каких-либо данных на самом SQL-сервере и вставьте некоторыесмоделируйте данные и затем используйте --keepdb для тестирования (аналогично 2, но вместо использования setUpTestData в django, просто создайте его на сервере SQL и сохраните его)

Я оченьновичок в тестировании и не совсем уверен, какой подход использовать в этом сценарии.Если бы кто-нибудь мог дать какой-нибудь совет и предложить подход, это было бы очень признательно!

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...