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。

phpssionsStrackuserdataacrossmultiplepagerequestsusingauniqueidstoredinacookie.here'showtomanageetheemefectively:1)Startassession withsession_start()andstoredatain $ _ session.2)RegeneratesseSsessidafterloginwithsession_id(the topreventes_id)

PHPでは、次の手順を通じてセッションデータを繰り返すことができます。1。session_start()を使用してセッションを開始します。 2。$ _Sessionアレイのすべてのキー価値ペアを介してforeachループを反復します。 3.複雑なデータ構造を処理する場合、is_array()またはis_object()関数を使用し、print_r()を使用して詳細情報を出力します。 4.トラバーサルを最適化する場合、ページングを使用して、一度に大量のデータの処理を避けることができます。これにより、実際のプロジェクトでPHPセッションデータをより効率的に管理および使用するのに役立ちます。

このセッションは、サーバー側の状態管理メカニズムを介してユーザー認証を実現します。 1)セッションの作成と一意のIDの生成、2)IDはCookieを介して渡されます。3)サーバーストアとIDを介してセッションデータにアクセスします。

tostoreauser'snameInappession、starthessession withsession_start()、thensignthenameto $ _session ['username']。1)ousession_start()toinitializethessession.2)assighttheuser'snameto $ _ session ['username']

PHPSESSIONの障害の理由には、構成エラー、Cookieの問題、セッションの有効期限が含まれます。 1。構成エラー:正しいセッションをチェックして設定します。save_path。 2.Cookieの問題:Cookieが正しく設定されていることを確認してください。 3.セッションの有効期限:セッションを調整してください。GC_MAXLIFETIME値はセッション時間を延長します。

PHPでセッションの問題をデバッグする方法は次のとおりです。1。セッションが正しく開始されるかどうかを確認します。 2.セッションIDの配信を確認します。 3.セッションデータのストレージと読み取りを確認します。 4.サーバーの構成を確認します。セッションIDとデータを出力し、セッションファイルのコンテンツを表示するなど、セッション関連の問題を効果的に診断して解決できます。

session_start()への複数の呼び出しにより、警告メッセージと可能なデータ上書きが行われます。 1)PHPは警告を発し、セッションが開始されたことを促します。 2)セッションデータの予期しない上書きを引き起こす可能性があります。 3)session_status()を使用してセッションステータスを確認して、繰り返しの呼び出しを避けます。

PHPでのセッションライフサイクルの構成は、session.gc_maxlifetimeとsession.cookie_lifetimeを設定することで達成できます。 1)session.gc_maxlifetimeサーバー側のセッションデータのサバイバル時間を制御します。 0に設定すると、ブラウザが閉じているとCookieが期限切れになります。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ホットトピック









