Quickのfdescribeやfitをgrepするスクリプト書いた(+Xcode上でwarningとして表示させた)


最近はQuickとTDDでガリガリテスト書いてます。http://qiita.com/shindyu/items/1d644dfabd067de7233a

その作業中にあると便利かなと思ったスクリプト作ってみたのでメモ。

前置き

iOSテストフレームワークQuickには特定のテストのみを実行するための

fdescribe, fcontext, fit

という構文があります。
https://github.com/Quick/Quick/blob/master/Documentation/ja/QuickExamplesAndGroups.md#指定した-examples-だけ一時的に実行する

一般的にテスト駆動で開発を進めるとテスト数が増加するので、それに伴ってテスト実行時間も増加します。そのため、今書いたテストだけを実行したい!っていう時にはこのfocusが非常に便利です。

しかし、例えばあるテストでfdescribeが残ったままコードをcommitしたりpushしたりすると、以降すべてのテストが実行されない状態のコードが使われることになります。
テスト駆動開発の場合は失敗するテストを書くところから始めるので、すぐ間違いに気づくのですが、精神衛生上あまりよろしくないし、commitやpushする前にわざわざxcodeでfdescribeやfitを検索するのも面倒です。

本題

というわけで前置きが長くなりましたがスクリプト書きました。
(現在の開発スタイルではcommitの前にMakefileでコマンドラインからテスト実行する流れになっているので、Makefileから使えるようにします。)

Makefile

tests:
     checkF <テスト実行>
checkF:
     ./bin/checkF.sh <DIR1> <DIR2> ...

checkF.sh

pattern="fdescribe\|fcontext\|fit"

find $* -type f -name "*.swift" -print | xargs grep -rnw -e $pattern --color=auto

checkF.shの引数にディレクトリ(複数指定可能)を指定すると、対象ディレクトリ内にある(今回は).swiftファイルをgrepして、対象文字列(fdescribeかfcontextかfit)を含むファイル名と行番号をセットで表示します。

 

追記:

Xcodeで特定文字列をgrepしてwarningにする方法

この記事書いてる途中で、これXcodeのRun Scriptに同じようなfind/grep書いて、それをwarningとして出せばxcode上でわかるしめっちゃ便利じゃね!?ってことに気づいたので同じ内容をxcodeのrun scriptに設定。

KEYWORDS="fdescribe|fcontext|fit"
echo "searching ${SRCROOT} for ${KEYWORDS}"
find SampleTests \( -name "*.swift" \) -print0 |\
xargs -0 egrep --with-filename --line-number --only-matching "($KEYWORDS).*\$" |\
perl -p -e "s/($KEYWORDS)/ warning: \$1/"

スクリプトあんまり書いたことなかったので色々と勉強になりました。

参考:http://stackoverflow.com/questions/24183812/swift-warning-equivalent