テスト駆動開発

テスト駆動開発とは、Test-Driven Development(TDD)のこと。

ふつう、コードを書いてからテストを書くところを、
まずテストを書いて、それからコードを書こうという開発手法。

ふつうの書き方の場合は、設計と実装をコードを書くときにまとめてやる必要があるが、TDDの場合テストで設計、コードで実装と分割できて負担が減るということらしい。

一般に、TDDはリファクタリングまで含めて説明される事が多い。ただ、単体テストを書いていれば、TDDの順番じゃなくてもリファクタリングはできると思う。

そこはTDDと単体テストの言葉の定義の話かもしれない。

リファクタリング

仕事では、時間がなかったり、技術力が足りなかったりして、やっつけでコードを書いてしまいがち。結果、コードが汚くなっていく。コピペの重複コードとか、不適切な変数名とか。

そういうのが積み重なって、コードがわからなくなっていく。それを技術的負債と呼ぶ。とりあえず動いていても、バグ修正や仕様変更、担当引き継ぎのときに苦労することになる。技術的負債を解消することをリファクタリングと呼ぶ。地道にリファクタリングしていくほうが、その時間を新規開発に充てるより多くの場合長期的に得である。

リファクタリングは、まとめてやるととたんに難しくなる。少しずつ、こまめに、毎日やるべき。

大がかりなリファクタリングは、状況を考慮してやるかどうか決定しよう。プロジェクト終了間際にはやる必要がないかもしれない。時間がもったいないうえに、その後コード修正が無いかもしれないから。

とはいえ、リファクタリングは怖い。うっかり変更して、不具合が出るかもしれない。このジレンマを解消するのがテスト自動化リファクタリング後にテストを行い、すべて通れば思わぬ副作用が(おそらく)ないことを確認できる。

ユニットテスト

小さな単位で行うテストテストのこと。小さな単位とは、たとえばメソッドである。

昨今はユニットテストを自動化するのが一般的になっている。
自動化すると、テスト実行の負担がほぼゼロになる。
(そのかわり、テスト自動化のコードを書くため、コードを書く量は大幅に増える。)
つまり気軽にテストを繰り返せる。ちょっと書いて気軽にテストできる。気軽に回帰テストができるので、細かくリリースができる。また、ユニットテストに通っているので、まあまあ安心してリリースができる。

vim ちょっとした繰り返し

使い捨てのちょっとした繰り返し作業は、レジスタにマクロを保存すると楽。 q{register}で保存開始。qで終了。@{regiser}で呼び出し。

たとえば、.erbファイル編集中、コマンドを<%= %>で囲みたいとする。

qaI<%= <ESC>A %><ESC>q

I<%= <ESC>A %><ESC>レジスタaに記録できる。

puts 123
puts 456

の1行目で@aを入力すると、

<%= puts 123 %>
puts 456

となる。2行目を囲むには、2行目でまた@aとしてもよいが、直前のマクロは@@で再実行できる。少しだけ楽。なので2行目は@@と入力。

<%= puts 123 %>
<%= puts 456 %>

レジスタを使ったマクロは以上。

その場だけでなく、今後も使いたいマクロはにmapしたほうがいいかも。

nnoremap <leader>a I<%= <ESC>A %><ESC>

自分は上のように設定している。\aで呼び出せる。

ssh

ssh(Secure SHell)の、もっとも単純な使い方は以下のとおり。

$ ssh username@hostname

たとえば職場で、会議室のPCから自分のPCを操作したいとき。まずは自分のPCのhostnameを調べる。自分のPCでifconfig(CONFIGure network InterFace parameters)をすればIPアドレスを確かめられる。自分のIPアドレスが192.168.12.34だったら、

$ ssh matzryo@192.168.12.34

でログインできる。(要パスワード入力)

アジャイル、スクラム、XP

ってなんだろう。

ちょっと調べた感じ、アジャイルは理念で、スクラムとかXPは実践の方法を集めたものかな。

egrep マッチする部分を抽出する

smartyのテンプレートファイルから、変数名のリストを抽出したかった。
${ と } で囲まれた変数名を、重複を省いてリストにしたい。一行に複数の変数名がある場合があることにも注意すべきだ。

たとえばこんなファイルがあるとする。

--code--
{$apple}
--code--{$apple}--code--{$chocolate}--code--{$banana}--code--
--code--{$banana}--code--{$chocolate}--code--

これに埋め込まれている変数名を、

apple
banana
chocolate

のように抜き出したい。

とりあえずegrep '{\$.+}' sample.tplしてみる。

{$apple}
--code--{$apple}--code--{$chocolate}--code--{$banana}--code--
--code--{$banana}--code--{$chocolate}--code--

そうだね。行ごと出力されるね。-o(--only-matching)オプションで、マッチ部分のみ出力する。

$ egrep -o '{\$.+}' sample.tpl
{$apple}
{$apple}--code--{$chocolate}--code--{$banana}
{$banana}--code--{$chocolate}

greedy matchするね。?をつけてnon-greedy matchにする。

$ egrep -o '{\$.+?}' sample.tpl
{$apple}
{$apple}
{$chocolate}
{$banana}
{$banana}
{$chocolate}

よし。これをソートしてユニークにする。

$ egrep -o '{\$.+?}' sample.tpl | sort | uniq
{$apple}
{$banana}
{$chocolate}

まあオーケー。でも、{$ と } がないほうがいい。

$ egrep -o '{\$(.+?)}' tes.txt | sort | uniq | sed 's/{\$//' | sed 's/}//'
apple
banana
chocolate

よし。
でももっといい方法がいくらでもあるはずだ。

2016/8/25追記: これでも可能。

$ egrep -o '{\$.+?}' tes.txt | sort | uniq | tr -d '${}'