Контент, связанный с тестами, на самом деле не моя сильная сторона.,В конце концов, я не особо контактировал с повседневной разработкой.,Но не говори об этом,Мне всегда кажется, что чего-то не хватает,Итак, этот раздел — всего лишь простая демонстрация.,Нет никакой возможности привести вас к более глубокому изучению.
Это потрясающе, правда?,Проработал более десяти лет,Я никогда не встречал компанию, которая использовала бы разработку тестовых драйверов.,Даже модульный тест никогда не писался на работе. Излишне говорить о преимуществах теста,Я также слышал о различных преимуществах разработки тестовых драйверов.,Мы также надеемся, что его можно будет применить в последующей работе. здесь,Я также надеюсь, что каждый сможет попытаться найти больший,Создайте более формальную компанию,Вы также можете узнать больше о похожих моделях разработки или знаниях, связанных с тестированием.
Laravel Компонент тестирования в основном зависит от PHPUnit Компонент Юнит-тест. Эти предметы можно объединить в серию, если рассматривать их по отдельности. Я видел это примерно раньше,Но как сказано выше,Нет реального опыта реализации проектов,Поэтому я забыл об этом после просмотра. Если у вас есть более глубокое понимание этой области,Так что вам на самом деле не нужно читать сегодняшний контент.
Именно потому, что он используется PHPUnit , поэтому мы можем пройти PHPUnit выполнить тест,Например, нижеэтот Заказ。
vendor/bin/phpunit
В среде Laravel мы рекомендуем использовать команду тестирования, поставляемую вместе с платформой.
php artisan test
Путем трассировки и отладки мы обнаружим, что код этой команды находится в файлеvendor/nunomaduro/collision/src/Adapters/Laravel/Commands/TestCommand.php. Как видно из пути, он не включен в файл. каталог поставщика/laravel по умолчанию. Продолжайте отслеживать его метод run() и найдите метод start() в файлеvendor/symfony/process/Process.php. Если в этом методе вы выполняете отладку с использованием точек останова, вы увидите, что он объединяет оператор командной строки, то есть $commandline.
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();
}
Каково содержание этой $командной строки?
'/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 для автоматизации тестирования. Просто фреймворк помогает нам вызвать его здесь и инкапсулирует результат выполнения перед его возвратом.
Хорошо, теперь отпустите точку останова и продолжите выполнение. Ларавел По умолчанию он поставляется с некоторыми тестовыми экземплярами.,Вы можете видеть, что некоторые тесты прошли успешно,Некоторые тесты провалились. Следующий,Давайте определим тест сами.
Юнит-тестиспользуется длятест Соответствует ли результат определенного метода нашим ожиданиям?。в большинстве случаев,Для нас разработчиков, если мы разрабатываем драйверные компании в тесте,Модульный тест обязательно должен быть написан.,И это самый важный тестовый контент. Так что же обычно проверяет модульный тест? Это не означает, что любой метод должен быть единым.,Наибольшего внимания требуют некоторые функциональные функции и методы класса, связанные с основной бизнес-логикой. Они скорее теоретические.,Конечно, это также зависит от обстоятельств человека и компании.,Мы в это тоже не углубляемся,Давайте посмотрим непосредственно на то, как использовать фреймворк.Юнит-тест。
первый,Нам нужно иметь возможность ждать,Вы можете просто создать новый класс,или Использовать существующие классы,Здесь я использую модель, которую мы создали ранее, — метод ссылок непосредственно внутри.
class MTest extends Model
{
public static function testCulAdd($a, $b){
return $a+$b;
}
}
Это просто для демонстрационных целей,Это не означает, что можно использовать только статические методы. Этот метод реализует простую функцию,Добавьте два параметра. Затем нам нужно создать тестовый класс,Для этого вы можете использовать следующую командную строку.
php artisan make:test CulTest --unit
После выполнения команды, tests/Unit Создайте один в каталоге CulTest.php документ。Дальшеэтотдокументкитайское письмотест。
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 Тест-тест также можно использовать из командной строки.
php artisan make:test ZyBlogTest
Да, вы правильно прочитали, отличие от класса unit test в том, что последний добавлять не нужно. --unit . То есть на самом деле Laravel По умолчанию фреймворк надеется, что мы будем использовать это чаще. HTTP тест тест. Хорошо, давайте сделаем это вкратце.
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 Соответствуют ли данные, возвращаемые интерфейсом, требованиям. Здесь также показан эффект цепных вызовов.
Тест, связанный с последней страницей, более интересен, вам нужно всего лишь создать страницу, подобную следующей.
// 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 Определите два сценария командной строки непосредственно в . Об этой штуке раньше не упоминалось, но если я продемонстрирую ее здесь, все поймут, для чего она используется.
// 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 середина.
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