ホームページ  >  記事  >  PHPフレームワーク  >  Laravelのテスト方法をマスターする方法を教えます

Laravelのテスト方法をマスターする方法を教えます

藏色散人
藏色散人転載
2020-07-28 13:54:256233ブラウズ

次のチュートリアルコラムでは、Laravelを使いこなすためのテスト方法を紹介しますので、必要な友人の参考になれば幸いです。

Master Laravel のテスト方法Laravelのテスト方法をマスターする方法を教えます

認めるか認めないかにかかわらず、あなたは製品に関して言えば、ソフトウェアのテストはプロジェクトにとって非常に重要ですが、テストはしばしば無視されます。この記事では主にLaravelフレームワークのテスト方法について学びます。 おそらくまだご存じないかもしれませんが、Laravel カーネルはすでに PHPUnit 単体テスト コンポーネントを継承しています。 PHPUnit は、PHP コミュニティで最も広く使用され、人気のあるテスト フレームワークの 1 つです。 PHPUnit は、「単体テスト」機能と「機能テスト」機能の両方をサポートしています。

PHPUnitの基本的な使い方「単体テスト」と「機能テスト」を簡単に紹介します。次に、Laravelプロジェクトで「単体テスト」と「機能テスト」のユースケースを作成する方法を説明します。ただし、この記事では、PHPUnit テスト フレームワークの基本をすでに理解していることを前提としているため、Laravel でのテストに PHPUnit を使用するというトピックに焦点を当てましょう。

単体テストと機能テスト

PHPUnit フレームワークに触れたことがあるなら、それが 2 種類の機能、「単体テスト」をサポートしていることを知っているはずです。そして「機能テスト」。 「単体テスト」の目的は、関数またはメソッドの正確さをテストすることです。さらに重要なのは、コード ロジックの正確性を簡単に実現できることです。

開発中に関数に複数の論理プロセスが含まれていることが判明した場合は、各処理ロジックを異なるメソッドに分割して、個々のメソッドとコード ブロックがテスト可能であることを確認することをお勧めします。

私たちは、理想的な方法を使用して単体テストの謎を覗き見ます。

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

ご覧のとおり、このメソッドは 1 つのビジネス ロジックのみを処理します。メソッド内で ucfirst 関数を使用して、文字を最初の文字を大文字に変換します。

単体テストは、それぞれの独立したユニットのコードの正確性を確認することであり、機能テストは、関数の正確性を確認することです。一言で言えば、特定のテスト ケースを通じてアプリケーションにアクセスするユーザーの動作をシミュレートし、システムの正確性を検証することです。

たとえば、次の手順を含むログイン機能の機能テスト ケースを実装できます:

ログイン ページにアクセスするための GET リクエストを開始します;

  • ログイン ページにいるかどうかを判断します;

  • POST リクエスト メソッドを使用してログインするためのログイン データを生成します;

  • ログイン セッション データが正常に作成されたかどうかを確認します。

  • これが「機能テスト」ユースケースの作成方法の秘密です。次に、Laravelにおける「単体テスト」と「機能テスト」の使い方を説明するために、具体的なテストケースを作成していきます。

テスト環境の構築

テスト モデルの作成

テスト ケースの作成を開始する前に、まずビルドする必要があります。 1 つはプロジェクトの依存関係をテストするためのものです。 まず、次の職人コマンドを実行して、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 ディレクトリに作成されます。

投稿データ テーブルには記事のタイトルが格納されます。変更されたデータベース移行後のファイル コードは次のとおりです。

<?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 からアクセスして、ルートに正常にアクセスできるかどうかを確認できます。

単体テスト

前のセクションでは、テスト用の環境をセットアップしました。このセクションでは、Laravel で単体テスト ケースを作成し、Post モデルをテストします。 幸いなことに、Laravel にはテスト ケース テンプレート ファイルを作成するためのコマンド ツールも提供されています。

コマンド ラインで次のコマンドを実行して、AccessorTest 単体テスト ケース クラスを作成します。このコマンドが単体テスト ケースを作成することを示すには、 --unit パラメーター オプションを渡す必要があることに注意してください。単体テスト ケース ファイルは、tests/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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はphpzendoで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。