Тестирование генератора SQL
От: dmitry_npi Россия  
Дата: 22.05.19 09:50
Оценка:
Здравствуйте.

Пишу сюда, потому что раздел "Тестирование", кажется, мёртв.
В общем, в нашей системе есть классы, которые генерируют SQL-код по неким переданным параметрам (в виде объектов).
Сейчас тесты выглядят как-то так:

string generatedSql = generator.BuildSelectStatement(queryOptions);
Assert.AreEqual(generatedSql, @"SELECT T.f1, T.f2 FROM table1 T WHERE T.f1=42"); // типа того, только намного длиннее


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

Какой есть "правильный" способ тестировать такое?
Атмосферная музыка — www.aventuel.net
Re: Тестирование генератора SQL
От: GarryIV  
Дата: 22.05.19 10:14
Оценка: +1
Здравствуйте, dmitry_npi, Вы писали:

_>
_>string generatedSql = generator.BuildSelectStatement(queryOptions);
_>Assert.AreEqual(generatedSql, @"SELECT T.f1, T.f2 FROM table1 T WHERE T.f1=42"); // типа того, только намного длиннее
_>


_>И тесты получаются очень хрупкие. Во-первых, мешается форматирование — пробельчики и тому подобное.Во-вторых, стоит добавить, например, в генерируемый код комментарий, и приходится добавлять его в тесты.


_>Какой есть "правильный" способ тестировать такое?


Можно выполнять запросы на тестовой БД и сравнивать результаты.
Можно парсить запросы/нормализовать и сравнивать уже после этого.
WBR, Igor Evgrafov
Re[2]: Тестирование генератора SQL
От: dmitry_npi Россия  
Дата: 22.05.19 10:20
Оценка:
Здравствуйте, GarryIV, Вы писали:


GIV>Можно парсить запросы/нормализовать и сравнивать уже после этого.

Хотелось бы пойти по этому пути, но не хочется тестировать сам код тестирования . Знаете какую-нибудь библиотеку для этого (C#)?
Атмосферная музыка — www.aventuel.net
Re: Тестирование генератора SQL
От: Буравчик Россия  
Дата: 22.05.19 10:26
Оценка: 10 (4)
Здравствуйте, dmitry_npi, Вы писали:

_>И тесты получаются очень хрупкие. Во-первых, мешается форматирование — пробельчики и тому подобное.Во-вторых, стоит добавить, например, в генерируемый код комментарий, и приходится добавлять его в тесты.


_>Какой есть "правильный" способ тестировать такое?


Как вариант:

Добавить промежуточный слой. BuildSelectStatement генерирует промежуточные объекты Select, From, Where.
Например, на основе queryOptions будет сформировано: Select('T.f1'), Select('T.f1'), From('table1', 'T'), Where('T.f1=42'), NestedQuery(), OrderBy(), etc
Тестировать количество получившихся промежуточных объектов.

Потом из этих промежуточных объектов формировать строку запроса.
Протестировать построение строки запроса из небольшого количества промежуточных объектов.

Ну и еще варианты (которые, скорее всего, "не варианты"):
— Оставить как есть. Но раз задали вопрос, то проблема назрела.
— Не тестировать получившийся запрос как строку. Тестировать отправляя запрос в БД с тестовыми данными. Для больших запросов — не реально, т.к. трудно готовить тестовые БД.
Best regards, Буравчик
Re[3]: Тестирование генератора SQL
От: GarryIV  
Дата: 22.05.19 10:56
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

GIV>>Можно парсить запросы/нормализовать и сравнивать уже после этого.

_>Хотелось бы пойти по этому пути, но не хочется тестировать сам код тестирования . Знаете какую-нибудь библиотеку для этого (C#)?

За C# не знаю (мы в Java парсили), гугл говорит что тоже есть либы.
Сильно зависит от диалекта, с DML все было относительно хорошо, проблемы были с DDL.
WBR, Igor Evgrafov
Re: Тестирование генератора SQL
От: IT Россия linq2db.com
Дата: 22.05.19 12:43
Оценка: +2
Здравствуйте, dmitry_npi, Вы писали:

_>Какой есть "правильный" способ тестировать такое?


Простейший метод, удаляющий лишние пробелы, табы, переводы строк, комментарии из сравниваемых строк.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Тестирование генератора SQL
От: · Великобритания  
Дата: 22.05.19 17:09
Оценка: +1
Здравствуйте, dmitry_npi, Вы писали:

_>И тесты получаются очень хрупкие. Во-первых, мешается форматирование — пробельчики и тому подобное.Во-вторых, стоит добавить, например, в генерируемый код комментарий, и приходится добавлять его в тесты.

Ещё как вариант — тесты писать как whitebox и делать ассерты более слабыми в большинстве тестов, чтобы они тестировали только определённый аспект функциональности.
Т.е. например,
string generatedSql = generator.BuildSelectStatement(queryOptions.withF1(42));
Assert.ContainsSubstring(generatedSql, @"T.f1=42");

Ну и сделать пару сложных тестов, которые сравнивают строки целиком и только они будут хрупкими.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Тестирование генератора SQL
От: wildwind Россия  
Дата: 23.05.19 06:07
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

_>Какой есть "правильный" способ тестировать такое?


Это зависит от определения "правильности". В чем смысл данного теста? Что он должен проверять? Что генератор сгенерировал "нечто" синтаксически правильное? Тогда проверить это можно, подключившись к БД и выполнив prepare.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.