Ну, для начала я думаю, что это очень много, что зависит от контекста приложения, набор навыков QA/dev &. Итак, я думаю, что это правильно, возможно, не так.
Сказав, что ...
В моем случае, у меня есть система, в которой чрезвычайно сложная ERP база данных, которые я не контроль, очень много места водителя и мой код зрителя/наблюдатель, а не драйвером этой базы данных. Я не могу и не могу использовать слой ORM, все мое добавленное значение находится в запросах, которые глубоко понимают базовую модель данных базы данных. Обратите внимание также, что я в основном являюсь зрителем этого db, на самом деле мой код имеет доступ только для чтения к первичному db. Он имеет доступ на запись к своей собственной базе данных тегов, в которой используется ORM Django, и тестирование отличается по своей природе тем, что я полагаюсь на ORM.
Для меня лучше было протестировать базу данных.
Mock objects? Возможно, насмехались бы, если бы было много законных причин для просмотра/изменения содержимого базы данных со сложными запросами.
Изменение запросов. В моем случае очень часто требуется изменение и настройка этих запросов, которые являются основой моей логики приложения. Поэтому я должен полностью убедиться, что они выполняются по назначению против реальных данных.
Многоплатформенные проблемы. Я начал кодирование в postgresql, подстроил свои библиотеки подключений для поддержки Oracle. Удалил модульные тесты и исправил все, что появилось как ошибка. Будет ли абстракция базы данных идентифицировать такие вещи, как обработка предложения LIMIT в Oracle?
Версия для печати. Опять же, я не хозяин базы данных. Поэтому, когда версии меняются, мне нужно подключить к нему свой код. Единичное тестирование неоценимо, но это связано с тем, что он попадает в raw db.
Испытательная прочность. Один урок, который я изучил на этом пути, - это отделить тест от теста db. Предположим, вы хотите протестировать функцию, которая отображает активных клиентов, которые ничего не заказывали через год. Мой первоначальный подход к тестированию включал ручные поиски в тестовой базе данных, чтобы найти CUST701 в соответствии с условием. Затем вызовите мою функцию и проверьте, является ли CUST701 результирующим набором клиентов, нуждающихся в проверке. Неправильный подход. То, что вы хотите сделать, это написать в своем тесте запрос, в котором находятся активные клиенты, которые ничего не заказывали через год.Никаких жестко закодированных CUST701s, но ваш запрос тестового запроса может быть столь же жестко запрограммирован, как вы хотите - на самом деле, он должен выглядеть как можно меньше запросов к вашему приложению - вы не хотите, чтобы ваш тестовый sql реплицировал то, что потенциально может быть ошибкой в вашем производственном коде. После того, как вы динамически идентифицировали целевого клиента, отвечающего критериям, затем вызовите свой тестируемый код и посмотрите, ожидаются ли результаты. Убедитесь, что ваши инструменты покрытия идентифицируют, когда вам не хватает тестовых сценариев и подключите эти отверстия в тестовом db.
BDD. В значительной степени я начинаю подходить к тестированию с точки зрения BDD, а не TDD низкого уровня. Поэтому я буду называть URL-адрес, который обрабатывает неактивные списки клиентов, а не тестирует отдельные функции. Если общий результат в порядке, и у меня достаточно покрытия, я в порядке, не задаваясь вопросом о подробном низкоуровневом уровне. Так что это также влияет на мой ответ.
Кодеры всегда имели тестовые базы данных. Для меня логично использовать их для тестирования BDD/unit-testing, а не притворяться, что их не существует. Но я нахожусь в основе SQL-кодера, который очень хорошо знает Python, а не эксперт Python, который, как правило, не работает в SQL.
Что вы хотите проверить? Что работает sql или что будет выполнена правильная «версия» sql? –
В принципе, я хочу проверить, что конечный результат тот же. Что делает сама функция, это запрос базы данных для некоторых данных и использование бит логики для этих данных для получения результата. Тем не менее, можно выполнить одну и ту же задачу с помощью другого запроса и другой логики (случай, который я сейчас рассматриваю, - это использование 2 SELECT * по сравнению с SELECT * с LEFT JOIN), поэтому я хочу идеально учитывать что при написании тестов. –
Трудно сказать отсюда, является ли «бит логического кода» общим? Место, куда я попытаюсь добраться, - это sql в каком-то файле ресурсов, выбранном dbms/version. без этого, это будет серьезной болью в задней части. –