Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Тесты для MS SQL  [new]
Pabl0
Member

Откуда:
Сообщений: 265
Можете скинуть дельные статьи или пример где бы использовалось и как использовалось, говорят в MS SQL можно писать тесты (я не знаю где этот раздел даже находится), которые тестируют процедуры, триггеры и тд, если кто то что то знает по этой теме поделитесь :)
13 дек 18, 13:03    [21762846]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
Pabl0,

VS + SQL Data Tools, tutorial на сайте MS. Придется создать проект базы данных и в нем вести разработку. Тестировочные самописки оказались сложны и не покрывали всех потребностей.
13 дек 18, 13:07    [21762850]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
hnkovr
Member

Откуда:
Сообщений: 214
https://habr.com/post/234673/
13 дек 18, 13:32    [21762886]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
_human
Member

Откуда:
Сообщений: 560
Pabl0,

https://tsqlt.org/
13 дек 18, 15:11    [21763079]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4727
Pabl0
Можете скинуть дельные статьи или пример где бы использовалось и как использовалось, говорят в MS SQL можно писать тесты (я не знаю где этот раздел даже находится), которые тестируют процедуры, триггеры и тд, если кто то что то знает по этой теме поделитесь :)


Вообще надо понимать, что unit tests тестируют модули кода. Ключевое слово "модули". Ваша БД -- она существует сама по себе или у неё есть клиентское приложение? Так вот надо тестировать клиентское приложение, его классы и методы, которые будут обращаться в БД и потом проверят результат этого теста, например факт появления или изменения записей.

Вы не тестируете таблицу пользователей или процедуру создания пользователя или триггер на таблице пользователя, вы тестируете класс пользователя, метод создать пользователя, метод обновить пользователя, метод дать права пользователю и т.д.
13 дек 18, 16:59    [21763232]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
По рефакторингу и, в том числе и о вопросах тестирования рекомендую изучить

Эмблер Скотт, Садаладж Прамодкумар Дж. Рефакторинг баз данных: эволюционное проектирование.
13 дек 18, 18:36    [21763377]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
https://habr.com/post/417569/
13 дек 18, 19:53    [21763435]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
a_voronin
Вообще надо понимать, что unit tests тестируют модули кода. Ключевое слово "модули". Ваша БД -- она существует сама по себе или у неё есть клиентское приложение?


Если в вашей базе есть функции-триггеры-процедуры - но они могут тестироватся точно также как и на других языках.
13 дек 18, 20:05    [21763439]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
a_voronin
Вы не тестируете таблицу пользователей или процедуру создания пользователя или триггер на таблице пользователя, вы тестируете класс пользователя, метод создать пользователя, метод обновить пользователя, метод дать права пользователю и т.д.
Это противоречит вашему же:
a_voronin
Вообще надо понимать, что unit tests тестируют модули кода. Ключевое слово "модули".


Идея юнит тестов в том, что бы покрыть тестами не только интерфейс программы, а именно модули кода.
То есть, если какой то метод не вызывается непосредственно нажатием кнопки в UI, то это не значит, что его не надо тестировать.
Тестируется весь код, даже если какой то код вызывается другим, уже протестированным кодом, а тот в свою очередь ещё каким то кодом, тоже протестированым.
Ну и если у вас какой то код написан не на C#, а, например, на джаве, или на T-SQL, то это не значит, что его не надо покрывать тестами, это точно такая же часть системы, как и метод "создать пользователя"

Уж не говоря о том, что клиентским приложением может быть макрос в Экселе, или нарисованная мышкой страничка в SSIS, и что же, если нету классов, то нету юнит-тестов?

Далее уже вопрос в технологичности, стоимости и т.д. Может, в какой то разработке разумнее будет не покрывать юнит-тестами код на T-SQL, в другой исключить код на PowerShell или оставить в покое макросы экселя.
Но это уже решается теми, кто ведёт проект. Если десяток сиквелистов настукивают на T-SQL тыщу строк в день, то идея покрыть это юнит тестами выглядит вполне разумной.
13 дек 18, 23:24    [21763527]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Eleanor
Member

Откуда:
Сообщений: 2867
a_voronin,

По-моему, вы написали про integration tests, это другой вид тестирования, который нет отменяет unit tests.

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

Адепты CI\CD рекомендуют писать такое количество unit tests, чтобы получать 80% покрытие, и при успешном прохождении тестов автоматически выкладывать полученное в прод.
Я, правда, не сторонник.
14 дек 18, 01:01    [21763557]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4727
Eleanor
a_voronin,

По-моему, вы написали про integration tests, это другой вид тестирования, который нет отменяет unit tests.

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

Адепты CI\CD рекомендуют писать такое количество unit tests, чтобы получать 80% покрытие, и при успешном прохождении тестов автоматически выкладывать полученное в прод.
Я, правда, не сторонник.


Нет, я имел ввиду unit-tests , и ими тестируют бизнес-логику, во всяком случае так было в моей время 2005-2010 годах. Когда ими тестируют UI или базу, это выгладит странно, если только база не тестируется в контексте бизнес логики.

И вообще эту тему пора отправить в раздел проектирования ПО или куда-то туда.
14 дек 18, 02:06    [21763577]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
База в принципе не тестируема юнит-тестами в прямом понимании за исключением таблиц, представлений, и некоторых функций ввиду сильной связности программного кода с кодом и объектами данных. На базе почти всегда тесты интеграционные или функциональные.
14 дек 18, 11:01    [21763772]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Zandr
Member

Откуда: Москва
Сообщений: 576
Владислав Колосов
База в принципе не тестируема юнит-тестами в прямом понимании за исключением таблиц, представлений, и некоторых функций ввиду сильной связности программного кода с кодом и объектами данных. На базе почти всегда тесты интеграционные или функциональные.

Это не совсем так.
Вы сами уже упомянули VS + SQL Data Tools, так же в топике был упомянут tSQLt, который вполне нормально уживается с тестированием средствами VS.
Вполне нормально тестуруется ф-ционал хранимых процедур, триггеров и.т.п., с эмуляцией необходимых данных в затрагиваемых таблицах. Но требует некоторых танцев с бубном при настройке всей этой радости, и достаточных ресурсов на поддержание и наполенение тестами.
14 дек 18, 12:49    [21763933]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
Zandr,

Вы забыли упомянуть сложности и объем работ, с которыми столкнется разработчик при создании mock-объектов, а также невозможность проверить код, например, использующий вложенные транзакции с откатами по ошибке или использование Srvice Brocker. Возникшие проблемы в свое время привели к отказу от использования tSQLt в связи с трудоемкостью и непокрытием всех кейсов эксплуатации MS SQL сервера. Переход к интеграционному уровню с использование системы SQL DataTools решил все проблемы.
14 дек 18, 13:43    [21764021]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4727
Владислав Колосов
Zandr,

Вы забыли упомянуть сложности и объем работ, с которыми столкнется разработчик при создании mock-объектов, а также невозможность проверить код, например, использующий вложенные транзакции с откатами по ошибке или использование Srvice Brocker. Возникшие проблемы в свое время привели к отказу от использования tSQLt в связи с трудоемкостью и непокрытием всех кейсов эксплуатации MS SQL сервера. Переход к интеграционному уровню с использование системы SQL DataTools решил все проблемы.


Я встречался с людьми, которые хотели с помощью юнит-тестов тестировать даже UI. Пытаюсь донести одну простую мысль -- с их помощью тестируют БИЗНЕС-ЛОГИКУ.
14 дек 18, 14:25    [21764059]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Владислав Колосов
Zandr,
Вы забыли упомянуть сложности и объем работ


Это от лени, большая часть кода прекрасно тестируется, у меня почти 5 мег унит тестов к базе.

BEGIN TRAN TestUniqueName

    DECLARE @test_name sysname = 'TestUniqueName [fn_unit_test_name] purpose of current test' 

BEGIN TRY  SET NOCOUNT ON;

------------- 1. prepare data for unit test -------------

-- insert some data or execute code

------------- 2. execute unit test -------------

-- run tested function

END TRY

BEGIN CATCH

    SELECT ERROR_NUMBER() AS ErrorNumber,    ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE()   AS ErrorState

         , @test_name     AS ErrorProcedure, ERROR_LINE()     AS ErrorLine,     ERROR_MESSAGE() AS ErrorMessage

END CATCH

------------- 3. result verification -------------

-- execute command to get data for verification

IF 0 <>  @result1 OR 6 < @result2

BEGIN

   RAISERROR ('FAILED: %s must be change %d and %d ', 16, -1, @test_name, @result1, @result2 )

END

ELSE

    print 'PASSED: ' + @test_name

ROLLBACK TRAN TestUniqueName

GO


Вот простейшая структура, позволяющая покрывать логику в базе, не без ограничений конечно.
14 дек 18, 17:08    [21764244]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
Lepsik,

нет, не от лени :) tSQLt не разруливает транзакционные ситуации, а это тупик. И привязанные к схеме объекты сложно мОчить, как я писал выше. Также эта система не может быть опубликована и использована не на боевой базе, а это большой недостаток. Нам пришлось вносить исправления в оригинальный код, чтобы развернуть тестовый проект в отдельной базе. На практике моки оказались не нужны, равно как и следовать культу карго мудульного тестирования. SSDT полностью покрывает потребности. Более того, интеграционное оказалось эффективнее при решении SQL задач. У меня было года полтора практики, так что мои утверждения не на пустом месте. В общем, больше проблем создаёт, чем решает.
14 дек 18, 17:23    [21764257]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1238
Владислав Колосов
Lepsik,

нет, не от лени :) tSQLt не разруливает транзакционные ситуации, а это тупик. И привязанные к схеме объекты сложно мОчить, как я писал выше. Также эта система не может быть опубликована и использована не на боевой базе, а это большой недостаток. Нам пришлось вносить исправления в оригинальный код, чтобы развернуть тестовый проект в отдельной базе. На практике моки оказались не нужны, равно как и следовать культу карго мудульного тестирования. SSDT полностью покрывает потребности. Более того, интеграционное оказалось эффективнее при решении SQL задач. У меня было года полтора практики, так что мои утверждения не на пустом месте. В общем, больше проблем создаёт, чем решает.


@Владислав а можно 2-3 примера тестов - не код, а смысл того что они тестриуют на словах
и как это запускалось - автоматом черзе жоб - каждые N часов ?
и как и кому результат приходил.
Т.е описание процесса целиком
ибо задача встает уже не в 1-й раз - а приемлемого решения я так и не видел.


допустим orpahns (провисшие записи) легко найти - скажем по всем таблицам

у нас тут написали самописные 12 тестов ну и простую обертку для них
но я пока не вижу практической пользы
они покрывают те проблемы (баги) что УЖЕ БЫЛИ и были ПОФИКШЕНЫ.
теортетически они могут появиться снова - ну тогда они будут опознаны
14 дек 18, 17:54    [21764308]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Владислав Колосов
tSQLt не разруливает транзакционные ситуации, а это тупик. .


Транзакцийнные можно разруливать средствами TSQL но плохо, лучше этого не делать. Делать функциональными во внешнем приложнии.

--И привязанные к схеме объекты сложно мОчить, как я писал выше

какие обьекты в TSQL? - тут нет ООПа и виртуальных функций.
Подход tsqlt.org на мой взгляд ущербен

юнит тесты тестируют внутреннюю логику.
запускатся должны на пустой базе.

На боевых базах запускают только нагрузочные, иногда функциональные тесты.


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

У меня скрипт на питоне, он создает пустую базу, прогоняет 100500 тестов и я спокоен за покрытую логику.

--У меня было года полтора практики, так что мои утверждения не на пустом месте. В общем, больше проблем создаёт, чем решает


А у меня 5 лет успешной практики. Можно научится решать проблемы, а можно сказать что это бесполезно :)
14 дек 18, 17:55    [21764309]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Zandr
Member

Откуда: Москва
Сообщений: 576
Lepsik
Это от лени

Что-то вроде этого я и имел ввиду, когда писал: "... достаточных ресурсов на поддержание и наполенение тестами.."

Lepsik
Можно научится решать проблемы, а можно сказать что это бесполезно :)

Вот, прям, соглашусь )
14 дек 18, 18:21    [21764337]     Ответить | Цитировать Сообщить модератору
 Re: Тесты для MS SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
Lepsik,

Если не вести проект "на коленке", а в решении SSDT, то tSQLt отделить от проекта из-за ссылок невозможно. Я вижу, что у вас другая практика разработки, которая как-то совместима с tSQLt. Возможно, Вы просто не используете функционал сиквела в более-менее полном объёме.
17 дек 18, 11:49    [21765760]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить