目次
1. はじめに
2. アプリケーションのテスト
ヘルパー関数 actAs は、現在のユーザーとして指定されたユーザー 実装:
アプリケーションでカスタム HTTP リクエストを生成し、完全な IlluminateHttpResponse オブジェクトを取得したい場合は、call メソッドを使用できます:
Lumenまた、データベース駆動型アプリケーションをテストするためのさまざまな便利なツールも提供します。まず、ヘルパー関数 seeInDatabase を使用して、データベース内のデータが特定のデータ セットと一致するかどうかをアサートできます。たとえば、データ テーブルの users に移動して、電子メールの値が sally@example.com であるという条件に基づいてレコードが存在するかどうかをクエリする場合、次のように実行できます:
最後のテストのデータが次のテストに影響しないように、各テストの後にデータベースをリセットすると便利なことがよくあります。
テストする場合、通常、テストを実行する前に新しいデータをデータベースに挿入する必要があります。テスト データを作成するとき、Lumen では各列の値を手動で指定する代わりに、「ファクトリー」を使用して各 Eloquent モデルのデフォルトの属性値セットを定義できます。まず、ファクトリ定義が含まれている atabase/factories/ModelFactory.php ファイルを見てみましょう:
4、 模拟
4.1 模拟事件
4.2 模拟队列任务
4.3 模拟门面
ホームページ バックエンド開発 PHPチュートリアル [Lumen 5.2 ドキュメント] その他の機能 -- 単体テスト

[Lumen 5.2 ドキュメント] その他の機能 -- 単体テスト

Jun 23, 2016 pm 01:16 PM

1. はじめに

実際、PHPUnit を使用してテストのサポートを提供することは、すぐに使用できるようになり、アプリケーション用にテスト設定ファイル phpunit.xml がセットアップされています。このフレームワークは、アプリケーションをより表現的にテストできるようにする多数のヘルパー関数も提供します。

ExampleTest.php ファイルは、tests ディレクトリに提供されます。新しい Lumen アプリケーションをインストールした後、コマンドラインで phpunit を実行するだけでテストを実行できます。

1.1 テスト環境

Lumen は、テスト中にキャッシュ ドライバーをアレイ ドライバーとして自動的に構成します。これは、テスト中にキャッシュ データが保持されないことを意味します。

必要に応じて、他のテスト環境構成を自由に作成できます。テスト環境変数は phpunit.xml ファイルで構成できます。

1.2 テストの定義と実行

テスト ケースを作成するには、tests ディレクトリに新しいテスト ファイルを作成するだけです。テスト クラスは TestCase を継承し、PHPUnit を使用してテスト メソッドを定義できます。テストを実行するには、ターミナルから phpunit コマンドを実行するだけです:

<?phpclass FooTest extends TestCase{    public function testSomethingIsTrue()    {        $this->assertTrue(true);    }}
ログイン後にコピー

注: テスト クラスで独自の setUp メソッドを定義する場合は、必ずその中でparent::setUp を呼び出してください。

2. アプリケーションのテスト

Lumen は、HTTP リクエストとテスト出力を生成するためのストリーミング インターフェイス API (メソッド チェーン) を提供します。

2.1 JSON API のテスト

Lumen は、JSON API とその応答をテストするための複数の補助関数も提供します。たとえば、get、post、put、patch、および delete メソッドは、さまざまな HTTP リクエスト メソッドを通じてリクエストを行うために使用されます。これらのメソッドにデータとヘッダーを簡単に渡すこともできます。まず、/user への POST リクエストを生成し、返されたデータが JSON 形式であるかどうかをアサートするテストを作成します。

<?phpclass ExampleTest extends TestCase{    /**     * 基本功能测试示例     *     * @return void     */    public function testBasicExample()    {        $this->post('/user', ['name' => 'Sally'])             ->seeJson([                 'created' => true,             ]);    }}
ログイン後にコピー

seeJson メソッドは、指定された配列を JSON に変換し、JSON 応答全体内の JSON フラグメントを検証します。アプリケーションによって返されます。したがって、JSON 応答に他の属性がある場合でも、指定されたフラグメントが存在する限りテストは合格します。

JSON の一致を正確に検証する

指定された配列とアプリケーションによって返された JSON が正確に一致することを検証したい場合は、seeJsonEquals メソッドを使用します:

<?phpclass ExampleTest extends TestCase{    /**     * 基本功能测试示例     *     * @return void     */    public function testBasicExample()    {        $this->post('/user', ['name' => 'Sally'])             ->seeJsonEquals([                 'created' => true,             ]);    }}
ログイン後にコピー

2.2 認証

ヘルパー関数 actAs は、現在のユーザーとして指定されたユーザー 実装:

<?phpclass ExampleTest extends TestCase{    public function testApplication()    {        $user = factory('App\User')->create();        $this->actingAs($user)             ->get('/user')    }}
ログイン後にコピー

2.3 カスタム HTTP リクエスト

アプリケーションでカスタム HTTP リクエストを生成し、完全な IlluminateHttpResponse オブジェクトを取得したい場合は、call メソッドを使用できます:

public function testApplication(){    $response = $this->call('GET', '/');    $this->assertEquals(200, $response->status());}
ログイン後にコピー

POST、PUT、または PATCH リクエストを生成します。 入力データ配列はリクエストで渡すことができ、ルートまたはコントローラーの Request インスタンスを通じてリクエスト データにアクセスできます:

$response = $this->call('POST', '/user', ['name' => 'Taylor']);
ログイン後にコピー

3. データベースの処理

Lumenまた、データベース駆動型アプリケーションをテストするためのさまざまな便利なツールも提供します。まず、ヘルパー関数 seeInDatabase を使用して、データベース内のデータが特定のデータ セットと一致するかどうかをアサートできます。たとえば、データ テーブルの users に移動して、電子メールの値が sally@example.com であるという条件に基づいてレコードが存在するかどうかをクエリする場合、次のように実行できます:

public function testDatabase(){    // 调用应用...    $this->seeInDatabase('users', ['email' => 'sally@foo.com']);}
ログイン後にコピー

もちろん、seeInDatabase メソッドなどを使用します。同様のヘルパー関数は便宜上の目的であり、PHPUnit のすべての組み込みアサーション関数を使用してテストを補足することもできます。

3.1 各テスト後にデータベースをリセットする

最後のテストのデータが次のテストに影響しないように、各テストの後にデータベースをリセットすると便利なことがよくあります。

移行を使用する

1 つの方法は、各テスト後にデータベースをロールバックし、次のテストの前に再度移行することです。 Lumen は、これを自動的に処理するための単純な DatabaseMigrationstrait を提供します。次のようにテスト クラスでこのトレイトを使用するだけです:

<?phpuse Laravel\Lumen\Testing\DatabaseMigrations;use Laravel\Lumen\Testing\DatabaseTransactions;class ExampleTest extends TestCase{    use DatabaseMigrations;    /**     * A basic functional test example.     *     * @return void     */    public function testBasicExample()    {        $this->get('/foo');    }}
ログイン後にコピー

トランザクションを使用する

別の方法は、各テスト ケースをデータベース トランザクションにラップすることです。Lumen は、それを自動的に処理する便利な DatabaseTransactionstrait を提供します:

<?phpuse Laravel\Lumen\Testing\DatabaseMigrations;use Laravel\Lumen\Testing\DatabaseTransactions;class ExampleTest extends TestCase{    use DatabaseTransactions;    /**     * A basic functional test example.     *     * @return void     */    public function testBasicExample()    {        $this->get('/foo');    }}
ログイン後にコピー

3.2 Model Factory

テストする場合、通常、テストを実行する前に新しいデータをデータベースに挿入する必要があります。テスト データを作成するとき、Lumen では各列の値を手動で指定する代わりに、「ファクトリー」を使用して各 Eloquent モデルのデフォルトの属性値セットを定義できます。まず、ファクトリ定義が含まれている atabase/factories/ModelFactory.php ファイルを見てみましょう:

$factory->define(App\User::class, function ($faker) {    return [        'name' => $faker->name,        'email' => $faker->email,    ];});
ログイン後にコピー

クロージャでは、ファクトリ定義として、すべてのプロパティのデフォルトのテスト値を返します。モデル。このクロージャは PHP ライブラリ Faker のインスタンスを受け取り、テスト用にさまざまなタイプのランダム データを簡単に生成できるようにします。

もちろん、ModelFactory.php ファイルにさらにファクトリを追加することもできます。

複数のファクトリ タイプ

同じ Eloquent モデル クラスに対して複数のファクトリを生成したい場合があります。たとえば、通常のユーザーに加えて「admin」ユーザー用のファクトリを生成したい場合は、defineAs を使用できます。メソッド これらのファクトリを定義します:

$factory->defineAs(App\User::class, 'admin', function ($faker) {    return [        'name' => $faker->name,        'email' => $faker->email,        'admin' => true,    ];});
ログイン後にコピー

基本的なユーザー ファクトリのすべてのプロパティを繰り返すことなく、生のメソッドを使用して基本的なプロパティを取得できます。これらのプロパティを取得した後、必要な追加の値を追加するだけです。

$factory->defineAs(App\User::class, 'admin', function ($faker) use ($factory) {    $user = $factory->raw(App\User::class);    return array_merge($user, ['admin' => true]);});
ログイン後にコピー

测试中使用工厂

定义好工厂后,可以在测试或数据库填充文件中通过全局的 factory方法使用它们来生成模型实例,所以,让我们看一些生成模型的例子,首先,我们使用 make方法,该方法创建模型但不将其保存到数据库:

public function testDatabase(){    $user = factory(App\User::class)->make();    // 用户模型测试...}
ログイン後にコピー

如果你想要覆盖模型的一些默认值,可以传递数组值到 make方法。只有指定值被替换,其他数据保持不变:

$user = factory(App\User::class)->make([    'name' => 'Abigail',]);
ログイン後にコピー

还可以创建多个模型集合或者创建给定类型的集合:

// 创建3个 App\User 实例...$users = factory(App\User::class, 3)->make();// 创建1个 App\User "admin" 实例...$user = factory(App\User::class, 'admin')->make();// 创建3个 App\User "admin" 实例...$users = factory(App\User::class, 'admin', 3)->make();
ログイン後にコピー

持久化工厂模型

create方法不仅能创建模型实例,还可以使用Eloquent的 save方法将它们保存到数据库:

public function testDatabase(){    $user = factory(App\User::class)->create();    //用户模型测试...}
ログイン後にコピー

你仍然可以通过传递数组到create方法覆盖模型上的属性:

$user = factory(App\User::class)->create([    'name' => 'Abigail',]);
ログイン後にコピー

添加关联关系到模型

你甚至可以持久化多个模型到数据库。在本例中,我们添加一个关联到创建的模型,使用 create方法创建多个模型的时候,会返回一个Eloquent集合实例,从而允许你使用集合提供的所有便利方法,例如 each:

$users = factory(App\User::class, 3)           ->create()           ->each(function($u) {                $u->posts()->save(factory(App\Post::class)->make());            });
ログイン後にコピー

4、 模拟

4.1 模拟事件

如果你在重度使用Lumen的事件系统,可能想要在测试时模拟特定事件。例如,如果你在测试用户注册,你可能不想所有 UserRegistered的时间处理器都被触发,因为这可能会发送欢迎邮件,等等。

Lumen提供可一个方便的 expectsEvents方法来验证期望的事件被触发,但同时阻止该事件的其它处理器运行:

<?phpclass ExampleTest extends TestCase{    public function testUserRegistration()    {        $this->expectsEvents(App\Events\UserRegistered::class);        // 测试用户注册代码...    }}
ログイン後にコピー

如果你想要阻止所有事件运行,可以使用 withoutEvents方法:

<?phpclass ExampleTest extends TestCase{    public function testUserRegistration()    {        $this->withoutEvents();        // 测试用户注册代码...    }}
ログイン後にコピー

4.2 模拟队列任务

有时候,你可能想要在请求时简单测试控制器分发的指定任务,这允许你孤立的测试路由/控制器——将其从任务逻辑中分离出去,当然,接下来你可以在一个独立测试类中测试任务本身。

Lumen提供了一个方便的 expectsJobs方法来验证期望的任务被分发,但该任务本身不会被测试:

<?phpclass ExampleTest extends TestCase{    public function testPurchasePodcast()    {        $this->expectsJobs(App\Jobs\PurchasePodcast::class);        // 测试购买播客代码...    }}
ログイン後にコピー

注意:这个方法只检查通过全局辅助函数dispatch或路由/控制器中调用$this->dispatch分发的任务,并不检查直接通过 Queue::push分发的任务。

4.3 模拟门面

测试的时候,你可能经常想要模拟Lumen门面的调用,例如,看看下面的控制器动作:

<?phpnamespace App\Http\Controllers;use Cache;use Illuminate\Routing\Controller;class UserController extends Controller{    /**     * 显示应用用户列表     *     * @return Response     */    public function index()    {        $value = Cache::get('key');        //    }}
ログイン後にコピー

我们可以通过使用 shouldReceive方法模拟 Cache门面的调用,该方法返回一个 Mockery模拟的实例,由于门面通过Lumen服务容器解析和管理,它们比通常的静态类更具有可测试性。例如,我们来模拟 Cache门面的调用:

<?phpclass FooTest extends TestCase{    public function testGetIndex()    {        Cache::shouldReceive('get')                    ->once()                    ->with('key')                    ->andReturn('value');        $this->visit('/users');    }}
ログイン後にコピー

注意:不要模拟 Request门面,取而代之地,在测试时传递输入到HTTP辅助函数如 call和 post。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? Apr 06, 2025 am 12:02 AM

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

phpstormでCLIモードをデバッグする方法は? phpstormでCLIモードをデバッグする方法は? Apr 01, 2025 pm 02:57 PM

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

See all articles