Здравствуйте, уважаемое сообщество.
Решил что нужно освоить unit tests. Хочу научиться писать тесты и применять их к уже написанному коду.
Начал изучать с видеоуроков, бред бесполезный в основном.
Перешел на текстовое освоение и тут в разных источниках (сайтах_ инструкции немного отличаются. Кажется суть понимать начал. Но ни одна инструкция мной не пройдена без ошибок от и до. Все время что-то стопорится. Проверяю по несколько раз и понимаю что устаревшие где-то.Прошу помощи. Что я делаю не так, почему выдаются ошибки?
Итак вот одна из инструкций.
https://lexusalex.ru/5-php-phpunit1. установил composer
2 установил phpunitКод (Text):
composer require —dev phpunit/phpunit:^9(У меня версия php 7.3.27, потому ставлю 9 юнит)
Тестирование доступно по пути: ./vendor/bin/phpunit
Хорошо. Дальше в инструкции говорится что мол так неудобно запускать, можно подругому.
Для этого нужно дополнить раздел scripts в composer.jsonКод (Text):
{ «require»: { «monolog/monolog»: «2.0.*», «phpmailer/phpmailer»:»^5.2″ }, «require-dev»: { «phpunit/phpunit»: «^9» }, «scripts»: { «test»: «phpunit —colors=always» } }После этого по инструкции нужно запустить команду:
Код (Text):
composer testЗапускаю и получаю:
Вопросы:
1. Что я пропустил или не учел?
2. Может быть вам известна более точная инструкция пошаговой работы с для новичка?
похоже что phpunit только в своей папке работает… пропишите путь к ней в системные переменные (Винда) или создайте линк на неё (Линукс)
Линк на phpunit куда создать?
Я сделал следующее:
Код (Text):
export PATH=$PATH:/home/agrey/composer-test/vendor/bin/Также не помогло.
Вроде бы разобрался, В секции scripts нужно было указать так:
«test»: «phpunit —colors=always tests»,
т.е. в конце добавить папку или файлы для тестапосле изменений заработало
phpunit ещё конфиг из xml-файла подхватывать умеет
Код (Text):
php «vendor/bin/phpunit» -c «build/config/phpunit.xml» —log-junit «build/logs/junit.xml»Код (Text):
<?xml version=»1.0″ encoding=»UTF-8″?> <phpunit xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xsi:noNamespaceSchemaLocation=»https://schema.phpunit.de/9.3/phpunit.xsd» bootstrap=»../../vendor/autoload.php» colors=»true» verbose=»true»> <coverage> <include> <directory suffix=».php»>../../src</directory> </include> <report> <clover outputFile=»../output/phpunit.coverage-clover.xml»/> <html outputDirectory=»../output/code-coverage»/> </report> </coverage> <php> <ini name=»error_reporting» value=»-1″/> </php> <testsuites> <testsuite name=»Tests»> <directory>../../tests</directory> <exclude>../../tests/config</exclude> <exclude>../../tests/src</exclude> </testsuite> </testsuites> <logging/> </phpunit>
Спасибо. Видел, но пока еще не изучал эту часть.
Вопрос есть по групповым проверкам. А как делать их?
Вот например. У меня есть валидация пароля. Я хочу проверить пару десятков разных паролей. Неужели на каждый пароль мне свой метод писать нужно test_password2, test_password3 etc????PHP:
public function test_password() { $message = «»; $this->form[‘password_confirm’] = $this->form[‘password’] = ‘123QWEqwe’; $formuser = new Cformuser($this->form); $message_arr = $formuser->validate(); $message = $message_arr[‘password’]; } $this->assertEmpty($message_arr, $message); }Мне каежстя это же можно как-то в цикле сделать? Я могу конечно напиисать массив из паролей в метод и просто запускать его в цикле и выводить в ошибку ключи массива неправильные, но мне кажется в phpunit что-то должно быть такое. Задача выгляидт слишком тривиально.
Пока еще не нашел примеров по моему вопросу, буду благодарен за пендель в нужном направлении
attributes — data-provider
Но внутри будет тот же массив.
Ну конечно можно. Но это несущественный чисто технический вопрос. Каждый тест должен решать отдельную задачу, доказывая что целевой класс или модуль выполняет некую цель заданным способом. Если для этого надо проверить десять паролей окей, фигачь их в одном тесте. Если каждый пароль проверяет какой-то свой нюанс, можно и на несколько тестов разбить. Но у этих тестов должны быть осмысленные имена чтобы по ним сразу было понятно что пошло не так.
— Добавлено —
То есть testPassword1, testPassword2 это пример неправильного подхода.
Всем спасибо за предыдущие комментарии. Был перерыв с тестами, сейчас снова вернулся к ним. Все туториалы идут на примерах простых тестов. Но мне вот сходу нужно простетировать модуль «Менеджер задач». Смотрю на констурктор класса и не понимаю с какого бока тут браться за тестирования. Может кто-то скажет логику, что бы вы тестировали у конструктора
PHP:
class bcron { … public function __construct() { global $config; $config[‘log_dir’] = $config[‘install_dir’] . «/logs»; } $config[‘log_file’] = $config[‘log_dir’] . «/» . $config[‘project_id’] . «.log»; } //Фиксация времени старта $this->get_date_array(); //проверка существования таблицы, if (!$this->check_exist_table(self::TABLE_CRON_CMD) || !$this->check_exist_table(self::TABLE_CRON)) { $message = «The tables of this module are missing. Apply the migration mig20230117_000000.inc.php»; self::tellMe([«text» => $message, «status» => «error»]); exit; } $this->stack_range = 4; $this->descriptorspec = [ 0 => [‘pipe’, ‘r’], 1 => [‘pipe’, ‘w’], 2 => [‘file’, ‘bcron-log’, «a»] ]; $this->descriptorspec[2] = [‘file’, $config[‘log_file’], ‘a’]; } } … }— Добавлено —
Вот мое предположение:
- Вызывается 1 раз ::get_date_array() и что массив с датой будет не пустой.
- Никогда не вызывается ::tellMe
- Вызывается 2 раза ::check_exist_table(). Как понял из туториалов, необходимо сделать дубль метода check_exist_table() чтобы не велось обращение к БД.
Поправьте, если я не прав.
Возможно, это оффтопик, но код должен быть написан так, чтоб его можно тестировать, иначе это будет боль и страдание и только видимость тестов, не имеющая практической ценности.
Для того, чтобы научиться писать код так, чтобы он был тестируемым, я рекомендую TDD.
Для того, чтобы не обращаться к БД в тестах, нужны моки, а для этого нужно выносить зависимости.
Ну и psr12.
Похожие записи:
- Почему установка phpunit через composer выдает ошибку?
- Генератор строк документации в типе Google
- Шаблон проектирования Factory / Builder в Python
- Как составлять регулярные выражения для Яндекс.Метрики
- Почему после настройки новой сети соединение с моим сервером minecraft (через nginx) было потеряно, в то время как все другие службы, обслуживаемые nginx, работают нормально?