目次
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)

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

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

PHPのさまざまなエラータイプを説明します(通知、警告、致命的なエラー、解析エラー)。 PHPのさまざまなエラータイプを説明します(通知、警告、致命的なエラー、解析エラー)。 Apr 08, 2025 am 12:03 AM

PHPには4つの主要なエラータイプがあります。1。notice:わずかなものは、未定義の変数へのアクセスなど、プログラムを中断しません。 2。警告:通知よりも深刻で、ファイルを含むなど、プログラムを終了しません。 3。ファタラー:最も深刻なのは、機能を呼び出すなど、プログラムを終了します。 4。ParseError:構文エラーは、エンドタグの追加を忘れるなど、プログラムの実行を防ぎます。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? Apr 17, 2025 am 12:06 AM

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか? HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか? Apr 09, 2025 am 12:09 AM

HTTPリクエストメソッドには、それぞれリソースを取得、送信、更新、削除するために使用されるGET、POST、PUT、および削除が含まれます。 1. GETメソッドは、リソースを取得するために使用され、読み取り操作に適しています。 2. POSTメソッドはデータの送信に使用され、新しいリソースを作成するためによく使用されます。 3. PUTメソッドは、リソースの更新に使用され、完全な更新に適しています。 4.削除メソッドは、リソースの削除に使用され、削除操作に適しています。

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHP 7.4で導入された矢印関数(短い閉鎖)を説明します。 PHP 7.4で導入された矢印関数(短い閉鎖)を説明します。 Apr 06, 2025 am 12:01 AM

矢印関数はPhp7.4で導入され、短い閉鎖の単純化された形式です。 1)=>演算子を使用して定義され、機能を省略し、キーワードを使用します。 2)矢印関数は、キーワードを使用せずに現在のスコープ変数を自動的にキャプチャします。 3)コールバック関数と短い計算でしばしば使用され、コードのシンプルさと読みやすさを改善します。

See all articles