[Laravel Series 7.9] Тест
[Laravel Series 7.9] Тест

тест

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

Это потрясающе, правда?,Проработал более десяти лет,Я никогда не встречал компанию, которая использовала бы разработку тестовых драйверов.,Даже модульный тест никогда не писался на работе. Излишне говорить о преимуществах теста,Я также слышал о различных преимуществах разработки тестовых драйверов.,Мы также надеемся, что его можно будет применить в последующей работе. здесь,Я также надеюсь, что каждый сможет попытаться найти больший,Создайте более формальную компанию,Вы также можете узнать больше о похожих моделях разработки или знаниях, связанных с тестированием.

Запустить тест

Laravel Компонент тестирования в основном зависит от PHPUnit Компонент Юнит-тест. Эти предметы можно объединить в серию, если рассматривать их по отдельности. Я видел это примерно раньше,Но как сказано выше,Нет реального опыта реализации проектов,Поэтому я забыл об этом после просмотра. Если у вас есть более глубокое понимание этой области,Так что вам на самом деле не нужно читать сегодняшний контент.

Именно потому, что он используется PHPUnit , поэтому мы можем пройти PHPUnit выполнить тест,Например, нижеэтот Заказ。

Язык кода:javascript
копировать
vendor/bin/phpunit

В среде Laravel мы рекомендуем использовать команду тестирования, поставляемую вместе с платформой.

Язык кода:javascript
копировать
php artisan test

Путем трассировки и отладки мы обнаружим, что код этой команды находится в файлеvendor/nunomaduro/collision/src/Adapters/Laravel/Commands/TestCommand.php. Как видно из пути, он не включен в файл. каталог поставщика/laravel по умолчанию. Продолжайте отслеживать его метод run() и найдите метод start() в файлеvendor/symfony/process/Process.php. Если в этом методе вы выполняете отладку с использованием точек останова, вы увидите, что он объединяет оператор командной строки, то есть $commandline.

Язык кода:javascript
копировать
public function start(callable $callback = null, array $env = [])
{
    if ($this->isRunning()) {
        throw new RuntimeException('Process is already running.');
    }

    $this->resetProcessData();
    $this->starttime = $this->lastOutputTime = microtime(true);
    $this->callback = $this->buildCallback($callback);
    $this->hasCallback = null !== $callback;
    $descriptors = $this->getDescriptors();

    if ($this->env) {
        $env += $this->env;
    }

    $env += $this->getDefaultEnv();

    if (\is_array($commandline = $this->commandline)) {
        $commandline = implode(' ', array_map([$this, 'escapeArgument'], $commandline));

        if ('\\' !== \DIRECTORY_SEPARATOR) {
            // exec is mandatory to deal with sending a signal to the process
            $commandline = 'exec '.$commandline;
        }
    } else {
        $commandline = $this->replacePlaceholders($commandline, $env);
    }

    if ('\\' === \DIRECTORY_SEPARATOR) {
        $commandline = $this->prepareWindowsCommandLine($commandline, $env);
    } elseif (!$this->useFileHandles && $this->isSigchildEnabled()) {
        // last exit code is output on the fourth pipe and caught to work around --enable-sigchild
        $descriptors[3] = ['pipe', 'w'];

        // See https://unix.stackexchange.com/questions/71205/background-process-pipe-input
        $commandline = '{ ('.$commandline.') <&3 3<&- 3>/dev/null & } 3<&0;';
        $commandline .= 'pid=$!; echo $pid >&3; wait $pid; code=$?; echo $code >&3; exit $code';

        // Workaround for the bug, when PTS functionality is enabled.
        // @see : https://bugs.php.net/69442
        $ptsWorkaround = fopen(__FILE__, 'r');
    }

    $envPairs = [];
    foreach ($env as $k => $v) {
        if (false !== $v) {
            $envPairs[] = $k.'='.$v;
        }
    }

    if (!is_dir($this->cwd)) {
        throw new RuntimeException(sprintf('The provided cwd "%s" does not exist.', $this->cwd));
    }

    $this->process = @proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $envPairs, $this->options);

    if (!\is_resource($this->process)) {
        throw new RuntimeException('Unable to launch a new process.');
    }
    $this->status = self::STATUS_STARTED;

    if (isset($descriptors[3])) {
        $this->fallbackStatus['pid'] = (int) fgets($this->processPipes->pipes[3]);
    }

    if ($this->tty) {
        return;
    }

    $this->updateStatus(false);
    $this->checkTimeout();
}

Каково содержание этой $командной строки?

Язык кода:javascript
копировать
'/usr/local/Cellar/php/7.3.9_1/bin/php' 'vendor/phpunit/phpunit/phpunit' '--configuration=/Users/zhangyue/MyDoc/Сообщение в блоге/LearnLaravel/learn-laravel/phpunit.xml' '--printer=NunoMaduro\Collision\Adapters\Phpunit\Printer'

Командная строка PHPUnit для автоматизации тестирования. Просто фреймворк помогает нам вызвать его здесь и инкапсулирует результат выполнения перед его возвратом.

Хорошо, теперь отпустите точку останова и продолжите выполнение. Ларавел По умолчанию он поставляется с некоторыми тестовыми экземплярами.,Вы можете видеть, что некоторые тесты прошли успешно,Некоторые тесты провалились. Следующий,Давайте определим тест сами.

Юнит-тест

Юнит-тестиспользуется длятест Соответствует ли результат определенного метода нашим ожиданиям?。в большинстве случаев,Для нас разработчиков, если мы разрабатываем драйверные компании в тесте,Модульный тест обязательно должен быть написан.,И это самый важный тестовый контент. Так что же обычно проверяет модульный тест? Это не означает, что любой метод должен быть единым.,Наибольшего внимания требуют некоторые функциональные функции и методы класса, связанные с основной бизнес-логикой. Они скорее теоретические.,Конечно, это также зависит от обстоятельств человека и компании.,Мы в это тоже не углубляемся,Давайте посмотрим непосредственно на то, как использовать фреймворк.Юнит-тест。

первый,Нам нужно иметь возможность ждать,Вы можете просто создать новый класс,или Использовать существующие классы,Здесь я использую модель, которую мы создали ранее, — метод ссылок непосредственно внутри.

Язык кода:javascript
копировать
class MTest extends Model
{
    public static function testCulAdd($a, $b){
        return $a+$b;
    }
}

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

Язык кода:javascript
копировать
php artisan make:test CulTest --unit

После выполнения команды, tests/Unit Создайте один в каталоге CulTest.php документ。Дальшеэтотдокументкитайское письмотест。

Язык кода:javascript
копировать
class CulTest extends TestCase
{
    public function test_example()
    {
        $this->assertEquals(3, MTest::testCulAdd(1, 2));
    }

    public function test_example1()
    {
        $this->assertEquals(4, MTest::testCulAdd(1, 2));
    }
}

Мы определили два метода тестирования, обратите внимание, что они должны быть test_ начало. Мы используем оба метода assertEquals() Утвердите, что эта функция означает, что если результаты двух параметров равны, она вернет true , то есть результаты метода тестирования должны соответствовать ожидаемым результатам. Очевидно, что первый метод тестирования должен быть пройден, но второй метод может вызвать проблемы. Итак, давайте запустим это php artisan test Посмотрите, каковы результаты.

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

HTTPтест

HTTP — это смоделированный тестовый запрос, который может помочь нам напрямую реализовать тест на странице или в интерфейсе. Разве это не кажется очень мощным? создавать HTTP Тест-тест также можно использовать из командной строки.

Язык кода:javascript
копировать
php artisan make:test ZyBlogTest

Да, вы правильно прочитали, отличие от класса unit test в том, что последний добавлять не нужно. --unit . То есть на самом деле Laravel По умолчанию фреймворк надеется, что мы будем использовать это чаще. HTTP тест тест. Хорошо, давайте сделаем это вкратце.

Язык кода:javascript
копировать
class ZyBlogTest extends TestCase
{
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function test_example()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }

    public function test_example2()
    {
        $response = $this->post('/test/post');

        $response->assertStatus(200);
        $response->dump();

    }

    public function test_example3()
    {
        $response = $this->postJson('/test/post/json');

        $response->assertStatus(200)->assertJson(['a'=>1]);
    }

    public function test_example4()
    {
        $view = $this->view('test.test', ['message'=>'ZyBlog']);
        $view->assertSee("ZyBlog");
    }
}

Первая непосредственно тестовая домашняя страница, мы утверждаем, что до тех пор, пока возврат 200 Вот и все. Используйте его прямо здесь get() метод можно завершить get просить. Второй тест простой. post мы проходим тест dump() Распечатано post Содержание вывода. Конечно, вы также можете использовать утверждения, чтобы определить, соответствует ли содержание теста нашим требованиям, например, третий тест, мы тестируем. json Соответствуют ли данные, возвращаемые интерфейсом, требованиям. Здесь также показан эффект цепных вызовов.

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

Язык кода:javascript
копировать
// resources/views/test/test.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{$message}}
</body>
</html>

Маршрутизация не требуется,Контроллер не требуется,Вы можете протестировать напрямую. Результаты теста показаны на рисунке.

скрипт командной строки теста

Тест командной строки проверяет, нормально ли работает наш скрипт командной строки. перед тестом,Сначала нам нужно подготовить два сценария командной строки. Будьте проще,Непосредственно используйте командную строку маршрутизации,То есть в routes/console.php Определите два сценария командной строки непосредственно в . Об этой штуке раньше не упоминалось, но если я продемонстрирую ее здесь, все поймут, для чего она используется.

Язык кода:javascript
копировать
// routes/console.php
Artisan::command('testconsole', function () {
    $this->line("Hello ZyBlog");
});

Artisan::command('question', function () {
    $food = $this->choice('Выбрать обед', [
        'Лапша',
        'рисовая миска',
        'горячий горшок',
    ]);

    $this->line('твой выбор:'.$food);
});

Первая командная строка напрямую выводит фрагмент текста. Второй — это интерактивная командная строка, которая предлагает вам выбрать обед, а затем возвращает ваш выбор. Вы можете напрямую запустить тестовую консоль php artisan или вопрос php artisan, чтобы увидеть эффект.

Затем,Давайте напишем тестовый скрипт для этих двух командных строк.,Вы можете продолжить писать на ZyBlogTest середина.

Язык кода:javascript
копировать
public function test_console1(){
    $this->artisan('testconsole')->expectsOutput("Hello ZyBlog")->assertExitCode(0);
}

public function test_console2(){
    $this->artisan('question')
        ->expectsQuestion("Выбрать обед", «Нудл»)
        ->expectsOutput("твой выбор:Лапша")
        ->doesntExpectOutput("твой выбор:миска для риса")
        ->assertExitCode(0);
}

Первое утверждение теста простое,Ожидаемый результат — это строка, которую мы даем,Затем Заказ Код выхода из строки: 0 Вот и все. Поскольку мы не сделали никаких других настроек, код выхода для обычного выхода из командной строки будет такой: 0 。

Второе утверждение теста более сложное. Мы можем использовать метод «expectsQuestion()», имитирующий выбор входного показателя, а затем еще «expectsOutput()» для подтверждения желаемого значения. результат, а также вручите неExpectOutput(), то есть выходной результат не ожидается, и статус прохождения варианта использования этого теста определяется посредством серии объединенных утверждений.

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

Подвести итог

Благодаря сегодняшнему исследованию мы узнали, что тестовый компонент для LaravelНа самом деле больше похожи, чем мыв Будьте проще и удобнее в использовании。В конце концов, это помогает нам инкапсулировать,Вам нужно только создать тестовый класс и написать методы тестового варианта использования. В то же время я надеюсь, что смогу использовать его в реальной работе с вами. Иногда это не значит, что мы не нужны компании, просто нас это вообще не волнует.,Такие хорошие вещи следует использовать, чтобы сдерживать себя.,Даже если компания этого не требует,Мы также можем добавить эти тесты в наш собственный код, чтобы улучшить качество кода.,Вот здесь мне тоже нужно задуматься. Не так много сказать,Давайте воспользуемся этим.

Справочная документация:

https://learnku.com/docs/laravel/8.5/testing/10415

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose