ただし、いくつかのコストがあります。真実の瞬間を逃さないように、変更が行われたとき、または対応するクラスが変更されたときに、常に同じテストを実行する必要があります。 それほど大きな問題ではないようですが、操作性のために加えられた変更を確認するためのコンソールへの絶え間ない切り替えと、一般的にこれらの操作の必要性を覚えることは、注意の余分な分散です。
さらに、この全体を自動化する方法。
なぜ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
- -aは、プロジェクトを追加することを示すパラメーターです
- project_name -autotestdに登録されるプロジェクトの名前
- ./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との通信に使用されます。
仕事中にどんな面白いことが明らかになりましたか?
- 外部プログラムの起動:実行中のプログラムのstdin、stdoutおよびstderrをインターセプトしない場合、アプリケーションがバックグラウンドで実行されている場合(自動テスト&)、fgを実行するまで外部プログラムの開始時にその実行が停止します。 この機能は私の神経をかなりボロボロにしましたが、結局はすべてが論理的であることが判明しました。stdin、stdout、stderrをインターセプトするのに十分です。
- セッションバスDBusは1人のユーザーの環境で動作するため、それを使用するアプリケーションは1人のユーザーから起動する必要があります (注意を高めるためのトートロジー:)。 autotestdをデーモンモードにするときは、システムバスを使用する必要があります。
PS
PHPの自動テストの最初のバージョンを確認しました。 誰かが役に立つと灰色の日を明るくしたいと思います。 :)
いくつかの追加機能を見たい、またはバグについて苦情を言う人は、githabの問題セクションに書いてください:autotestd -issuesとcautotest-issues 。
そして最後の1つ。 プロジェクトにウォッチャーを追加します。これにより、変更の通知を受け取ることができます。さらに、プロジェクト(プロジェクト)をさらに開発する価値があるかどうかを確認します。
ご清聴ありがとうございました。