Как выполнить модульное тестирование при удаленной процедуре хранения - PullRequest
1 голос
/ 15 сентября 2009

Мне предстоит выполнить модульное тестирование на уровне доступа к данным, всей базе данных вызовов уровня доступа к данным через процедуру сохранения. Я планирую создать чистую базу данных, используемую для модульного тестирования, но я обнаружил, что большая часть процедур хранилища будет вызывать удаленно другие базы данных. Я понятия не имею, как провести модульное тестирование такого рода процедур хранилища. Должен ли я создавать все связанные базы данных? или какие-то другие решения?

Ответы [ 3 ]

2 голосов
/ 15 сентября 2009

В целом, чем больше вы можете абстрагировать свой слой доступа к данным от остальной части приложения, тем лучше вы сможете выполнить его модульное тестирование. Как писал Джейден в другом ответе, Test Doubles, такие как динамические макеты, являются хорошим решением.

Однако, как я понимаю ваш вопрос, вы явно хотите провести модульное тестирование уровня доступа к данным, и это тоже нормально. В этом случае динамические макеты вам не помогут, так как вы будете тестировать самый нижний уровень в вашем приложении - имитировать уже нечего. Некоторые люди настаивают на том, что это не модульный тест , а скорее интеграционный тест , но я думаю, что важной частью является то, автоматизирован ли тест или нет, а не то, как мы его называем .

В любом случае, как только вы начнете тестировать уровень доступа к данным, вам более или менее придется иметь дело с ним как есть. Если он использует удаленные хранимые процедуры, вам придется с этим справиться. Чтобы сделать настройку немного проще, вы можете поместить «удаленную» базу данных в тот же блок, что и «локальная» база данных.

Модульный тест - это в основном поведенческий тест, так что все будет в порядке. Должны быть другие типы тестов ( интеграционные тесты или системные тесты ), которые используют реалистичную настройку со многими распределенными машинами и т. Д., Чтобы убедиться, что безопасность, работа в сети и т. Д. Работают должным образом но это не должно быть основным фокусом юнит-теста.

1 голос
/ 16 сентября 2009

Вы могли бы рассмотреть возможность структурирования вашей базы данных, которая ссылается на другую, так что все удаленные таблицы доступны через представления. Я обычно придерживаюсь соглашения об именах:

vw_[DATABASENAME]_[TABLENAME]

Представление состоит не более чем из:

select * from server.dbo.tablename

Все хранимые процедуры обращаются к удаленным таблицам через представления, а не напрямую, т. Е. Для доступа к таблице Person в вызове удаленной базы данных. Персонал будет:

create view vw_STAFF_Person
as

select * from Staff.dbo.Person

go

create procedure stp_Select_Staff
as

select * from vw_Staff_Person

go

вместо

create procedure stp_Select_Staff
as

select * from Staff.dbo.Person

go

Основанием для этого является то, что когда вы хотите протестировать свою базу данных, вы, вероятно, захотите повторно связать все удаленные базы данных с вашими «тестовыми» удаленными базами данных. Как правило, это легче сделать, когда единственными объектами, обращающимися к удаленным данным, являются простые представления, а не часто более многочисленные и сложные хранимые процедуры.

У меня обычно есть задание, которое может переписать представления в «тестовые» базы данных, так что это делается автоматически.

В дополнение к этому, у меня также часто есть задание, восстанавливающее резервные копии рабочей базы данных в «тестовую» среду, так что тестирование перед развертыванием можно проводить на системах, которые содержат копию живых данных. Опять же, этот процесс становится проще, поскольку требуется только повторно связать представления, а не все сохраненные ссылки на процедуры на удаленные системы.

Чтобы упростить тестирование на безопасность, я также всегда устанавливаю безопасность базы данных на уровне базы данных roles, а не на конкретных пользователей, поскольку считаю roles более переносимым в средах производства, тестирования и разработки, users.

Надеюсь, что некоторые из этих советов помогут.

1 голос
/ 15 сентября 2009

Загляни в объект.

Насмешка носорога - одно из решений этой проблемы, вы можете посмотреть на нее здесь .

Mocking позволит вам смоделировать доступ к данным из вашей базы данных без необходимости создавать «тестовую» базу данных. При настройке макетов требуется немало усилий, но ваши тесты остаются согласованными.

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