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

Откуда:
Сообщений: 1389
Здравствуйте, подскажите пожалуйста как улучшить качество написания кода, что бы избежать появление детских ошибок
В любом случае всех моментов в голове не удержишь, и так или иначе закрадывается ошибка,
Дайте пожалуйста совет, как с этим бороться? как минимизировать все подобные ситуации?
9 сен 16, 12:36    [19646745]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Владислав Колосов
Member

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

tSQLt unit testing framework

http://tsqlt.org/
9 сен 16, 12:49    [19646801]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
иметь тестовую среду и нормального QA инженера
А не - куяк,куяк и в продакшн
9 сен 16, 15:06    [19647590]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Это практический пример тестирования триггера.

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

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

Если вы SQL девелопер и не пишете сами юнит тесты - удачи пользователям продакшина

-----------------------------------------------------------------------------------------------------------
declare @test_name sysname = 'Test_auth_internal2 [trig_afterupd_auth_internal] need to set current date'
-----------------------------------------------------------------------------------------------------------
BEGIN TRAN Test_auth_internal2
SET NOCOUNT ON;

-- 1. prepare data for unit test
update global_configuration set config_value = '6' WHERE config_attribute = 'password.lockout.threshold'    
insert into auth_internal (authint_username, authint_password, authint_invaid_attempts) values ('John', 'passw0rd', 5);

-- 2. execute unit test

update auth_internal set authint_invaid_attempts = 8 where authint_username = 'John'

-- 3. result verification
declare @result int = (select count(*) from auth_internal where authint_disabled_date IS NOT NULL);

IF 1 <> @result

    BEGIN
   RAISERROR ( 'FAILED %s: should be a single row %d', 13, -1, @test_name, @result )
END
ELSE
    print 'PASSED: ' + @test_name
ROLLBACK TRAN Test_auth_internal2
GO
12 сен 16, 10:59    [19653755]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Lepsik,

Основная "проблема" с тестированием t-sql это не написать скрипт, а удобство запуска таких тестов,
удобство задания параметров теста (ваше IF 1 <> @result)
и встраивание в процесс непрерывной интеграции.
Так можно и к Visual Studio прикрутить проект который будет sql файл запускать на базе и выводить лог.
Как вы ваши файлы запускаете?

Владислав Колосов
tSQLt unit testing framework
http://tsqlt.org/
пользуетесь? как впечатления, есть интеграция с VS, CI?
12 сен 16, 13:41    [19654443]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
RMagistr2015,

никак, т.к. SQL скрипт для тестирования другого SQL скрипта, скорее всего, будет содержать ещё больше ошибок, и он потребует написание другого SQL скрипта для тестирования, который... см. про рекурсию
13 сен 16, 00:28    [19657088]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Lepsik
Если вы SQL девелопер и не пишете сами юнит тесты - удачи пользователям продакшина
Для этого обычно тестеров заводят есть в команде.

Я даже не знаю, что хуже: юнит-тест, который тестит 5% функционала, но рождает ложную уверенность, что все хорошо, или вообще их отсутствие. (Я сильно сомневаюсь, что вы пишите два-три-пять десятков юнит-тестов, которые проверяют заполнение каждого поля в тех или иных условиях, или как ведет себя триггер, когда записей более одной апдейтится. Разработчики для этого не предназначены)

Сообщение было отредактировано: 13 сен 16, 01:55
13 сен 16, 01:46    [19657138]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Сид
RMagistr2015,

никак, т.к. SQL скрипт для тестирования другого SQL скрипта, скорее всего, будет содержать ещё больше ошибок, и он потребует написание другого SQL скрипта для тестирования, который... см. про рекурсию
Код, для которого написаны тесты с возможными ошибками, содержит на порядок меньше ошибок, чем код, который никто не тестил. Инфа 146%.
13 сен 16, 01:48    [19657139]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Дедушка
Lepsik,

Основная "проблема" с тестированием t-sql это не написать скрипт, а удобство запуска таких тестов,
удобство задания параметров теста (ваше IF 1 <> @result)
и встраивание в процесс непрерывной интеграции.
Так можно и к Visual Studio прикрутить проект который будет sql файл запускать на базе и выводить лог.
Как вы ваши файлы запускаете?

Владислав Колосов
tSQLt unit testing framework
http://tsqlt.org/
пользуетесь? как впечатления, есть интеграция с VS, CI?
При должном старании все хорошо. Фреймворк свой (такая смесь Excel -> Python -> sql-скрипты), но на выходе одна удобная процедура для всех, которой можно прогнать все тесты (или ограниченный набор) по модулю.

У нас другая проблема. Прогон всех тестов занимает часов 48...

Сообщение было отредактировано: 13 сен 16, 01:53
13 сен 16, 01:52    [19657140]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
RMagistr2015
Здравствуйте, подскажите пожалуйста как улучшить качество написания кода, что бы избежать появление детских ошибок
В любом случае всех моментов в голове не удержишь, и так или иначе закрадывается ошибка,
Дайте пожалуйста совет, как с этим бороться? как минимизировать все подобные ситуации?
Все очень просто:
1. простая и понятная структура данных
2. понятные и краткие имена таблиц/полей
3. строгие требования по оформлению кода. Комментарии.
4. Хранилище скриптов. Разложить по тематическим папкам. Четкие, "говорящие" имена файлов.
5. хорошо бы иметь тестовую БД, где есть все варианты данных для проверки с известным результатом.

Есть мнение, что любой проект начинается с разработки процедур тестирования.
13 сен 16, 09:23    [19657448]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
[quot Дедушка]Lepsik,
--Основная "проблема" с тестированием t-sql это не написать скрипт, а удобство запуска таких тестов,
удобство задания параметров теста (ваше IF 1 <> @result)

разумеется я привел простейший вариант теста с простейшей проверкой. Но я стараюсь не писать юнит-тестов превышаюшем пары экранов

---и встраивание в процесс непрерывной интеграции.
--Как вы ваши файлы запускаете?

Есть scriptrun.bat : sqlcmd -S (local),1433 -E -d TestBase -i %1

и autorun.bat :

call scriptrun.bat unit_test@triggers.sql

call scriptrun.bat unit_test@report.sql

call scriptrun.bat unit_test@version300.sql

call scriptrun.bat unit_test@stickets.sql
.....
И еше несколько десятков файлов.

@echo ^P^G

Потом питон скрип проверить результат прогона.

При отладке кода в MSSMS гоняю все сопричасные тесты к теме логики, а билд машина прогоняет ежедневно сама все файлы с тестами.

В год я пишу примерно 1-2 мегобайта таких юнит и функциональных тестов.
Кроме того нагрузочные тесты, но это уже на C# и автотесты (Selenium)
13 сен 16, 10:55    [19657949]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Гавриленко Сергей Алексеевич
Lepsik
Если вы SQL девелопер и не пишете сами юнит тесты - удачи пользователям продакшина

Я даже не знаю, что хуже: юнит-тест, который тестит 5% функционала, но рождает ложную уверенность, что все хорошо, или вообще их отсутствие.


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

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

От всего лишь от лени разработчиков вроде вас.
В корпорациях где я обычно обитаю это считается большим плюсом в карму (бонусы и зарплата). Я понимаю что вам лениво, но я еше и документацию пишу к коду и функциональные и операционные спеки.

--- Для этого обычно тестеров заводят есть в команде.

Если хочешь сделать хорошо сделай сам (С) злодей из фильма Пятый елемент.

Тестеры - они конечный продукт тестируют a фукциональность и всех нюансы логики кода внутри никогда не увидят.
13 сен 16, 11:08    [19658033]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Lepsik
Тестеры - они конечный продукт тестируют a фукциональность и всех нюансы логики кода внутри никогда не увидят.
В ваших корпорация просто не те тестеры обитают.
Lepsik
Если хочешь сделать хорошо сделай сам (С) злодей из фильма Пятый елемент.
Ага. Полы в офисе тоже сами моете, если ответственные за это люди сделали вдруг это плохо?

Сообщение было отредактировано: 13 сен 16, 11:32
13 сен 16, 11:17    [19658105]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Гавриленко Сергей Алексеевич
В ваших корпорация просто не те тестеры обитают.

+1
самотестирование ето очнеь хорошо и важно,но классный QA инженер ето савсем другое, уних мозги по другому думают ,ИМХО
13 сен 16, 11:31    [19658207]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
Maxx
Гавриленко Сергей Алексеевич
В ваших корпорация просто не те тестеры обитают.

+1
самотестирование ето очнеь хорошо и важно,но классный QA инженер ето савсем другое, уних мозги по другому думают ,ИМХО
Здесь дело даже не в этом. Я себе с трудом представляю команду, где каждый по какой-то своей логике пишет в год 2 Мб юнит-тестов, потом уходит, и кому-то надо в этом разбираться. Уж лучше пусть все будет в команде QA на одном фреймворке с одинаковой структурой, чем такой зоопарк.

Сообщение было отредактировано: 13 сен 16, 11:35
13 сен 16, 11:34    [19658227]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Maxx
Гавриленко Сергей Алексеевич
В ваших корпорация просто не те тестеры обитают.

+1
самотестирование ето очнеь хорошо и важно,но классный QA инженер ето савсем другое, уних мозги по другому думают ,ИМХО


В круг обязанностей QA-инженера входит:
— Анализ и уточнение требований с заказчиком или бизнес-аналитиками;
— Планирование процесса тестирования;
— Написание тест-кейсов (сценариев тестирования);
— Тестирование функционала;
— Идентификация проблемных мест, внесение их в трэкинговую систему;
— Обсуждение фиксов с разработчиками;
— Отслеживание жизненного цикла ошибок;
— Ре-тест починенных дефектов;
— Анализ тестирования;
— Оптимизация процесса тестирования;
— Анализ процессов работы в команде;
— Улучшение процессов;
— Ведение тестовой документации.

Как видите в круг обязанностей не входит ничего из того что я написал. Вам просто не хочется признать что у вас в девелопменте выпал целый пласт процесса.

Еше раз перечислю:
1. unit tests
2. functional tests
3. load tests
4. auto tests

первые два - обязаность девелопера
третий performance team
четвертый может поддерживатся разработчиком-тестировшиком.
13 сен 16, 11:49    [19658347]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Гавриленко Сергей Алексеевич
Maxx
пропущено...

+1
самотестирование ето очнеь хорошо и важно,но классный QA инженер ето савсем другое, уних мозги по другому думают ,ИМХО
Здесь дело даже не в этом. Я себе с трудом представляю команду, где каждый по какой-то своей логике пишет в год 2 Мб юнит-тестов, потом уходит, и кому-то надо в этом разбираться. Уж лучше пусть все будет в команде QA на одном фреймворке с одинаковой структурой, чем такой зоопарк.



Разуумеется одно из требований написания теста - читаемость. Код юнит тестов как и сам код проходит ревью других разработчиков. Когда девелопер уходит - поддержанием и
написанием занимаются другие.

Если код не имеет покрытия юнитестами - он просто не попадет в репозиторий.
13 сен 16, 11:52    [19658386]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Гавриленко Сергей Алексеевич
Lepsik
Тестеры - они конечный продукт тестируют a фукциональность и всех нюансы логики кода внутри никогда не увидят.
В ваших корпорация просто не те тестеры обитают.


У тестеров нет доступа к коду - они тестируют конечный продукт и не могут оттеcтировать все реальные ситуации.
И в конце концов они тоже люди.

Lepsik
Если хочешь сделать хорошо сделай сам (С) злодей из фильма Пятый елемент.
Ага. Полы в офисе тоже сами моете, если ответственные за это люди сделали вдруг это плохо?[/quot]

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

Кстати, по иронии судьбы именно сейчас я в нашем японском филиале буду читать курсы для местных девелоперов как писать юнит тесты.
13 сен 16, 12:00    [19658458]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Lepsik,
а не поделитесь как у вас организован процесс CI (в контексте t-sql)?
А то вот это
Lepsik
билд машина прогоняет ежедневно сама все файлы с тестами.
много вопросов порождает
13 сен 16, 12:50    [19658847]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Дедушка
Lepsik,
а не поделитесь как у вас организован процесс CI (в контексте t-sql)?
А то вот это
Lepsik
билд машина прогоняет ежедневно сама все файлы с тестами.
много вопросов порождает


Я уже вроде как все описал выше CI запускает выполнение всех скриптов в только что созданной базе - output всех этих файлов обрабатывается скриптом - если все PASSED - все хорошо, если FAILED скрипт отправляет автору последнего сабмита результат поломки скрипта с текстом какие именно тесты поломались.

Это собственно для C++/C#/Java одинаково у нас работает.
13 сен 16, 14:44    [19659551]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Lepsik
CI запускает выполнение всех скриптов в только что созданной базе
как делаете наполнение этой базы для каждого конкретного теста исходными данными, после каждого теста чистите базу (пересоздаёте)?
13 сен 16, 15:30    [19659911]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
dymka
Member

Откуда: г. Альметьевск (Татарстан)
Сообщений: 235
Дедушка
Lepsik
CI запускает выполнение всех скриптов в только что созданной базе
как делаете наполнение этой базы для каждого конкретного теста исходными данными, после каждого теста чистите базу (пересоздаёте)?


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

ЗЫ: не спрашивайте про тестирование TSQL, это у нас у самих не реализовано. Сам смотрю эту темку, т.к. актуально. У нас реализовано ФТ на уровне клиента, но проблема с данными там такая же.
13 сен 16, 15:45    [19659997]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
ппп-пп
Guest
Гавриленко Сергей Алексеевич
Maxx
пропущено...

+1
самотестирование ето очнеь хорошо и важно,но классный QA инженер ето савсем другое, уних мозги по другому думают ,ИМХО
Здесь дело даже не в этом. Я себе с трудом представляю команду, где каждый по какой-то своей логике пишет в год 2 Мб юнит-тестов, потом уходит, и кому-то надо в этом разбираться. Уж лучше пусть все будет в команде QA на одном фреймворке с одинаковой структурой, чем такой зоопарк.


Ну вообще-то unit test-ы пишут не QA, а сами разработчики. И на проектах где работает параллельно 200 человек, они за год могут написать и гораздо больше unit test-ов.
13 сен 16, 16:05    [19660106]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
baracs
Member

Откуда: Москва
Сообщений: 7204
Lepsik
В круг обязанностей QA-инженера входит:
— Анализ и уточнение требований с заказчиком или бизнес-аналитиками;
— Планирование процесса тестирования;
— Написание тест-кейсов (сценариев тестирования);
— Тестирование функционала;
— Идентификация проблемных мест, внесение их в трэкинговую систему;
— Обсуждение фиксов с разработчиками;
— Отслеживание жизненного цикла ошибок;
— Ре-тест починенных дефектов;
— Анализ тестирования;
— Оптимизация процесса тестирования;
— Анализ процессов работы в команде;
— Улучшение процессов;
— Ведение тестовой документации.

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

Вам намекнули на несовершенство вашего примера, а вы кинулись обличать и доказывать очевидное - что разработчик должен убедиться в работоспособности своего творения. Странный способ саморекламы.
13 сен 16, 16:11    [19660142]     Ответить | Цитировать Сообщить модератору
 Re: Тестирование кода T-SQL  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Дедушка
Lepsik
CI запускает выполнение всех скриптов в только что созданной базе
как делаете наполнение этой базы для каждого конкретного теста исходными данными, после каждого теста чистите базу (пересоздаёте)?


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

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

---Я вижу попытку распространить порядки какой-то корпорации на весь окружающий мир.

Этот пример из первого листа выдачи в Яндексе. Весь мой опыт с группой тестирования во всех организациях всегда сводился к написанию test case-ов для них, а они их выполняли.
14 сен 16, 03:34    [19661942]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить