PHPでの自動テスト

TDDの作業には明らかな利点があります。開発者は常にテストの形で明確に記述された目標を持ち、それがいつ達成されるかすぐにわかります。

ただし、いくつかのコストがあります。真実の瞬間を逃さないように、変更が行われたとき、または対応するクラスが変更されたときに、常に同じテストを実行する必要があります。 それほど大きな問題ではないようですが、操作性のために加えられた変更を確認するためのコンソールへの絶え間ない切り替えと、一般的にこれらの操作の必要性を覚えることは、注意の余分な分散です。



さらに、この全体を自動化する方法。





なぜPHPなのか?


TDDでのPHP開発に取り組んでいる同僚は、変更されたばかりのクラスのテストの起動を自動化する機能を探していましたが、彼のニーズを満たす既製のシステムを見つけることができませんでした。いくつかのオプションもあります。 「どうして?」と思ったのですが、今、私の仕事の結果を紹介します。



どのように見えますか?


開発したクラスまたはテストのファイルに変更を加えて保存します。 しばらくすると、対応するテストに合格した結果に関する情報を含むポップアップメッセージが表示されます。











テストの成功または失敗のみを報告するために完全な情報は意図的に削除され、開発者が「余分な文字」で注意をそらさないようにしました。



これには何が必要ですか?


システムは、2つのautotestdおよびcautotestアプリケーションで構成されています



autotestdは次の機能を実行します。





cautotest(コンソール自動テスト)-autotestdのコンソールクライアント-プロジェクト管理コマンドを送信できます。



自動テスト済み


まず、 このリンクからautotestdをダウンロードする必要があります。



これはプログラムの非常に最初のバージョンであり、deb-packageを収集する意味がなかったため、自分で記述したインストールスクリプト-インストール(プログラムのアーカイブにある)に限定することにしました。

#!/bin/bash apt-get install python2.6 python-sqlalchemy sqlite3 inotify-tools python-pyinotify python-dbus libnotify-bin python-notify mkdir /etc/autotestd cp config.ini /etc/autotestd/ chmod a+w /etc/autotestd mkdir /usr/share/autotestd cp ./*.py /usr/share/autotestd/ ln -s /usr/share/autotestd/autotestd.py /usr/local/bin/autotestd
      
      







ご覧のとおり、最初にすべての依存関係がインストールされ、次にディレクトリが作成され、ファイルがコピーされ、最後にアプリケーションを起動するリンクが作成されます。



sudoからのみスクリプトを実行します: sudo ./install

インストール後、アプリケーション自体を(できればバックグラウンドで)実行できます: autotestd&



(次のバージョンでは、自動テストを実際の悪魔にする予定です)



オートテスト


cautotestクライアントをダウンロードします

インストールは同様のコマンドで実行されます: sudo ./install

 #!/bin/bash apt-get install python2.6 python-dbus mkdir /usr/share/cautotest cp ./*.py /usr/share/cautotest/ ln -s /usr/share/cautotest/main.py /usr/local/bin/cautotest
      
      







ここではすべて同じです。

cautotest -hコマンドは、パラメーターのヘルプを表示します。



これが、開始するのに必要なすべてです。 プロジェクトディレクトリに移動し、次のコマンドを実行します。

cautotest -a project_name ./application/modules ./tests





重要! アプリケーションクラスとテストの比較は、クラス名によって実行されます。



 //MyClass.php class MyClass extends XXX { }; //MyClassTest.php class MyClassTest extends UnitTest { };
      
      







このような命名は、私たちの仕事で受け入れられています。 異なる場合は、/ etc / autotestd / config.iniファイルで正規表現を一致させるために使用する正規表現を変更することにより、簡単に修正できます。



これで、すべての準備が終了します。



cautotest -l (“ l”) コマンドは次のような出力をします:

hdg700@laptop:~$ cautotest -l

Active projects:

- testp

Use '-i project_name' for more information









追加情報はcautotest -i testpコマンドで取得できます。

hdg700@laptop:~$ cautotest -i testp

Project: testp

Code dir: /home/hdg700/work/testproj/code/

Test dir: /home/hdg700/work/testproj/test/

Classes: 1

Tests: 1









プロジェクトのクラスを変更してみてください。 保存すると、対応するテストが起動し、メッセージが表示されます。



どのように機能しますか?


両方のアプリケーションはPython2.6で書かれています。



Inotifyはファイルの変更を追跡するために使用され、それに応じてpythonのバンドル:python-pyinotifyが使用されます。



DBusは、クライアントとの通信に使用されます。これにより、将来のプロジェクト管理やフィードバックのために、他のインターフェイスをすばやく簡単に追加できます。



システムは、テストのために特定のファイルでphpunitを呼び出します。 コマンドを修正し、プログラム設定に必要な引数を追加できます。



sqlite3はプロジェクトに関する情報の保存に使用され、sqlalchemyはsqliteとの通信に使用されます。



仕事中にどんな面白いことが明らかになりましたか?


  1. 外部プログラムの起動:実行中のプログラムのstdin、stdoutおよびstderrをインターセプトしない場合、アプリケーションがバックグラウンドで実行されている場合(自動テスト&)、fgを実行するまで外部プログラムの開始時にその実行が停止します。 この機能は私の神経をかなりボロボロにしましたが、結局はすべてが論理的であることが判明しました。stdin、stdout、stderrをインターセプトするのに十分です。
  2. セッションバスDBusは1人のユーザーの環境で動作するため、それを使用するアプリケーションは1人のユーザーから起動する必要があります (注意を高めるためのトートロジー:)。 autotestdをデーモンモードにするときは、システムバスを使用する必要があります。




PS


PHPの自動テストの最初のバージョンを確認しました。 誰かが役に立つと灰色の日を明るくしたいと思います。 :)

いくつかの追加機能を見たい、またはバグについて苦情を言う人は、githabの問題セクションに書いてください:autotestd -issuescautotest-issues



そして最後の1つ。 プロジェクトにウォッチャーを追加します。これにより、変更の通知を受け取ることができます。さらに、プロジェクト(プロジェクト)をさらに開発する価値があるかどうかを確認します。



ご清聴ありがとうございました。



All Articles