Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
Всем привет. Коллеги с опытом в написании кода правильно обвешанного тестами, подскажите пожалуйста, как вы вешаете тесты на функции взаимодействующие с базой. Например (ситуация из жизни одного проекта, который я доооолго отлаживал вручную, потому что не знал как вообще подойти к нему с автоматическими тестами) : Есть система расписаний учеников. В этой системе любой урок может быть перемещён. При этом есть множество вариантов поведения: - Занятие перемещается на свободное время - всё ок - Занятие перемещается на занятое время у ученика - сообщение и откат изменений - Занятие перемещается на занятое время у учителя - другое сообщение и откат изменений - Занятие перемещается на зарезервированное время под другое занятие - запрос по отмене резерва, при отрицательном ответе откат .... Ну и бла-бла-бла, все описывать не буду (да и уже не все возможные варианты помню, тем более там была авторазметка, что ещё усложняло задачу). Итак, запуск каждого из тестов в принципе может не сработать и сломать базу. Получается, каждый тест перед началом своей работы должен откатить тестовую базу к своему исходному состоянию, а по окончанию сравнить результат с ещё одной базой (заранее подготовленным результатом)? Звучит как-то неправильно. Это же сколько дампов надо иметь, и все их вгружать в базу для тестов. В общем, подскажите, как вы тестируете функции, входом и выходом которых является БД? (возможно я вообще не с той стороны подошёл) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2016, 06:14 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
Почитайте про database fixturex, например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2016, 08:58 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
HettПочитайте про database fixturex, например Гугл мне показал только результаты на сочетание "Data fixtures". Если это оно, то не вижу большой разницы в том, что тестовые данные будут лежать в sql файлах или в php. Вопрос в том, а должны ли эти дампы вообще там лежать, или же к тестированию функций по работе с БД подходят совсем иначе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2016, 09:43 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
юнит тесты не работают с БД по определению ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 01:05 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
ScareCrow, По какому определению? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 08:15 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
ScareCrow, По какому определению? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 08:15 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
HettScareCrow, По какому определению? по определению юнит тестов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 10:26 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
ScareCrowHettScareCrow, По какому определению? по определению юнит тестов. ScareCrow, а если у нас есть метод следующего содержания: Код: php 1. 2. 3. 4. 5. 6. 7. 8. Мне хочется быть уверенным, что новый код не сломает этот метод. И что я получу предусмотренные ошибки, и получу их правильно. А также, что если ошибки не получены, то я должен быть уверен, что запись данных произошла, и произошла правильно. Как мне вообще протестировать этот метод и когда это делать следует? Только прошу дать практический совет, а не "делается это на этапе интеграционного тестирования, про которое можно почитать в интернете". Это фраза, которую я от момента появления этого вопроса у меня в голове прочитал уже полтора десятка раз. Но ни один из источников не пояснил, а как же это всё-таки делается :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 14:49 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
1) метод кривой. 2) мокать метод save и findErrorModel смотреть что они вызваны возвращать нужный результат и ассертить его с ожидаемым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 15:17 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
ПрограмёрТолько прошу дать практический совет, а не "делается это на этапе интеграционного тестирования, про которое можно почитать в интернете". Это фраза, которую я от момента появления этого вопроса у меня в голове прочитал уже полтора десятка раз. Но ни один из источников не пояснил, а как же это всё-таки делается :)Значит, определение модульного тестирования до тебя не дошло. Оно тестирует только тот код который находится непосредственно в тестируемом методе. Методы model.save, findErrorModel - тестируются отдельно, вне теста метода saveData. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 15:25 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
Вообще, для тестирования логики в БД (в т.ч. и sql запросов) достаточно не делать commit, и проверять результаты в той же транзакции. Проблема в том что php программисты значения слова "транзакция" обычно не знают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 15:29 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
Все правильноПрограмёрТолько прошу дать практический совет, а не "делается это на этапе интеграционного тестирования, про которое можно почитать в интернете". Это фраза, которую я от момента появления этого вопроса у меня в голове прочитал уже полтора десятка раз. Но ни один из источников не пояснил, а как же это всё-таки делается :)Значит, определение модульного тестирования до тебя не дошло. Оно тестирует только тот код который находится непосредственно в тестируемом методе. Методы model.save, findErrorModel - тестируются отдельно, вне теста метода saveData. То есть, в приближении к идеалу, для покрытия 100% кода тестами, КАЖДЫЙ метод/функция/класс должен иметь fake аналог? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 17:48 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
чего? юнит тесты отличатся от остальных именно подменой зависимостей на моки/стабы. https://phpunit.de/manual/current/en/test-doubles.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 17:53 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
ScareCrowчего? юнит тесты отличатся от остальных именно подменой зависимостей на моки/стабы. https://phpunit.de/manual/current/en/test-doubles.html Я понимаю. Но где та граница, на которой заканчиваются эти подмены? Если бы это были не $model->save(), а $pdo->execute, его тоже надо было бы подменять? А если это вызов функции array_merge или iconv? А что, если это метод Helper::encode, который является обёрткой для iconv? Для простоты, напишите, что из этого следует мокать, а что нет (и почему): 1. $model->save() 2. $pdo->exec($request) // где $pdo - это экземпляр класса PDO из соответствующей библиотеки 3. $a = array_merge($a1, $a2) 4. $str = iconv('CP1251', 'UTF8', $badEncodedString) 5. $str = mb_substr($someStr, $start) 6. $str = $helper->encode($badEncodedString) // где $helper - экземпляр класса Helper При достаточно аргументированном ответе это прояснит ситуацию полностью. Буду благодарен за такую значимую помощь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 18:18 |
|
||
|
Unit тесты и БД
|
|||
|---|---|---|---|
|
#18+
Прочтение доки про phpunit снимет все эти вопросы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2016, 22:32 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=39246573&tid=1461052]: |
0ms |
get settings: |
9ms |
get forum list: |
22ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 269ms |
| total: | 457ms |

| 0 / 0 |
