Рубрики
Uncategorized

Тест Ларавеля: Вводный урок PHPUnit

Автор оригинала: David Wong.

Познакомьте с базовыми знаниями о тестировании PHPUnit, используя базовые утверждения PHPUnit и помощников по тестированию Laravel.

вводить

PHPUnit-один из старейших и наиболее известных пакетов модульного тестирования PHP. Он в основном используется для модульного тестирования, что означает, что вы можете тестировать код с минимальным количеством компонентов, насколько это возможно, но он также очень гибкий и может использоваться не только для модульного тестирования.

PHPUnit содержит множество простых и гибких утверждений, которые позволяют легко тестировать ваш код и которые очень эффективны при тестировании определенных компонентов. Однако это означает, что тестирование более сложного кода, такого как контроллеры и проверка отправки форм, может быть намного сложнее.

Чтобы облегчить разработку разработчикам, платформа Laravel включает в себя ряд помощников по тестированию приложений, которые позволяют писать очень простые тесты PHPUnit для тестирования сложных частей приложения.

Цель этого руководства-познакомить вас с основами тестирования PHPUnit с использованием утверждений PHPUnit по умолчанию и помощников по тестированию Laravel. Цель состоит в том, чтобы в конце этого урока вы могли уверенно писать базовые тесты для своего приложения.

предпосылка

В этом руководстве предполагается, что вы уже знакомы с Laravel и знаете, как запускать команды в каталоге приложений (например, php artisan Order). Мы создадим несколько базовых примеров классов, чтобы узнать, как работают различные инструменты тестирования, поэтому мы рекомендуем вам создать новое приложение для этого урока.

Если Laravel установлен, вы можете создать новое тестовое приложение, выполнив следующие команды:

laravel new phpunit-tests

Кроме того, вы можете создавать новые приложения непосредственно с помощью Composer:

composer create-project laravel/laravel --prefer-dist

Другие способы установки также можно найти в документе Laravel.

Создайте новый тест

Первым шагом в использовании PHPUnit является создание нового тестового класса. Соглашение о тестовых классах заключается в том, что они хранятся в каталоге приложений. ./тесты/ Следующий. В этой папке каждому тестовому классу присваивается имя <имя>Test.php 。 Этот формат позволяет PHPUnit просматривать каждый тестовый класс — он будет игнорировать все, что этого не делает. Test.php Документы в конце.

В приложении нового уровня вы заметите, что ./тесты/ В каталоге есть два файла: ExampleTest.php Сумма TestCase.php . TestCase.php Этот файл является загрузочным файлом, используемым для настройки среды Laravel в наших тестах. Это позволяет нам использовать фасады Laravel в наших тестах и обеспечивает основу для наших помощников по тестированию, о которых мы расскажем позже. ExampleTest.php Пример тестового класса, который содержит базовые тестовые случаи с использованием помощников по тестированию приложений — временно игнорируйте его.

Чтобы создать новый тестовый класс, мы можем создать новый файл вручную или запустить команду Artisan, предоставленную Laravel. сделать:тест

Чтобы создать имя с именем Базовый тест Для тестового класса нам нужно только запустить команду artisan:

php artisan make:test BasicTest

Laravel создаст базовый тестовый класс, как показано ниже:

assertTrue(true);
    }
}

Самое важное, что здесь следует отметить, это тест Префикс в имени метода и Тест Суффикс имени класса один и тот же, поэтому тест Префикс указывает PHPUnit, какие методы следует запускать во время теста. Если ты забудешь. испытание Префикс, то PHPUnit проигнорирует этот метод.

Прежде чем мы запустим набор тестов в первый раз, необходимо указать на значение по умолчанию, предоставленное Laravel. phpunit.xml Документы. PHPUnit автоматически находит имя в текущем каталоге во время выполнения PHPUnit автоматически находит имя в текущем каталоге во время выполнения Или phpunit.xml.dist

В этом файле много информации, но теперь самая важная часть находится в testsuite Определение каталога:




    
        
            ./tests/
        
    

    ...

Это сообщает PHPUnit, что среда выполнения ./проверяет/ Тесты, найденные в каталоге, как мы знаем ранее, являются соглашением о хранении тестов.

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

Для выполнения теста вы можете выполнить следующую команду phpunit :

./vendor/bin/phpunit

Вы должны увидеть результат, похожий на этот:

PHPUnit 4.8.19 by Sebastian Bergmann and contributors.

..

Time: 103 ms, Memory: 12.75Mb

OK (2 tests, 3 assertions)

Теперь, когда у нас есть правильная настройка PHPUnit, пришло время приступить к написанию базового теста.

Обратите внимание, что он учитывает два теста и три утверждения потому что потому что Файл содержит тест с двумя утверждениями. Наш новый базовый тест включает в себя отдельное утверждение, которое прошло.

Напишите базовый тест

Чтобы помочь с основными утверждениями, предоставляемыми PHPUnit, мы сначала создадим базовый класс, который предоставляет некоторые простые функциональные возможности.

В ./приложение/ Создайте каталог с именем В ./приложение/

items = $items;
    }

    /**
    * Check whether the specified item is in the box.
    *
    * @param string $item
    * @return bool
    */
    public function has($item)
    {
        return in_array($item, $this->items);
    }

    /**
    * Remove items from the box, null if the box is empty.
    *
    * @return string
    */
    public function takeOne()
    {
        return array_shift($this->items);
    }

    /**
    * Retrieves all items from the box containing the beginning of the specified letter.
    *
    * @param string $letter
    * @return array
    */
    public function startsWith($letter)
    {
        return array_filter($this->items, function ($item) use ($letter) {
            return stripos($item, $letter) === 0;
        });
    }
}

Затем откройте свои ./тесты/BasicTest.php Класс (класс, который мы создали ранее) и удалите метод по умолчанию тестовый пример , вы должны оставить пустой класс.

Теперь мы будем использовать для нас семь основных утверждений PHPUnit. Коробка Тесты на написание уроков. Эти утверждения являются:

  • Утверждение истинно()
  • Утверждение ложно()
  • Утверждающие значения()
  • ассертНулл()
  • Утверждает()
  • Количество утверждений()
  • Пустота утверждения()

Утверждение истинно () и утверждение ложно ()

Утверждение истинно() Сумма Утверждение ложно() Позволяет вам объявить значение, равное true или false. Это означает, что они хорошо подходят для тестирования методов, возвращающих логические значения. В нашей Коробке В классе у нас есть имя с именем имеет($item) Метод, который возвращает соответствующее значение true или false, когда указанный элемент находится в или из коробки.

Чтобы написать тесты для этого в PHPUnit, мы можем сделать следующее:

assertTrue($box->has('toy'));
        $this->assertFalse($box->has('ball'));
    }
}

Обратите внимание, как мы передаем только один параметр в assertTrue() Сумма assertFalse() Метод, и он имеет($item) Ввод метода.

Если вы сейчас работаете ./поставщик/корзина/phpunit Команда, вы заметите, что вывод включает в себя:

OK (2 tests, 4 assertions)

Это означает, что наш тест пройден.

Если вы будете assertFalse() Замена _____________ Утверждение верно () И запустил phpunit Команда, вывод будет следующим:

PHPUnit 4.8.19 by Sebastian Bergmann and contributors.

F.

Time: 93 ms, Memory: 13.00Mb

There was 1 failure:

1) BasicTest::testHasItemInBox
Failed asserting that false is true.

./tests/BasicTest.php:12

FAILURES!
Tests: 2, Assertions: 4, Failures: 1.

Это говорит нам о том, что утверждение в строке 12 не может быть утверждено. ложь Значение равно true – Потому что мы будем Утверждать() Заменить на assertTrue()

Замените его обратно и снова запустите PHPUnit. Тест должен пройти снова, потому что мы исправили сломанный тест.

assertEquals () и assertNull ()

Далее, давайте посмотрим. ассертЕквалы() А также ассертНулл ()

ассертЕквалы() Он используется для сравнения того, равно ли фактическое значение переменной ожидаемому значению. Мы используем его для проверки. Возьми одного() Является ли возвращаемое значение метода текущим значением в поле. Когда поле пусто, take One() Вернет null Мы также можем его использовать. assertNull() Проверка.

И Утверждение истинно () |/、 Утверждение ложно() И assertNull() Разные, assertEquals() Требуются два параметра. Первый параметр - Ожидать Значение, вторым параметром является Фактическое Значение.

Приведенное выше утверждение может быть реализовано со ссылкой на следующий код( утверждения ):

assertTrue($box->has('toy'));
        $this->assertFalse($box->has('ball'));
    }

    public function testTakeOneFromTheBox()
    {
        $box = new Box(['torch']);

        $this->assertEquals('torch', $box->takeOne());

        // The current box is empty and should be Null
        $this->assertNull($box->takeOne());
    }
}

Операция phpunit Команда, вы должны увидеть следующий вывод:

OK (3 tests, 6 assertions)

AssertContains () и assertCount () и assertEmpty ()

Наконец, у нас есть три утверждения, которые действуют на массивы, и мы можем использовать их для проверки. Коробка В классе начинается С($item) Метода. Утверждение содержит() Массив, переданный утверждением, содержит указанное значение. Количество утверждений() Утверждая, что количество элементов в массиве является заданным числом, assertEmpty() Массив, переданный утверждением, пуст.

Давайте проведем следующие тесты:

assertTrue($box->has('toy'));
        $this->assertFalse($box->has('ball'));
    }

    public function testTakeOneFromTheBox()
    {
        $box = new Box(['torch']);

        $this->assertEquals('torch', $box->takeOne());

        // Null, now this box is empty.
        $this->assertNull($box->takeOne());
    }

    public function testStartsWithALetter()
    {
        $box = new Box(['toy', 'torch', 'ball', 'cat', 'tissue']);

        $results = $box->startsWith('t');

        $this->assertCount(3, $results);
        $this->assertContains('toy', $results);
        $this->assertContains('torch', $results);
        $this->assertContains('tissue', $results);

        // If the passing complex assertion array is empty
        $this->assertEmpty($box->startsWith('s'));
    }
}

Сохраните и повторите свой тест:

OK (4 tests, 9 assertions)

Поздравляю, вы только что закончили с семью основными утверждениями PHPUnit Коробка Все тесты класса. Есть много вещей, которые вы можете сделать с помощью этих простых утверждений. Большинство других утверждений являются более сложными, но они по – прежнему следуют вышеуказанным правилам использования.

Протестируйте свою программу

В вашей программе модульное тестирование для каждого компонента необходимо во многих случаях и должно быть неотъемлемой частью вашего процесса разработки, но это еще не все тестирование, которое вам нужно выполнить. Когда вы создаете программу, содержащую сложные представления, навигацию и формы, вы также хотите протестировать эти компоненты. На данный момент помощник по тестированию Laravel может сделать эти тесты такими же простыми, как модульное тестирование простых компонентов.

Давайте взглянем на предыдущий в __________. ./тесты/ Пропустите файл по умолчанию в каталоге ./tests/ExampleTest.php Документы. Теперь откройте его следующим образом:

visit('/')
             ->see('Laravel 5');
    }
}

Мы видим, что этот тестовый пример очень прост. Не зная, как работает помощник по тестированию, мы можем догадаться, что это значит следующим образом:

  1. Когда я посещаю / (корневой каталог)
  2. Я должен увидеть “Ларавель 5”

Если вы откроете свой веб-браузер и получите доступ к нашей программе (если вы не запустите свой веб-сервер, вы можете запустить его) php ремесленник служит Вы должны быть в состоянии увидеть текст “Laravel 5” на экране в каталоге webroot. Учитывая, что тест прошел PHPUnit, мы можем с уверенностью сказать, что наша модификация тестового примера верна.

Этот тест гарантирует доступ/путь, и страница может возвращать текст”Laravel 5″. Простая проверка, подобная этой, может ничего не значить, но если вы хотите отобразить ключевую информацию на своем веб-сайте, это может помешать вам развернуть поврежденную программу, если изменение в другом месте не позволяет странице правильно отображать правильную информацию.

Посетите (), посмотрите () и не смотрите ()

Теперь попробуйте написать свой собственный тест и понять его лучше.

Сначала отредактируйте ./приложение/Http/routes.php Добавьте новый маршрут. Для целей этого урока мы создали маршруты, определенные греческим алфавитом:

Затем создайте файл представления ./resources/views/alpha.blade.php Альфа используется в качестве ключевого слова для сохранения основных HTML-файлов:




    
        Alpha
    
    
        

This is the Alpha page.

Откройте браузер и введите адрес: http://localhost:8000/beta На странице будет отображаться содержимое “Это альфа-страница”.

Теперь у нас есть файлы шаблонов для тестирования. Далее мы выполняем команды. сделать:тест Чтобы создать новый тестовый файл:

php artisan make:test AlphaTest

Затем он становится вновь созданным тестовым файлом. Согласно примеру, предоставленному фреймворком, тестовая страница “альфа” не содержит “бета”. Мы можем это использовать. не видишь() Это смотрите() Соответствующий обратный метод.

Следующий код является простым примером приведенной выше реализации:

visit('/alpha')
             ->see('Alpha')
             ->dontSee('Beta');
    }
}

Сохраните и запустите PHPUnit( ./поставщик/корзина/phpunit Весь тестовый код должен пройти, и вы увидите отображение состояния теста следующим образом:

OK (5 tests,12 assertions)

Написание тестов перед разработкой

Для тестирования Разработка на основе тестов TDD (TDD) – очень классный метод. Сначала давайте напишем тест. После написания тестов и их выполнения вы обнаружите, что тесты завершились неудачей. Далее Мы пишем код, удовлетворяющий тесту, и снова выполняем тест, чтобы он прошел. Давайте начнем прямо сейчас.

Сначала создайте Бета-тест Использование класса сделать:тест Орден ремесленников:

php artisan make:test BetaTest

Затем обновите тестовый случай, чтобы проверить /бета-версию Маршрут “Бета”:

visit('/beta')
             ->see('Beta')
             ->dontSee('Alpha');
    }
}

Теперь используйте ./поставщик/bin/phpunit Команда для выполнения теста. Результатом является, казалось бы, краткое, но плохое сообщение об ошибке, следующее:

> ./vendor/bin/phpunit
PHPUnit 4.8.19 by Sebastian Bergmann and contributors.

....F.

Time: 144 ms, Memory: 14.25Mb

There was 1 failure:

1) BetaTest::testDisplaysBeta
A request for [http://localhost/beta] failed. Received status code [404].

...

FAILURES!
Tests: 6, Assertions: 13, Failures: 1.

Теперь нам нужно создать этот несуществующий маршрут. Давайте начнем.

Сначала отредактируйте ./приложение/Http/routes.php Файлы для создания новых /бета-версия Маршрутизация:

Далее, в ./resources/views/beta.blade.php Создайте следующий шаблон представления:




    
        Beta
    
    
        

This is the Beta page.

Теперь снова выполните PHPUnit, и результат снова должен быть зеленым.

> ./vendor/bin/phpunit
PHPUnit 4.8.19 by Sebastian Bergmann and contributors.

......

Time: 142 ms, Memory: 14.00Mb

OK (6 tests, 15 assertions)

Итак, мы напишем тест до того, как закончим новую страницу, верно? Разработка на основе тестирования Практика была проведена.

Нажмите () и просачивается ()

Laravel также предоставляет вспомогательную функцию( нажмите() ) Разрешить проверку соединений, существующих на страницах кликов, и метод( Просачивание() ) Проверьте страницу результатов, нажав на дисплей.

Давайте используем эти две вспомогательные функции для выполнения ссылок на альфа-и бета-страницах.

Во-первых, давайте обновим наши тесты. Открыть Альфа-тест Класс, мы добавим новый метод тестирования, который нажмет ссылку “Далее” на странице “альфа”, чтобы перейти на страницу “бета”.

Новый тестовый код выглядит следующим образом:

visit('/alpha')
             ->see('Alpha')
             ->dontSee('Beta');
    }

    public function testClickNextForBeta()
    {
        $this->visit('/alpha')
             ->click('Next')
             ->seePageIs('/beta');
    }
}

Обратите внимание, что в нашем новом здании тест Нажмите кнопку Далее Для бета-версии() В этом методе мы не проверяли содержимое каждой страницы. Другие тесты успешно проверили содержимое обеих страниц, поэтому здесь мы заботимся только о том, чтобы нажать на ссылку “Далее”, чтобы отправить ее в /бета-версию

Вы можете запустить тестовый компонент сейчас, но, как и ожидалось, тест завершится неудачей, потому что мы еще не обновили наш HTML-код.

Далее мы обновим информацию. БетаТест Сделайте что-нибудь подобное:

visit('/beta')
             ->see('Beta')
             ->dontSee('Alpha');
    }

    public function testClickNextForAlpha()
    {
        $this->visit('/beta')
             ->click('Previous')
             ->seePageIs('/alpha');
    }
}

Затем мы обновляем наш HTML-шаблон.

./resources/views/alpha.blade.php :




    
        Alpha
    
    
        

This is the Alpha page.

Next

./resources/views/beta.blade.php :




    
        Beta
    
    
        

This is the Beta page.

Previous

Сохраните файл и снова запустите PHPUnit:

> ./vendor/bin/phpunit
PHPUnit 4.8.19 by Sebastian Bergmann and contributors.

F....F..

Time: 175 ms, Memory: 14.00Mb

There were 2 failures:

1) AlphaTest::testDisplaysAlpha
Failed asserting that '


    
        Alpha
    
    
        

This is the Alpha page.

Next

' does not match PCRE pattern "/Beta/i". 2) BetaTest::testDisplaysBeta Failed asserting that ' Beta

This is the Beta page.

Previous

' does not match PCRE pattern "/Alpha/i". FAILURES! Tests: 8, Assertions: 23, Failures: 2.

Однако тест провалился. Если вы внимательно посмотрите на наш новый HTML, вы заметите, что у нас есть термины для каждого из них. бета Сумма альфа В /альфа Сумма /бета Страница. Это означает, что нам нужно немного изменить наши тесты, чтобы они не соответствовали ложным срабатываниям.

В каждом Альфа-тесте Сумма Бета-тест Класс, обновление тест Отображает* Используемый метод не вижу(‘<страница> страница’)

Два тестовых файла выглядят следующим образом:

./тесты/./тесты/ :

visit('/alpha')
             ->see('Alpha')
             ->dontSee('Beta page');
    }

    public function testClickNextForBeta()
    {
        $this->visit('/alpha')
             ->click('Next')
             ->seePageIs('/beta');
    }
}

./тесты/BetaTest.php :

visit('/beta')
             ->see('Beta')
             ->dontSee('Alpha page');
    }

    public function testClickNextForAlpha()
    {
        $this->visit('/beta')
             ->click('Previous')
             ->seePageIs('/alpha');
    }
}

Проведите свои тесты еще раз, и все они должны пройти. Теперь мы протестировали все наши новые файлы, включая Следующую/Предыдущую ссылку на странице.

Непрерывная интеграция PHPUnit через семафор

С помощью настроек семафора и непрерывной интеграции вы можете автоматически выполнять свои тесты.

Так что каждый раз, когда ты это делаешь. толчок git При отправке кода ваши тесты выполняются, и семафор предварительно загружает все последние версии PHP.

Если у вас нет учетной записи Семафора, зарегистрируйтесь для бесплатной учетной записи семафора. Следующее, что вам нужно сделать, это добавить его в свой проект и шаг за шагом следовать советам для выполнения тестов:

composer install --prefer-source
phpunit

Для получения дополнительной информации о непрерывной интеграции PHP обратитесь к документации по семафору.

эпилог

Вы должны отметить, что все тесты в этом учебнике имеют общую тему: они очень просты. Это одно из преимуществ обучения тому, как использовать базовые утверждения теста и вспомогательные функции, и использовать их как можно больше. Чем проще писать тесты, тем легче их понимать и поддерживать.

Освоив утверждения PHPUnit, представленные в этом руководстве, вы также можете перейти к документации PHPUnit, чтобы найти больше. Все утверждения следуют базовому шаблону, но вы обнаружите, что в большинстве тестов возвращаются базовые утверждения.

Для утверждений PHPUnit функция Laravel test assist является отличным дополнением, которое очень упрощает тестирование приложений. Другими словами, важно понимать, что для написания тестов мы проверяем только ключевую информацию, а не всю страницу. Это упрощает тестирование и позволяет изменять содержимое страницы по мере изменения приложения. Если ключевая информация все еще существует и тест все еще проходит, все будут удовлетворены.

От: https://learnku.com/laravel/t…

Другие статьи: https://learnku.com/laravel/c…

Оригинал: “https://developpaper.com/laravel-test-phpunit-introductory-tutorial/”