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

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

Jul 28, 2020 pm 01:54 PM
laravel

次のチュートリアルコラムでは、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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP でオブジェクト リレーショナル マッピング (ORM) を使用してデータベース操作を簡素化するにはどうすればよいですか? PHP でオブジェクト リレーショナル マッピング (ORM) を使用してデータベース操作を簡素化するにはどうすればよいですか? May 07, 2024 am 08:39 AM

PHP でのデータベース操作は、オブジェクトをリレーショナル データベースにマップする ORM を使用して簡素化されます。 Laravel の EloquentORM を使用すると、オブジェクト指向構文を使用してデータベースと対話できます。モデル クラスを定義したり、Eloquent メソッドを使用したり、実際にブログ システムを構築したりすることで ORM を使用できます。

Laravel と CodeIgniter の最新バージョンの比較 Laravel と CodeIgniter の最新バージョンの比較 Jun 05, 2024 pm 05:29 PM

Laravel 9 と CodeIgniter 4 の最新バージョンでは、更新された機能と改善が提供されます。 Laravel9はMVCアーキテクチャを採用しており、データベース移行、認証、テンプレートエンジンなどの機能を提供します。 CodeIgniter4 は、HMVC アーキテクチャを使用してルーティング、ORM、およびキャッシュを提供します。パフォーマンスの面では、Laravel9 のサービスプロバイダーベースの設計パターンと CodeIgniter4 の軽量フレームワークにより、優れたパフォーマンスが得られます。実際のアプリケーションでは、Laravel9 は柔軟性と強力な機能を必要とする複雑なプロジェクトに適しており、CodeIgniter4 は迅速な開発や小規模なアプリケーションに適しています。

Laravel - アーティザンコマンド Laravel - アーティザンコマンド Aug 27, 2024 am 10:51 AM

Laravel - アーティザン コマンド - Laravel 5.7 には、新しいコマンドを処理およびテストするための新しい方法が付属しています。これには職人コマンドをテストする新しい機能が含まれており、そのデモについては以下で説明します。

Laravel と CodeIgniter のデータ処理機能はどのように比較されますか? Laravel と CodeIgniter のデータ処理機能はどのように比較されますか? Jun 01, 2024 pm 01:34 PM

Laravel と CodeIgniter のデータ処理機能を比較します。 ORM: Laravel はクラスとオブジェクトのリレーショナル マッピングを提供する EloquentORM を使用しますが、CodeIgniter は ActiveRecord を使用してデータベース モデルを PHP クラスのサブクラスとして表します。クエリビルダー: Laravel には柔軟なチェーンクエリ API がありますが、CodeIgniter のクエリビルダーはよりシンプルで配列ベースです。データ検証: Laravel はカスタム検証ルールをサポートする Validator クラスを提供しますが、CodeIgniter には組み込みの検証関数が少なく、カスタム ルールの手動コーディングが必要です。実践例:ユーザー登録例はLarを示しています

Laravel と CodeIgniter ではどちらが初心者に優しいでしょうか? Laravel と CodeIgniter ではどちらが初心者に優しいでしょうか? Jun 05, 2024 pm 07:50 PM

初心者にとって、CodeIgniter は学習曲線が緩やかで機能は少ないですが、基本的なニーズはカバーしています。 Laravel は幅広い機能セットを提供しますが、学習曲線はわずかに急になります。パフォーマンスの点では、Laravel と CodeIgniter はどちらも良好なパフォーマンスを示します。 Laravel にはより広範なドキュメントとアクティブなコミュニティ サポートがあり、CodeIgniter はよりシンプルで軽量で、強力なセキュリティ機能を備えています。ブログアプリケーションを構築する実際のケースでは、Laravel の EloquentORM を使用するとデータ操作が簡素化されますが、CodeIgniter ではより手動の構成が必要になります。

Laravel と CodeIgniter: 大規模プロジェクトにはどちらのフレームワークが適していますか? Laravel と CodeIgniter: 大規模プロジェクトにはどちらのフレームワークが適していますか? Jun 04, 2024 am 09:09 AM

大規模プロジェクト用のフレームワークを選択する場合、Laravel と CodeIgniter にはそれぞれ独自の利点があります。 Laravel はエンタープライズレベルのアプリケーション向けに設計されており、モジュール設計、依存関係の注入、強力な機能セットを提供します。 CodeIgniter は、速度と使いやすさを重視した、小規模から中規模のプロジェクトに適した軽量フレームワークです。複雑な要件と多数のユーザーを伴う大規模なプロジェクトには、Laravel のパワーとスケーラビリティがより適しています。単純なプロジェクトやリソースが限られている状況では、CodeIgniter の軽量で迅速な開発機能がより理想的です。

PHPコードの単体テストと統合テスト PHPコードの単体テストと統合テスト May 07, 2024 am 08:00 AM

PHP 単体テストおよび統合テスト ガイド 単体テスト: コードまたは関数の単一単位に焦点を当て、PHPUnit を使用して検証用のテスト ケース クラスを作成します。統合テスト: 複数のコードユニットがどのように連携するかに注意し、PHPUnit の setUp() メソッドと TearDown() メソッドを使用してテスト環境をセットアップおよびクリーンアップします。実際のケース: PHPUnit を使用して、データベースの作成、サーバーの起動、テストコードの作成など、Laravel アプリケーションの単体テストと統合テストを実行します。

Laravel と CodeIgniter: 小規模プロジェクトにはどちらのフレームワークが適していますか? Laravel と CodeIgniter: 小規模プロジェクトにはどちらのフレームワークが適していますか? Jun 04, 2024 pm 05:29 PM

小規模なプロジェクトの場合、Laravel は強力な機能とセキュリティを必要とする大規模なプロジェクトに適しています。 CodeIgniter は、軽量さと使いやすさを必要とする非常に小規模なプロジェクトに適しています。

See all articles