Модульное тестирование с помощью tSQLt на вычисляемых столбцах

Недавно я написал несколько модульных тестов базы данных tSQLt (через Red Gate SQL Test) для процедур, которые вызывают таблицы, содержащие (сохраненные) вычисляемые столбцы, и обратите внимание, что если я использую FakeTable SP, я обнаруживаю, что вычисляемые столбцы не заполняются ( они оцениваются как нулевые). Вычисляемый столбец является ключевым для теста, поэтому я не могу просто игнорировать столбец в тесте и не хочу дублировать логику.

Я оцениваю результаты с помощью tSQLt.AssertEqualsTable SP, поэтому я хочу убедиться, что значения столбцов одинаковы в обоих случаях.

На практике я обходил это, не используя FakeTable, а используя (частичный) оператор транзакции отката в конце теста (согласно сообщению в блоге по адресу http://sqlity.net/en)./585/how-to-rollback-in-procedures/) или явное удаление тестовые значения.

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


person DaveGreen    schedule 23.02.2012    source источник


Ответы (2)


При тестировании следует отделить логику в вычисляемом столбце от логики в процедуре. Процедура возьмет информацию из этого столбца и будет действовать в соответствии с ней. Процедура не должна заботиться о том, является ли столбец вычисляемым или реальным столбцом. Это означает, что в вашем тесте вы можете жестко указать значение для этого столбца. FakeTable делает это возможным, превращая любой вычисляемый столбец в реальный столбец.

В другом наборе тестов вы можете (и должны) проверить правильность вычисления вычисляемого столбца. Для этого доступно дополнение к FakeTable. Это сохраняет вычисляемое свойство таблицы. Вам необходимо установить для параметра @ComputedColumn в EXECUTE tSQLt.FakeTable значение 1. (http://tsqlt.org/user-guide/isolation-dependencies/faketable/)

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

person Sebastian Meine    schedule 24.02.2012
comment
Спасибо, Сабастьян, это очень полезно. Я пытался объединить два теста, но, как вы заметили, это должны быть разные тесты. - person DaveGreen; 27.02.2012

Теперь в списке рассылки доступно предварительное обновление tSQLt: http://groups.google.com/group/tsqlt

Предварительная версия содержит функции для сохранения вычисляемых столбцов или значений по умолчанию во время FakeTable.

Примеры:
EXEC tSQLt.FakeTable 'dbo.tst1', @ComputedColumns = 1;
EXEC tSQLt.FakeTable 'dbo.tst1', @Defaults = 1;

Они будут готовы к официальному выпуску в ближайшее время.

person dennislloydjr    schedule 07.03.2012