私たちのプロジェクトには php が含まれるため、php コードの単体テストを行う必要があります。ある程度理解した後、PHPUnit を使用して php をテストすることにしました。 PHPUnit の設定方法を理解するのに多くの時間を費やし、公式 Web サイトのドキュメントを読むのは涙が出るほどでした。しかし、設定方法を知ってしまえば、実際には非常に簡単です。
システム: Windows 10 Pro
PHP バージョン: PHP 5.5.12
サーバーツール: WAMPSERVER 2.5
PHPUnit バージョン: PHPUnit 4.8
1. PHPUnit を構成します
まず、PHPUnit 公式 Web サイト (ここをクリックして入る) にアクセスし、対応するバージョンをダウンロードします。私たちはphp 5.5を使用しているので、PHPUnit 4.8を選択しました。 .phar
ファイルを取得し、名前を phpunit.phar
に変更します。
このファイルを任意の場所に置きます。私自身を例として、プロジェクトのディレクトリ、つまり D:repositoryCourseManagementmobile_api_test
にそれを置きました。
マイ コンピュータを右クリックし、プロパティを選択します。左側にあるシステムの詳細設定をクリックします。この時点で、システムのプロパティが表示され、詳細タブを選択し、右下隅の環境変数をクリックします。 ユーザー変数で、PATH をダブルクリックし、変数値 の後に ;D:repositoryCourseManagementmobile_api_test
を追加します (先頭のセミコロンに注意し、phpunit.phar が保存されているパスを入力します)。これは、PHPUnit を任意の場所で使用できるように構成されています。構成されていない場合、PHPUnit は phpunit.phar のパスで使用する必要があります。
公式ドキュメントに記載されていないことの 1 つは、PHP 環境変数も設定する必要があるということです。たとえば、
php.exe
がE:softwarewampbinphpphp5.5.12
にある場合、PATH の後に;E:softwarewampbinphpphp5.5.12
を追加する必要もあります。 PS: おそらく、PHP IDE をインストールしていないため、この環境変数を追加しようと思って設定していないのかもしれません。
ショートカット キー Win + R
を押し、「cmd」と入力して Enter を押します。 phpunit.phar が保存されているパスを入力します。 echo @php "%~dp0phpunit.phar" %* > phpunit.cmd
と入力して Enter キーを押します。次に、phpunit --version
と入力して Enter キーを押します。 PHPUnit x.y.z by Sebastian Bergmann and contributors.
という出力が得られた場合は、設定が完了したことを意味します (間違っている場合は、exit
を入力して Enter キーを押して再試行してください)。以下に示すように:
2. PHPUnit を使用してテストします
PHPUnit を使用するには、クラスを使用する必要があります。 login.php (D:repositoryCourseManagementmobile_api
にあります) を例にとると、初期バージョンは次のようになります (このブログのコードについて文句を言うことは歓迎です):
<ol class="dp-c"><li class="alt"><span><span><php </span></span></li><li><span> </span></li><li class="alt"><span> <span class="func">error_reporting</span><span>(0); </span></span></li><li><span> </span></li><li class="alt"><span> <span class="vars">$workNumber</span><span> = </span><span class="vars">$_POST</span><span>[</span><span class="string">"login-user"</span><span>]; </span></span></li><li><span> <span class="vars">$password</span><span> = </span><span class="vars">$_POST</span><span>[</span><span class="string">"login-password"</span><span>]; </span></span></li><li class="alt"><span> <span class="vars">$tableName</span><span> = </span><span class="vars">$_POST</span><span>[</span><span class="string">"ident"</span><span>]; </span></span></li><li><span> </span></li><li class="alt"><span> <span class="vars">$con</span><span> = mysqli_connect(</span><span class="string">"localhost"</span><span>, </span><span class="string">"root"</span><span>, </span><span class="string">""</span><span>, </span><span class="string">"teacher_class_system"</span><span>); </span></span></li><li><span> <span class="keyword">if</span><span> (!</span><span class="vars">$con</span><span>) { </span></span></li><li class="alt"><span> <span class="keyword">die</span><span>(</span><span class="string">'Could not connect: '</span><span> . mysql_error()); </span></span></li><li><span> } <span class="keyword">else</span><span> { </span></span></li><li class="alt"><span> mysqli_query(<span class="vars">$con</span><span>, </span><span class="string">"SET NAMES utf8"</span><span>); </span></span></li><li><span> </span></li><li class="alt"><span> <span class="vars">$result</span><span> = mysqli_query(</span><span class="vars">$con</span><span>, </span><span class="string">"SELECT * FROM $tableName where workNumber = $workNumber and password = $password"</span><span>); </span></span></li><li><span> <span class="keyword">if</span><span> (mysqli_num_rows(</span><span class="vars">$result</span><span>) < 1) { </span></span></li><li class="alt"><span> <span class="func">echo</span><span> </span><span class="string">"false"</span><span>; </span></span></li><li><span> } <span class="keyword">else</span><span> { </span></span></li><li class="alt"><span> <span class="vars">$result_arr</span><span> = mysqli_fetch_assoc(</span><span class="vars">$result</span><span>); </span></span></li><li><span> <span class="func">echo</span><span> json_encode(</span><span class="vars">$result_arr</span><span>, JSON_UNESCAPED_UNICODE); </span></span></li><li class="alt"><span> } </span></li><li><span> } </span></li><li class="alt"><span> </span></li><li><span> > </span></span></li></ol>
テストする方法がないので、いくつか修正を加えました。まず、login.php
が存在するフォルダー内にフォルダー classes
を作成し、その中に新しい class_login.php
を作成します。その内容は login.php
です。
<ol class="dp-j"><li class="alt"><span><span><php </span></span></li><li><span> </span></li><li class="alt"><span> <span class="keyword">class</span><span> Login { </span></span></li><li><span> <span class="comment">// 测试工具PHPUnit要求一定要在这里给变量默认值,于是默认为空。</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> function login($workNumber = </span><span class="string">""</span><span>,$password = </span><span class="string">""</span><span>,$tableName = </span><span class="string">""</span><span>) { </span></span></li><li><span> $con = mysqli_connect(<span class="string">"localhost"</span><span>, </span><span class="string">"root"</span><span>, </span><span class="string">""</span><span>, </span><span class="string">"teacher_class_system"</span><span>); </span></span></li><li class="alt"><span> <span class="keyword">if</span><span> (!$con) { </span></span></li><li><span> die(<span class="string">'Could not connect: '</span><span> . mysqli_error()); </span></span></li><li class="alt"><span> } <span class="keyword">else</span><span> { </span></span></li><li><span> mysqli_query($con, <span class="string">"SET NAMES utf8"</span><span>); </span></span></li><li class="alt"><span> </span></li><li><span> $result = mysqli_query($con, <span class="string">"SELECT * FROM $tableName where workNumber = $workNumber and password = $password"</span><span>); </span></span></li><li class="alt"><span> <span class="keyword">if</span><span> (!$result mysqli_num_rows($result) == </span><span class="number">0</span><span>) { </span></span></li><li><span> <span class="keyword">return</span><span> </span><span class="string">"false"</span><span>; </span></span></li><li class="alt"><span> } <span class="keyword">else</span><span> { </span></span></li><li><span> $result_arr = mysqli_fetch_assoc($result); </span></li><li class="alt"><span> <span class="keyword">return</span><span> json_encode($result_arr, JSON_UNESCAPED_UNICODE); </span></span></li><li><span> } </span></li><li class="alt"><span> } </span></li><li><span> } </span></li><li class="alt"><span> } </span></li><li><span> </span></li><li class="alt"><span> > </span></span></li></ol>さらに、元の
の内容も変更する必要があります。 変更された内容は次のとおりです。 login.php
<ol class="dp-j"> <li class="alt"><span><span><php </span></span></li><li><span> error_reporting(<span class="number">0</span><span>); </span></span></li><li class="alt"><span> </span></li><li><span> require_once <span class="string">'./classes/class_login.php'</span><span>; </span></span></li><li class="alt"><span> </span></li><li><span> $workNumber = $_POST[<span class="string">"login-user"</span><span>]; </span></span></li><li class="alt"><span> $password = $_POST[<span class="string">"login-password"</span><span>]; </span></span></li><li><span> $tableName = $_POST[<span class="string">"ident"</span><span>]; </span></span></li><li class="alt"><span> </span></li><li><span> $log = <span class="keyword">new</span><span> Login; </span></span></li><li class="alt"><span> $response = $log->login($workNumber,$password,$tableName); </span></span></li> <li><span> </span></li> <li class="alt"><span> <span class="keyword">if</span><span>($response != </span><span class="string">"false"</span><span>) { </span></span></li> <li><span> session_start(); </span></li> <li class="alt"><span> $_SESSION[<span class="string">'id'</span><span>]=$tableName; </span></span></li> <li><span> } </span></li> <li class="alt"><span> </span></li> <li><span> echo $response; </span></li> <li class="alt"><span> </span></li> <li><span> > </span></li> </ol>
テスト ファイルの書き込みを開始します
テスト ファイルを フォルダーに置きました。新しいファイル「login_test.php」を作成し、次のコードを記述します: D:repositoryCourseManagementmobile_api_test
<ol class="dp-j"> <li class="alt"><span><span><php </span></span></li><li><span> require_once dirname(__FILE__).<span class="string">'/../mobile_api/classes/class_login.php'</span><span>; </span></span></li><li class="alt"><span> </span></li><li><span> <span class="keyword">class</span><span> LoginTest </span><span class="keyword">extends</span><span> PHPUnit_Framework_TestCase { </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> function testLoginSuccess() { </span></span></li><li><span> $expected = <span class="string">'{"workNumber":"00001","password":"00001","name":"西瓜","sex":"男","birthday":"20151201","department":"计算机","telephone":"110","email":"git@github.com"}'</span><span>; </span></span></li><li class="alt"><span> </span></li><li><span> $workNumber = <span class="string">'00001'</span><span>; </span></span></li><li class="alt"><span> $password = <span class="string">'00001'</span><span>; </span></span></li><li><span> $tableName = <span class="string">'user_teacher'</span><span>; </span></span></li><li class="alt"><span> $lg = <span class="keyword">new</span><span> Login; </span></span></li><li><span> $actual = $lg->login($workNumber,$password,$tableName); </span></span></li> <li class="alt"><span> </span></li> <li><span> $<span class="keyword">this</span><span>->assertEquals($expected,$actual); </span></span></li> <li class="alt"><span> } </span></li> <li><span> </span></li> <li class="alt"><span> function testLoginFail() { </span></li> <li><span> $expected = <span class="string">'false'</span><span>; </span></span></li> <li class="alt"><span> </span></li> <li><span> $workNumber = <span class="string">'11111'</span><span>; </span></span></li> <li class="alt"><span> $password = <span class="string">'11111'</span><span>; </span></span></li> <li><span> $tableName = <span class="string">'user_teacher'</span><span>; </span></span></li> <li class="alt"><span> </span></li> <li><span> $lg = <span class="keyword">new</span><span> Login; </span></span></li> <li class="alt"><span> $actual = $lg->login($workNumber,$password,$tableName); </span></li> <li><span> $<span class="keyword">this</span><span>->assertEquals($expected,$actual); </span></span></li> <li class="alt"><span> } </span></li> <li><span> } </span></li> <li class="alt"><span> </span></li> <li><span> > </span></li> </ol>
テストファイルを実行
ショートカット キー Win + R、cmd と入力して Enter を押します。テストファイルのディレクトリを入力し、 と入力してテストを実行します。 phpunit login_test.php
簡単なテストが行われました。
3. 探索プロセス
初めて PHPUnit をダウンロードしたとき、 ファイルを入手して、それを解凍する必要があると思いましたが、恥ずかしかったです。長い間探した結果、そのようなファイルを解凍できるWebサイトを見つけました(ここをクリックして入力してください)。でもそれは役に立たない….phar
'php' は内部コマンド、外部コマンド、または操作可能なプログラムとして認識されませんGoogle 検索、Bing 検索、StackOverFlow 検索、Baidu 検索、見つかった答えは役に立ちません。またはバッチファイル。
主な理由は、これらはすべて PHP 環境変数が設定されていることを前提としているためです...
最后想着是不是之前生成的 phpunit.cmd
有问题?于是查看一下这个文件的内容。突然想到是不是PHP环境变量没设置的原因?打开cmd,输入 php --version
。得到:
‘php’ 不是内部或外部命令,也不是可运行的程序
或批处理文件。
和上面的错误一样!果然是这里的问题。于是把 ;E:\software\wamp\bin\php\php5.5.12
添加到环境变量中。再运行 php --version
得到:
<ol class="dp-c"> <li class="alt"><span><span>PHP 5.5.12 (cli) (built: Apr 30 2014 11:20:58) </span></span></li> <li><span>Copyright (c) 1997-2014 The PHP Group </span></li> <li class="alt"><span>Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies </span></li> <li><span>with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans </span></li> </ol>
再进入 phpunit.cmd
所在文件夹,运行 phpunit --version
。得到:
PHPUnit 4.8.18 by Sebastian Bergmann and contributors.
问题解决!
经过这次的探索,以后碰到”找不到xxx”这种问题的时候,首先会想起环境变量的设置。
比如解决这个问题的同一天下午,我想使用Visual Studio Code的Git功能,但是却得到提示:
第一个反应是:我明明安装了msysgit啊。
第二个反应是:会不会是环境变量没配置?打开环境变量配置,果然没有。于是将 git.exe
所在文件夹的路径添加进去。重启visual Studio Code,问题解决!