Здравствуйте, Alexander Polyakov, Вы писали:
AP>В старые времена SQL был в magic строках, и такой код покрывался тестами. А что сейчас с приходом LINQ, пишутся ли тесты на DAL?
Да в принципе не обязательно. Пользую EF с лямбдами (мне как-то ближе Fluent синтаксис).
Но вот хочется найти приблуду к EF, которая верифицирует реальную базу и dbcontext- существование таблиц, полей и прочее.
Самому писать как-то долго такую вещь.
Re: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, Alexander Polyakov, Вы писали:
AP>В старые времена SQL был в magic строках, и такой код покрывался тестами. А что сейчас с приходом LINQ, пишутся ли тесты на DAL?
Зависит от ваших целей/задач по тестированию, сложности и критичности linq запроса. DAL-функциии, использующие Plain SQL запросы я тестирую только когда они относятся к самой критичной (важной) части системы, либо когда SQL запрос/процедура сложны и лучше написать тест и спать спокойно. Функции содержащие запросы на Linq2db, так же используемом у нас в проекте, я тестирую полностью, во-первых, и в целом тесты не помешают, во-вторых, linq2db — это сторонняя библиотека, в которой к сожалению могут возникать ошибки или изменения в поведении например при обновлении версии.
В общем, по ситуации
Re[2]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, MozgC, Вы писали:
MC>Здравствуйте, Alexander Polyakov, Вы писали:
AP>>В старые времена SQL был в magic строках, и такой код покрывался тестами. А что сейчас с приходом LINQ, пишутся ли тесты на DAL?
MC>Зависит от ваших целей/задач по тестированию, сложности и критичности linq запроса. DAL-функциии, использующие Plain SQL запросы я тестирую только когда они относятся к самой критичной (важной) части системы, либо когда SQL запрос/процедура сложны и лучше написать тест и спать спокойно. Функции содержащие запросы на Linq2db, так же используемом у нас в проекте, я тестирую полностью, во-первых, и в целом тесты не помешают, во-вторых, linq2db — это сторонняя библиотека, в которой к сожалению могут возникать ошибки или изменения в поведении например при обновлении версии. MC>В общем, по ситуации
Я правильно понимаю, что текстовый SQL вы тестируете не всегда, а LINQ всегда? Хотя казалось бы должно быть наоборот.
Re: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, Alexander Polyakov, Вы писали:
AP>В старые времена SQL был в magic строках, и такой код покрывался тестами. А что сейчас с приходом LINQ, пишутся ли тесты на DAL?
Как по мне — linq это как блоки для постройки дома. И даже если все блоки хорошего качества, то не факт что вы их правильно сложили (запрос вернет то, что ожидали, да и вообще корректен). Поэтому тестировать сами запросы и команды к DAL IMHO надо.
Re[3]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, Doc, Вы писали:
Doc>Как по мне — linq это как блоки для постройки дома. И даже если все блоки хорошего качества, то не факт что вы их правильно сложили (запрос вернет то, что ожидали, да и вообще корректен). Поэтому тестировать сами запросы и команды к DAL IMHO надо.
Ваши тесты обязаны пропустить все запросы через базу или не обязательно все? Если обязаны пропустить все запросы, тогда зачем вы используете LINQ?
Re[4]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, MozgC, Вы писали:
AP>>Я правильно понимаю, что текстовый SQL вы тестируете не всегда, а LINQ всегда? MC>Да, и я причины, по которым у нас именно так, я написал выше.
Ваши тесты обязаны пропустить все запросы через базу или не обязательно все? Если обязаны пропустить все запросы, тогда зачем вы используете LINQ?
Re[3]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, Alexander Polyakov, Вы писали:
AP>Ваши тесты обязаны пропустить все запросы через базу или не обязательно все?
Мы же не тестируем сам Linq и EF. Поэтому как правило хватает мока DbContext, который использует массив с заранее заданными тестовыми данными. Еще раз подчеркну, что цель теста — убедиться в правильности составления самого запроса, в том что он возвращает требуемые данные.
Re[4]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, Doc, Вы писали:
Doc>Мы же не тестируем сам Linq и EF. Поэтому как правило хватает мока DbContext, который использует массив с заранее заданными тестовыми данными. Еще раз подчеркну, что цель теста — убедиться в правильности составления самого запроса, в том что он возвращает требуемые данные.
Делать мок DbContext на массивах проще, чем написать наполнение тестовой базы?
Re[5]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, Alexander Polyakov, Вы писали:
AP>Ваши тесты обязаны пропустить все запросы через базу или не обязательно все? Если обязаны пропустить все запросы, тогда зачем вы используете LINQ?
Не обязательно все. Linq используем из-за строгой типизации; возможности автоматической генерации классов сущностей, после чего их сразу же можно использовать; из-за автоматического ORM; из-за упрощения рефакторинга БД и возможности переезда на другую БД; из-за того что нередко на LINQ запрос написать проще и быстрее (иногда наоборот, проще написать на SQL) и т.д.
Re[5]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, Alexander Polyakov, Вы писали:
Doc>>Мы же не тестируем сам Linq и EF. Поэтому как правило хватает мока DbContext, который использует массив с заранее заданными тестовыми данными. Еще раз подчеркну, что цель теста — убедиться в правильности составления самого запроса, в том что он возвращает требуемые данные. AP>Делать мок DbContext на массивах проще, чем написать наполнение тестовой базы?
Вставлю свои 5 копеек по поводу наполнения тестовой базы. Если тесты вызывают DAL-методы которые реально лезут в БД, то на моем опыте в такой ситуации проще подготовить минидамп базы для тестов. Т.е. это может быть миниверсия реальной базы (например 1 мб), в которой достаточно данных для тестов. Т.е., повторюсь, на моем опыте проще подготовить такой дамп (иногда его приходится обновлять конечно), чем готовить тестовые данные из тестов (тесты сильно разрастаются). Либо бывает смешанный подход, например большая часть нужных для теста данных в нужном виде уже есть в "тестовой минибазе", но если в очередном тесте где-то в базе надо флажок поправить для теста, то тут уже проще сделать это прямо из теста в транзакции, а не править дамп тестовой базы.
Re[5]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, Alexander Polyakov, Вы писали:
AP>Здравствуйте, Doc, Вы писали:
Doc>>Мы же не тестируем сам Linq и EF. Поэтому как правило хватает мока DbContext, который использует массив с заранее заданными тестовыми данными. Еще раз подчеркну, что цель теста — убедиться в правильности составления самого запроса, в том что он возвращает требуемые данные. AP>Делать мок DbContext на массивах проще, чем написать наполнение тестовой базы?
И проще и тесты выполняются быстрее.
Re[5]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, Alexander Polyakov, Вы писали:
AP>Делать мок DbContext на массивах проще, чем написать наполнение тестовой базы?
Сам код пишется 1 раз и затем таскается в виде внутренней либы из проекта в проект.
Что касается данных, то проще, т.к. для конкретного запроса готовятся только используемые им данные (массивы соответствующих Dto).
Еще один немаловажный момент — все определения явные, все данные для теста под рукой и их сразу видно. В частности, в блоке Arrange создается ожидаемый результат (Id, данные) и он копируется в мок БД. А в Assert идет сравнение с ним. А вот при использовании тестовой БД уже приходится полагаться на некие неявные данные (например что у user с id == 1 должен быть login == "mylogin" и если кто-то поменяет тестовые данные, то тест рухнет)
Разумеется, для проектов с сложными запросами (которые одновременно используют много таблиц) возможно проще и надежнее сделать тестовую БД. Однако в случае если задействованы 1-3 таблицы, хватает и массивов.
Re[6]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, MozgC, Вы писали:
MC>Либо бывает смешанный подход, например большая часть нужных для теста данных в нужном виде уже есть в "тестовой минибазе", но если в очередном тесте где-то в базе надо флажок поправить для теста, то тут уже проще сделать это прямо из теста в транзакции, а не править дамп тестовой базы.
Странный подход. По мне так или через БД тестировать или через моки. А у вас получается что ни мок ни БД не находятся в актуальном состоянии.
Re[7]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, Doc, Вы писали:
MC>>Либо бывает смешанный подход, например большая часть нужных для теста данных в нужном виде уже есть в "тестовой минибазе", но если в очередном тесте где-то в базе надо флажок поправить для теста, то тут уже проще сделать это прямо из теста в транзакции, а не править дамп тестовой базы.
Doc>Странный подход. По мне так или через БД тестировать или через моки. А у вас получается что ни мок ни БД не находятся в актуальном состоянии.
Причем тут моки? В БД есть все что нужно для большинства тестов, но иногда для очередного теста может чего-то не хватить, и бывает что в таком случае проще в строчку кода изменить данные в БД ддя проведения теста. Вот я о чём.
Re[8]: А пишут ли тесты на DAL, если используется LINQ?
Здравствуйте, MozgC, Вы писали:
MC>Причем тут моки? В БД есть все что нужно для большинства тестов, но иногда для очередного теста может чего-то не хватить, и бывает что в таком случае проще в строчку кода изменить данные в БД ддя проведения теста. Вот я о чём.
А, значит не так понял. Изначально прочитал что вы сначала читаете из БД, а потом в коде еще можете данные модифицировать. Смесь мока и БД. Но раз не так, то и вопроса нет. Это уже дело вкуса.