ディレクトリ
Laravel 5.1ユニットテスト(PHPUnitは)はじめに
v1.0
著者:ZBW、ZGJ
簡単な紹介
ユニットテストフレームワークPHPアプリケーションのほとんどのアプリケーションはPHPUnit、このフレームワークLaravelはまた、統合され、LaravelはWeb関連のテストの開発を促進するためにいくつかの追加機能が追加されています。これは、プロジェクトベースのユニット・テスト・アプリケーションであるPHPUnitのに関連するコンテンツLaravelをご紹介します。
この論文は、Laravel 5.1に基づいており、少し変わっ以降のバージョンでは、いくつかのAPIの変更が、全体的に使用があるかもしれないことに注意してください。
インストールと設定
1.インストール
Composer.json設定作曲によって依存関係、および使用composer install
PHPUnitの、/ベンダー/ bin /にインストールされたバイナリファイルをインストールします。
(も試すために使用されるかもしれapt install phpunit
PHPUnitのをインストールします)
2. [設定
デフォルトでLaravelは名前が付いていますphpunit.xml
私たちは自分自身をPHPUnit用ファイルがすでに設定され、設定ファイルの。
次のようにプロジェクトが設定ファイルを使用しています。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">app/</directory>
</whitelist>
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
</php>
<logging>
<log type="coverage-html" target="./tests/codeCoverage" charset="UTF-8"/>
</logging>
</phpunit>
これは次のように注意する必要があります。
- <テストスイート> / <ディレクトリ>:ここではPHPのコードが格納されたテスト
- <ログ>:出力試験結果は、本明細書中に位置、非常に詳細なHTMLカバレッジレポートのコンテンツ出力バージョンを提供しました。
<フィルター>:このセクションでは、アクセスパスのPHPUnit、我々はappフォルダの内容のみをテストした上記の構成を定義します。
上記に基づき、ブラウザから直接アクセスすることができ、パブリックフォルダにHTMLドキュメントの入り口ソフトリンク、下、レポートテスト/コード・カバレッジフォルダを試験報告書を閲覧するための便利な方法:
ln -s tests/codeCoverage public/tests
これにより、ブラウザのアクセスルートは:/テストは、テストレポートを表示します。
試験サンプルの調製
1.新しいテストケースを作成します。
標準的なアプローチは、職人の新しいテストサンプルを使用することです。
php artisan make:test xxxTest
このコマンドは、デフォルトのテスト機能が含まれているテストのフォルダに新しいxxxTest.phpを作成します。
テスト機能の調製
ここでは、主に試合の入力と出力の機能をチェックするためにアサーションを使用する必要があります。アサーションは機能で自身ををphpunitています。
いくつかの一般的なアサーションは、次のとおりです。
$this->assertTrue(表达式) //检查表达式是否为真
$this->assertFalse(表达式) //检查表达式是否为假
$this->assertEquals(X,Y) //检查两个变量是否相等
$this->assertFileExists(文件) //检查文件是否存在
具体的な述語関数を参照することができたPHPUnitのドキュメント
3.書き込みのWeb機能テスト
最も便利な場所Laravel統合PHPUnitは、同社のWebコントローラと機能のテストを書くことができます。
このような次のようにページが通常のテストにアクセスするかどうかのテストとして:
public function testIndex()
{
$this->visit('logout') ;
$this->visit('/desexp')
->see("设计性实验")
->see("请选择实验")
->see("D01");
$this->visit('/login')
->see('登录')
->type($this->gen_admin_email , 'email')
->type($this->gen_admin_password , 'password')
->press('login-submit');
$this->visit('/desexp')
->see("设计性实验")
->see("请选择实验")
->see("D01");
}
書き込まれたテスト方法のこの部分はシリーズのために必要なすべての機能を実行することです。
3.1テストページビュー
訪問のいくつかの側面は機能に従う、機能のこの部分は、一般的に、テスト・アクセスに使用され、ページと対話しています。
visit('路由') // 访问某个地址
see('xxx') //检查访问的页面中是否出现了xxx
dontSee('xxx') //与see功能相反,检查是否没有出现xxx
type('输入内容',输入框name属性) //输入内容至输入框
check('单选框name属性') //选中checkbox
select(’内容‘,’下拉菜单区域‘) //选择下拉菜单项
press('xxx') //按下指定元素或按钮
attach('文件路径','文件上传name属性') //附加文件
上記の例では、シミュレートされた上陸作戦をテストする前に、手動に選択することができます。
3.2テストJSON API
上記試験JSON API関数は、多くの場合、効果がない場合は、あなたはインターフェイスと検証結果への要求を開始するには、以下の機能を使用する必要があります。
get/post/put/patch/delete('address',[payloads]) //以以上的HTTP方法请求路由
seeJson([json内容]) //检查返回的json是否包含内容
前もちろん、visit
この方法は、追加データとして見ることができますget
(注意パラメーターを指定せずに、後に導入されていません)
一例として、テーブル取得HTMLの正確getTable機能の内容を確認するためにどのコードの一部。
$_GET['id'] = $this->report_id_pub ;
$html_file = Config::get('phylab.experimentViewPath').$this->report_id_pub.".html";
$str_html = file_get_contents($html_file);
$this->visit('/getTable')
->seeJson([
'status' => SUCCESS_MESSAGE ,
'contents' => $str_html ,
]) ;
加えて、call('http请求方法','路由',‘数据’...)
より柔軟な方法でこのアプローチは、インタフェースへのリクエストを開始します。この機能は、HTTPリクエストオブジェクトLaravelのネイティブを返します。その後、PHPUnitのアサーションの結果を確認することができます。
Laravelは、Web要求の結果を確認するために、ユーザーを容易にするために、いくつかの追加のアサーションを追加しました。例えば:
->assertResponseOk(); //检查返回是否为HTTP 200
->assertResponseStatus($code); //检查返回是否是指定的状态码
->assertRedirectedTo($uri, $with = []); //检查是否有重定向
可能性のある特定の参照アサーションをPHPUnitの
3.3いくつかの問題
1.ミドルウェア
Laravelでミドルウェアを通るルートの一部は、インタフェースを使用してのみ、ユーザがログインできることを保証するために、ミドルウェアなど、多くの認証APIとして、安全性を確保するために、しばしばテストの複雑さを増加させるテストに上陸し、使用も比較的セッションですトラブルのアプローチの種類。
私たちは、テストクラスの先頭に以下を追加することができます
use WithoutMiddleware;
これにより、この試験において、一時的に中間コードファイルには影響を与えません
2.データベース
データベース操作に必要な機能テストの一部、および試験後には、データベースの状態の一貫性を確保する必要があります。私たちは簡単にデータベースをテストできるように回復のための手動操作は現実的ではない、幸いLaravelはいくつかの方法を構築しました
移行の使用:use DatabaseMigrations;
またはトランザクションを使用します。use DatabaseTransactions;
上記のいずれかのテストクラスの先頭に追加され、Laravelはあなたのためのテストの前と後に、データベースの復旧を完了します
3.の問題を定義します
私たちのプロジェクトでは、多くの場所で開発する前に、我々はいくつかのグローバル変数を定義、またはC言語のマクロ定義と同様であると言うことができます。フレーム自体を含むLaravelはまた、多くのそのようなマクロ定義が含まれています。あなたは私たちが直面する非常に厄介な問題だったテストを初めて実行:複数のテストコードファイルを持つことはできませんが、そうでない場合はPHPUnitはの「重複定義」のようなエラーを報告します。
一時的な解決策は、各試験化合物の先頭に追加、ということです。
protected $preserveGlobalState = FALSE;
protected $runTestInSeparateProcess = TRUE;
これは、各テストプロセスは、各試験に保持されていない間に独立した状態の両方であることを意味します。
4. HTTPリクエストのパラメータの負荷と
追加パラメータの配列に含めることができるテストのため、上記の要求方法のいくつかは、実際にペイロードを来たリクエストですが、何度も我々はこのようなパラメータを指定して要求を開始する必要があります。
http://ip:port/getTable?id=1234567
直接場合はget
設定方法は、['id'=>'1234567']
テスト実行または直接リクエストを見つける/getTable
パラメータなしで、
一つの解決策は、直接PHPのテスト・修正することである_GET
ような変数を、
$_GET['id'] = '1234567' ;
私は、このアプローチはやや単純で、粗信じていますが、より良い方法を発見していない、また、読者の展示をしてください。
テストを実行し、結果を表示
1.テストを実行します
テストを実行するだけでphpunit.xmlがディレクトリで実行、非常に簡単です:phpunit
自動的にすべてのテストを実行することができます。
あなたは、単一のテストファイルを実行したい場合は、次のように:
phpunit path\to\testFile.php
これは、ファイル内のすべてのテスト機能を実行します。
また、機能が重複する名前の事態を回避するために、ファイルを指定するために1つのテスト機能を実行するが、この場合では、より良いことができます。
phpunit --filter testFunction path\to\testFile.php
2.結果の表示
リンクの構成の柔らかい部分を構成したら、テストレポートのページに直接移動することができます
ln -s tests/codeCoverage public/tests
IPへのダイレクトアクセス:それは自動的にテストレポートのページに入りポート/テスト、あなたはどのテストカバレッジの内容を閲覧することができ、各フォルダをクリックしてください。
テストカバレッジを3つの列に分割され、最初の列は、被覆の行数であり、2番目の列はいくつかの方法があり、第3列は、クラスのカバーの数です。