Hatena::ブログ(Diary)

くろまほうさいきょうでんせつ RSSフィード

2012/04/02 (月)

「それより俺のテストを見てくれ。こいつをどう思う?」「すごく・・・日本語です・・・・」

「それより俺のテストを見てくれ。こいつをどう思う?」

f:id:calpo:20120331212922p:image:w640

「すごく・・・日本語です・・・・」


オラっち、日本語でテストメソッド名を定義するんダーーイ

PHPって、メソッド名を日本語で定義できます(文字コードUTF-8なら)。PHPでTDDワークショップで初めて知りました。
ということでテストクラスのメソッドを日本語で定義してたんですが、普通はメソッド名が日本語になってたら驚きますよね。

ということで、日本語でメソッドを定義することについて、ちょっとまとめてみます。

日本語で関数定義とかマジ勘弁☆

日本語メソッド名に対する拒否反応はおおよそ以下のような感じ。

とにかくありえない
  • ありえん
  • なにこれキモい
  • (無言で)rm -rf test/unit/*

気持ちはわかります。具体的には次のどちらか、もしくは両方になるんじゃないでしょうか。

ひらがなと漢字がありえない
  • 日本語ネイティブでない人が関わる可能性がある(可能性を無視できない)

確かにこの場合日本語はナシでしょう。(こういうケースが多いと思いますが)
ドキュメントとしてのテストコードの存在意義が潰されてしまいますからね。

自然文がありえない
  • たとえ英語でであっても "testHogeShouldBeConvertedToFugaWheneverFlagIsTrue()" みたいなのはメソッド名として受け入れられない。

あいやしばらく!
こういうケースでは "testHogeParser()"みたいなテストメソッドの中に大量のassersionが詰め込まれて、そのテストメソッドが何をテストしたいのかわかりづらくなっている場合があり、日本語にするかどうかは別としても一考の余地ありだと思っています。

でもちょっと待って、そのテストメソッドはなんのため?


テストメソッドって(別のコードから)呼び出さないよね

このメソッドを呼び出すために日本語をカタカタ打ち込んだりする必要はないです。
後から読むだけであり、あとから読むことが重要です。
通常のメソッドと違ってコードの文脈の中で目にすることはなく、見るのは定義本体のみで、通常のメソッド名に求められるような「簡潔さ」は求められません。

詳細に保証(説明)したいことがある

テストメソッドは1つの事柄をテストすべきで、メソッド名はテストで保証(説明)したい事柄を明確にするものであるべきです。
これは1つのテストメソッドにassertionを1つだけとするのが良いとされる理由の一つです。
「そのメソッドが何をテストしているのか」が重要になります。

仕様書を見るのに近い感覚で後から見ることが多い

テスト対象の仕様やインターフェースを保証するドキュメント的な役割を求めてテストケースを見ることがあります。
アウトラインからテストメソッド一覧を俯瞰する等の場合、一目で内容が頭に入ると嬉しいです。

じゃぁ日本語で書いたらよくね?

上に挙げたような理由で、テストが日本語(英語にしても自然文に近い形)で書いてあると得すると考えています。

表現しやすい&伝わりやすい

ドキュメントやWikiを日本語で書く感覚でテストメソッドを日本語で書いています。
対象処理の仕様や気を付けたい罠動作を他者に伝えたいとき、テストが意図することを表現しやすいです。

一覧時の一目で分かる感

テストメソッド一覧を出したり、テストの失敗レポートが出た時などにその効果を感じます。

*ただし

「環境が許せば」です。日本語ネイティブ以外の人が触れる可能性を無視できないなら日本語にするのは難しいでしょうし、「生理的に受け付けない」というのも無視できない理由になり得ます。
ものにもよります。「Githubで公開」的なものは全部英語でやったほうが得が多いでしょう。

まとめ

つまり日本語がどうどいうよりは

  • テストの粒度を小さく保とう
  • テストが何をテストしているのか明確にしよう

追記 2012/04/26

メソッド名に日本語を使うとエディタによってはシンタックスハイライトが正しく動作しないケースがあることが判明。(なにをいまさら)
英語派に寝返る。

2011/07/22 (金)

root権のない一般ユーザーでも開発環境でCI(Jenkins/PHPUnit/Phing)してみたい (中編)

前回の続き、pearでPHPUnitインストールなど。

自分用pearの準備

pear自体はPHPについてくるので誰でもつかえると思うんですが、インストール先が/usr/local/phpとかだったり、そもそもpearが古かったりするので自分用のを入れましょう。

.pearrcの生成

/home/calpo/pear に自分用のpearを置くとすると、以下のようにします。

$ cd ~/
$ pear config-create /home/calpo/share .pearrc
Configuration (channel pear.php.net):
=====================================
Auto-discover new Channels     auto_discover    <not set>
Default Channel                default_channel  pear.php.net
HTTP Proxy Server Address      http_proxy       <not set>
PEAR server [DEPRECATED]       master_server    <not set>
Default Channel Mirror         preferred_mirror <not set>
Remote Configuration File      remote_config    <not set>
PEAR executables directory     bin_dir          /home/calpo/share/pear
PEAR documentation directory   doc_dir          /home/calpo/share/pear/docs
PHP extension directory        ext_dir          /home/calpo/share/pear/ext
PEAR directory                 php_dir          /home/calpo/share/pear/php
 ・
 ・

.pearrcには自分用pearの設定が保存され、↑で出力された内容は"pear config-show"でいつでも確認できます。

自分用pear本体のインストール
$ pear install -o PEAR
WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-update pear.php.net" to update
downloading PEAR-1.9.4.tgz ...
 ・
 ・
PEAR: To install optional features use "pear install pear/PEAR#featurename"

自分用pearが/home/calpo/share/pear/pearにできました。

pearコマンドが自分用pearを指すようにする

ただそのままだと結局共有pearを見に行っているので・・・

$ which pear
/usr/bin/pear

~/.bashrcあたりにパスを追加

export PATH=/home/calpo/share/pear:${PATH}
# aliasでもいいかも?
# alias pear ~/share/pear/pear
$ which pear
~/share/pear/pear

PHPUnitインストール

チャンネル追加してインストール
$ pear channel-discover pear.phpunit.de
$ pear channel-discover components.ez.no
$ pear channel-discover pear.symfony-project.com
$ pear install phpunit/PHPUnit

Did not download optional dependencies: ezc/ConsoleTools, use --alldeps to download automatically
Failed to download pear/HTTP_Request2 within preferred state "stable", latest release is version 2.0.0RC1, stability "beta", use "channel://pear.php.net/HTTP_Request2-2.0.0RC1" to install
phpunit/PHPUnit can optionally use PHP extension "dbus"
pear/XML_RPC2 requires package "pear/HTTP_Request2" (version >= 0.6.0)
phpunit/PHPUnit requires package "pear/XML_RPC2"

文句言われた

一個ずつ足りないものを入れようとするとさらに文句言われたりしたので最終的に↓のようにやった

$ pear install channel://pear.php.net/Net_URL2-0.3.1
$ pear install channel://pear.php.net/HTTP_Request2-2.0.0RC1
$ pear install pear/XML_RPC2
$ pear install phpunit/PHPUnit
$ phpunit -v
PHPUnit 3.5.3 by Sebastian Bergmann.

これでやっと入る

※curl関連でけちが付いた場合は → http://lazesoftware.com/blog/11/0213/

Phingインストール

pearでさっくり
$ pear channel-discover pear.phing.info
$ pear install phing/phing
$ phing -v
PHP Warning:  require_once(phing/Project.php): failed to open stream: No such file or directory in /home/calpo/share/pear/php/phing/Phing.php on line 22

インストールはWarningでつつも無事終わるが動かない。

PHPのinclude_pathが通ってないので通す

通常のpearインストールディレクトリは自動的にinclude_pathに含まれるようになってるんですが、今回は自分用なので自分でinclude_pathを設定する必要があります。
share/pear/php/phing.php の最初の方に↓を追加

<?php
ini_set('include_path', ini_get('include_path').':'.dirname(__FILE__));
 ・
 ・

(本当はphp.iniに書いたりphpコマンド実行時に-dオプション指定したりしたいけど)

./phing -v
Phing 2.4.6

完了。

2011/07/15 (金)

root権のない一般ユーザーでも開発環境でCI(Jenkins/PHPUnit/Phing)してみたい (前編)

JenkinsやPHPUnitやPhingの導入についてのありがたいまとめはいっぱいあります。

世の中のJenkins/PHPUnitのインストール情報はroot権ある人用 (当たり前)

レガシーな開発環境にはPHPUnitなんぞ入ってなかったりします。
そのわりにポートはしっかり閉じられててJenkins起動しても8080で接続できないとか。

  • 仕方ないのでローカルのWindowsPCにJenkinsとか入れて、レガシーコードの方をWindowsPCに落としてきたけどまともに動かない
  • しょうがないのでサンプルスクリプトでちょこっといじって終了

一般ユーザー権だけでJenkins/PHPUnit/Phingしたい

でも実際に業務で触ってるものに対してPHPUnitでテスト書いて、JenkinsとPhingでCIしてみたい。
sudoできる人たちに「努力の方向が間違ってる」といわれそうですが。
でもいいんです。持つものには持たざるものの気持ちなど分からんのです。

ということで以下、一般ユーザーでJenkins/Phing/PHPUnitでCIする説明。

Jenkins インストール

落としてきて起動する。簡単。
$ mkdir jenkins
$ cd jenkins
$ wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
$ java -jar jenkins.war --prefix=/jenkins > jenkins.log 2>&1 &
# もしくは nohup java -jar jenkins.war --prefix=/jenkins > jenkins.log 2>&1

確認
$ wget http://localhost:8080/jenkins/ -O jenkins.html

これでちゃんとJenkinsダッシュボードのHTMLが取れてればOK。

ブラウザからアクセス

http://hoge.example.com:8080/jenkins/ (開発環境ドメインがhoge.example.comの場合)
これでJenkinsさんが出てくればOK。出ない場合は↓に続く。

開発環境にポート8080でアクセスできない場合

jenkinsは動いてるのにローカルPCのブラウザからのアクセスが通らない。
ポート閉じられてる場合の対応。

方法1 ポートかえる

あいているポートがあるならJenkins起動時のオプションに --httpPort=XX つけてそっちにアクセスすればいいかも。
やったことない。

方法2 Apacheを通してアクセスする

設定をいじれる場合(.htaccess不可)に限りますが、プロキシしてあげればいけます。

LoadModule proxy_module modules/mod_proxy.so

ProxyPass /jenkins http://localhost:8080/jenkins
ProxyPassReverse /jenkins http://localhost:8080/jenkins

http://hoge.example.com/jenkins/ にアクセスすればご対面。

方法3 SOCKS Proxyする

個人用のhttpd.confが割り当てられてたりwebサーバー再起動したりできるケースは少ないと思うのでこちらで。
ブラウザからのアクセスをSSHでプロキシしてもらう方法。

  • まずはPuttyの設定
    • Puttyを立ち上げて開発環境に接続する設定を選択して「読込」
    • 接続>SSH>トンネル
    • 「源ポート」に「8080」
    • 「ダイナミック」選択
    • 追加ボタン

と設定して開発環境に接続します。立ち上がったターミナルはそのまま。
f:id:calpo:20110715133603p:image:w360

  • ブラウザの設定 (Firefoxの場合)
    • ツール>オプション>詳細>ネットワーク>接続設定
    • 手動でプロキシを設定する
    • SOCKSホストにlocalhost、ポート8080

f:id:calpo:20110715133604p:image:w360

この状態で、
http://localhost:8080/jenkins にブラウザからアクセスすればご対面。
f:id:calpo:20110715133605p:image:w360


次回pearでのphpunitとphingいんすとーりんぐ