powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Unit тесты и БД
16 сообщений из 16, страница 1 из 1
Unit тесты и БД
    #39245566
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Коллеги с опытом в написании кода правильно обвешанного тестами, подскажите пожалуйста, как вы вешаете тесты на функции взаимодействующие с базой.

Например (ситуация из жизни одного проекта, который я доооолго отлаживал вручную, потому что не знал как вообще подойти к нему с автоматическими тестами) :
Есть система расписаний учеников. В этой системе любой урок может быть перемещён. При этом есть множество вариантов поведения:
- Занятие перемещается на свободное время - всё ок
- Занятие перемещается на занятое время у ученика - сообщение и откат изменений
- Занятие перемещается на занятое время у учителя - другое сообщение и откат изменений
- Занятие перемещается на зарезервированное время под другое занятие - запрос по отмене резерва, при отрицательном ответе откат
....

Ну и бла-бла-бла, все описывать не буду (да и уже не все возможные варианты помню, тем более там была авторазметка, что ещё усложняло задачу).

Итак, запуск каждого из тестов в принципе может не сработать и сломать базу. Получается, каждый тест перед началом своей работы должен откатить тестовую базу к своему исходному состоянию, а по окончанию сравнить результат с ещё одной базой (заранее подготовленным результатом)?

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

В общем, подскажите, как вы тестируете функции, входом и выходом которых является БД? (возможно я вообще не с той стороны подошёл)
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39245573
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитайте про database fixturex, например
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39245577
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettПочитайте про database fixturex, например

Гугл мне показал только результаты на сочетание "Data fixtures". Если это оно, то не вижу большой разницы в том, что тестовые данные будут лежать в sql файлах или в php.

Вопрос в том, а должны ли эти дампы вообще там лежать, или же к тестированию функций по работе с БД подходят совсем иначе?
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39245819
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
юнит тесты не работают с БД по определению
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39245854
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

По какому определению?
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39245855
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

По какому определению?
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39245981
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettScareCrow,

По какому определению?
по определению юнит тестов.
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39246235
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowHettScareCrow,

По какому определению?
по определению юнит тестов.


ScareCrow, а если у нас есть метод следующего содержания:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
function saveData($model1, $model2, $model3){
    if($model1->save() && $model2->save() && $model3->save()){
        return true;
    }else{
        $this->errorModel = findErrorModel([$model1, $model2, $model3]);
        return false;
    }
}



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

Как мне вообще протестировать этот метод и когда это делать следует?

Только прошу дать практический совет, а не "делается это на этапе интеграционного тестирования, про которое можно почитать в интернете". Это фраза, которую я от момента появления этого вопроса у меня в голове прочитал уже полтора десятка раз. Но ни один из источников не пояснил, а как же это всё-таки делается :)
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39246276
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) метод кривой.
2) мокать метод save и findErrorModel смотреть что они вызваны возвращать нужный результат и ассертить его с ожидаемым.
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39246283
ПрограмёрТолько прошу дать практический совет, а не "делается это на этапе интеграционного тестирования, про которое можно почитать в интернете". Это фраза, которую я от момента появления этого вопроса у меня в голове прочитал уже полтора десятка раз. Но ни один из источников не пояснил, а как же это всё-таки делается :)Значит, определение модульного тестирования до тебя не дошло.
Оно тестирует только тот код который находится непосредственно в тестируемом методе. Методы model.save, findErrorModel - тестируются отдельно, вне теста метода saveData.
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39246287
Вообще, для тестирования логики в БД (в т.ч. и sql запросов) достаточно не делать commit, и проверять результаты в той же транзакции. Проблема в том что php программисты значения слова "транзакция" обычно не знают.
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39246398
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все правильноПрограмёрТолько прошу дать практический совет, а не "делается это на этапе интеграционного тестирования, про которое можно почитать в интернете". Это фраза, которую я от момента появления этого вопроса у меня в голове прочитал уже полтора десятка раз. Но ни один из источников не пояснил, а как же это всё-таки делается :)Значит, определение модульного тестирования до тебя не дошло.
Оно тестирует только тот код который находится непосредственно в тестируемом методе. Методы model.save, findErrorModel - тестируются отдельно, вне теста метода saveData.

То есть, в приближении к идеалу, для покрытия 100% кода тестами, КАЖДЫЙ метод/функция/класс должен иметь fake аналог?
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39246403
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чего? юнит тесты отличатся от остальных именно подменой зависимостей на моки/стабы.
https://phpunit.de/manual/current/en/test-doubles.html
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39246434
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

При достаточно аргументированном ответе это прояснит ситуацию полностью. Буду благодарен за такую значимую помощь :)
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39246573
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочтение доки про phpunit снимет все эти вопросы
...
Рейтинг: 0 / 0
Unit тесты и БД
    #39246589
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowПрочтение доки про phpunit снимет все эти вопросы

Аргументировано и подробно. Я знал, что на тебя можно положиться. Спасибо :)
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Unit тесты и БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]