>  기사  >  PHP 프레임워크  >  Laravel 테스트 방법을 익히는 방법을 가르쳐주세요.

Laravel 테스트 방법을 익히는 방법을 가르쳐주세요.

藏色散人
藏色散人앞으로
2020-07-28 13:54:256285검색

다음 튜토리얼 칼럼인 Laravel에서는 Laravel을 마스터하는 테스트 방법을 소개하겠습니다. 필요한 친구들에게 도움이 되길 바랍니다!

Laravel 테스트 방법을 익히는 방법을 가르쳐주세요.

라라벨 마스터의 테스트 방법

인정하든 안 하든, 제품을 개발할 때 소프트웨어 테스팅은 프로젝트에 있어 매우 중요한 부분이지만 우리는 테스팅을 무시하는 경우가 많습니다. 이 글에서는 주로 Laravel 프레임워크의 테스트 방법을 연구합니다.

모르실 수도 있지만 Laravel 커널은 이미 PHPUnit 단위 테스트 구성 요소를 상속받았습니다. PHPUnit은 PHP 커뮤니티에서 가장 널리 사용되고 널리 사용되는 테스트 프레임워크 중 하나입니다. PHPUnit은 "단위 테스트"와 "기능 테스트" 기능을 모두 지원합니다.

PHPUnit의 "유닛 테스트"와 "기능 테스트"의 기본 사용법을 간략하게 소개하겠습니다. 그런 다음 Laravel 프로젝트에서 "단위 테스트" 및 "기능 테스트" 사용 사례를 만드는 방법을 설명하세요. 하지만 이 글에서는 여러분이 이미 PHPUnit 테스트 프레임워크에 대한 기본적인 이해를 갖고 있다고 가정하므로, Laravel에서 테스트하기 위해 PHPUnit을 사용하는 주제에 중점을 두도록 하겠습니다.

단위 테스트 및 기능 테스트

PHPUnit 프레임워크에 노출된 경우 이 프레임워크가 "단위 테스트"와 "기능 테스트"라는 두 가지 유형의 기능을 지원한다는 것을 알아야 합니다.

"단위 테스트"의 목적은 함수나 메서드의 정확성을 테스트하는 것입니다. 더 중요한 것은 코드 로직의 정확성을 쉽게 달성할 수 있다는 것입니다.

개발 중에 함수에 여러 논리 처리가 포함되어 있는 경우 각 처리 논리를 여러 메서드로 분할하여 개별 메서드와 코드 블록을 테스트할 수 있도록 하는 것이 가장 좋습니다.

단위 테스트의 신비를 이상적인 방식으로 들여다봅니다.

<?php
public function getNameAttribute($value)
{
    return ucfirst($value);
}

보시다시피 이 메서드는 하나의 비즈니스 로직만 처리합니다. ucfirst 함수는 메서드 내에서 문자를 첫 글자 대문자 형식으로 변환하는 데 사용됩니다.

유닛 테스트는 각 독립 유닛의 코드가 올바른지 확인하는 것입니다. 기능 테스트는 기능의 정확성을 보장하는 것입니다. 간단히 말해서, 애플리케이션에 접근하는 사용자의 행동을 시뮬레이션하기 위해 특정 테스트 케이스를 통해 시스템의 정확성을 검증하는 것입니다.

예를 들어, 다음 단계를 포함하는 로그인 기능에 대한 기능 테스트 사례를 구현할 수 있습니다.

  • 로그인 페이지에 액세스하기 위한 GET 요청을 시작합니다.

  • 로그인 페이지에 있는지 확인합니다.

  • generate POST 요청 방식을 사용하는 로그인 데이터의 경우

  • 로그인 세션 데이터가 성공적으로 생성되었는지 확인합니다.

이것이 "기능 테스트" 사용 사례를 만드는 방법의 비결입니다. 다음으로, Laravel에서 "단위 테스트"와 "기능 테스트"를 사용하는 방법을 설명하기 위해 구체적인 테스트 케이스를 만들 것입니다.

테스트 환경 구축

테스트 모델 생성

테스트 사례 생성을 시작하기 전에 먼저 테스트를 위한 프로젝트 종속성을 구축해야 합니다.

먼저 아래 artisan 명령을 실행하여 Post 모델과 해당 마이그레이션 파일을 생성하세요.

$ php artisan make:model Post --migration

위 명령은 Post 모델 클래스와 데이터베이스 마이그레이션 파일을 생성합니다.

Post 모델 코드는 다음과 같습니다.

<?php
// app/Post.php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
    //
}

데이터베이스 마이그레이션 파일 YYYY_MM_DD_HHMMSS_create_posts_table.php가 Database/migrations 디렉터리에 생성됩니다.

게시물 데이터 테이블에는 기사 제목이 저장됩니다. 수정된 Post 데이터베이스 마이그레이션 파일 코드는 다음과 같습니다.

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create(&#39;posts&#39;, function (Blueprint $table) {
            $table->increments(&#39;id&#39;);
            $table->string(&#39;name&#39;);
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists(&#39;posts&#39;);
    }
}

보시다시피, 기사 제목을 저장하기 위해 새로운 $table->string('name')을 사용합니다. 그런 다음 데이터베이스 마이그레이션 명령을 실행하여 데이터베이스에 해당 데이터 테이블을 생성합니다.

$ php artisan migrate

데이터 테이블을 생성한 후 Post 모델 클래스에 다음 코드를 추가해야 합니다

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
    /**
     * Get the post title.
     *
     * @param  string  $value
     * @return string
     */
    public function getNameAttribute($value)
    {
        return ucfirst($value);
    }
}

접근자 메서드를 추가했는데 그 기능은 우리가 테스트하려는 기사 제목을 수정하는 것입니다. 단위 테스트 케이스. 위 내용은 Post 모델에서 수정해야 할 내용입니다.

테스트 컨트롤러 만들기

다음으로, 후속 기능 테스트에 사용될 app/Http/Controllers/AccessorController.php 파일 이름의 컨트롤러를 만들어야 합니다.

<?php
// app/Http/Controllers/AccessorController.php
namespace App\Http\Controllers;
use App\Post;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class AccessorController extends Controller
{
    public function index(Request $request)
    {
        // get the post-id from request params
        $post_id = $request->get("id", 0);
        // load the requested post
        $post = Post::find($post_id);
        // check the name property
        return $post->name;
    }
}

index 메서드에서는 요청의 id 매개변수를 통해 Post 모델의 기사를 쿼리합니다.

마지막으로 Routes/web.php 라우팅 구성 파일에 관련 경로를 정의합니다.

<?php
Route::get(&#39;accessor/index&#39;, &#39;AccessorController@index&#39;);

경로 설정 후 http://your-laravel-site.com/accessor/index 를 통해 해당 경로에 정상적으로 접속이 가능한지 확인하실 수 있습니다.

단위 테스트

이전 섹션에서는 테스트를 위한 환경을 설정했습니다. 이번 섹션에서는 Post 모델을 테스트하기 위해 Laravel에서 단위 테스트 케이스를 작성하겠습니다.

다행히도 Laravel은 테스트 케이스 템플릿 파일을 생성하기 위한 명령 도구도 제공합니다.

명령줄에서 다음 명령을 실행하여 AccessorTest 유닛 테스트 케이스 클래스를 생성합니다. 이 명령이 단위 테스트 케이스를 생성한다는 것을 나타내려면 --unit 매개변수 옵션을 전달해야 합니다. 단위 테스트 케이스 파일은 test/Unit 디렉토리에 생성됩니다.

$ php artisan make:test --unit

执行上面创建测试用例命令会创建文件名为 tests/Unit/AccessorTest.php 文件。

<?php
// tests/Unit/AccessorTest.php
namespace Tests\Unit;
use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class AccessorTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testExample()
    {
        $this->assertTrue(true);
    }
}

将 testExample 方法替换成更有实际意义的方法:

<?php
// tests/Unit/AccessorTest.php
namespace Tests\Unit;
use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class AccessorTest extends TestCase
{
    /**
     * Test accessor method
     *
     * @return void
     */  
    public function testAccessorTest()
    {
        $db_post = DB::select(&#39;select * from posts where id = 1&#39;);
        $db_post_title = ucfirst($db_post[0]->title);
        $model_post = Post::find(1);
        $model_post_title = $model_post->title;
        $this->assertEquals($db_post_title, $model_post_title);
    }
}

我们可以看到更新后的代码和 Laravel 代码编码风格完全一致。在类的开始我们引入了相关依赖类文件。在 testAccessorTest 方法里,我们希望验证定义在 Post 模型里面的 getNameAttribute 方法的正确性。

为了实现这样的测试功能,我们通过 DB 类使用原生 SQL 查询到一篇文章,并将文章的标题赋值给 $db_post_title 变量。

之后,我们通过 Post 模型获取经过 getNameAttribute 方法处理过后的同一篇文章的标题赋值给 $model_post_title。

最后,通过 assertEquals 方法比较两个变量是否相等。

以上就是如何在 Laravel 中使用单元测试的使用方法。

功能测试

这一节我们将学习如何创建功能测试用例来对先前创建的控制器进行「功能测试」。

通过下面给出的命令,我们将创建一个名为 AccessorTest 的功能测试用例。注意这边我们没有使用 --unit 命令行选项,所以命令会在 tests/Feature 目录下创建一个「功能测试」用例。

$ php artisan make:test AccessorTest

命令会创建文件名为 tests/Feature/AccessorTest.php 的测试类。

<?php
// tests/Feature/AccessorTest.php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class AccessorTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testExample()
    {
        $this->assertTrue(true);
    }
}

同样我们替换掉 testExample 方法。

<?php
// tests/Feature/AccessorTest.php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class AccessorTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $db_post = DB::select(&#39;select * from posts where id = 1&#39;);
        $db_post_title = ucfirst($db_post[0]->name);
        $response = $this->get(&#39;/accessor/index?id=1&#39;);
        $response->assertStatus(200);
        $response->assertSeeText($db_post_title);
    }
}

熟悉功能测试的朋友应该对上面的代码不会太陌生。

首先,我们还是通过 DB 类使用原生 SQL 查询到一篇文章,并将文章的标题赋值给 $db_post_title 变量。接着我们模拟一个访问 /accessor/index?id=1 URI 的 GET 请求,并通过 $response 变量接收响应。

然后,我们去匹配请求响应的状态码是否为 200。在我们的测试用例中的这个 GET 请求响应状态码应该是 200。此外,测试后还将获取到一个首字母大写的标题,判断标题是否与 $db_post_title 相对的方法是 assertSeeText。

编写完成所有的测试用例后。接下来需要去执行这些测试用例。在 Laravel 项目中运行 PHPUnit 测试用例,仅需在项目更目录执行下面的命令。

$ phpunit

这个命令会运行项目中的所有测试用例。测试中的断言会以标准的 PHPUnit 输出显示在控制台。

总结

今天,我们探讨了 Laravel 内置测试组件 PHPUnit 的测试用例实现方法。本文仅涉及 PHPUnit 「单元测试」和「功能测试」的基础知识,工作中我们还需要结合实际出发,对 PHPUnit 测试进行深入研究才行。

此外,我们还学习了通过使用 artisan 命令行工具创建分别创建了用于单元测试和功能测试的测试用例的方法。

原文地址:https://learnku.com/laravel/t/33394

위 내용은 Laravel 테스트 방법을 익히는 방법을 가르쳐주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 phpzendo에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제