Linuxでテストクラス群からアサーション数をカウントする方法

自分が担当しているプロジェクトでは、Jenkinsを利用してPHPUnitの実行結果の管理をしています。
テスト件数やバグ数の推移などがグラフィカルに確認できて大変重宝しています。

そのチャートをながめていて、ふと実際に使われているアサーションの数はどのぐらいだろう?と思ってコマンドを使って調べてみました。

コマンド実行例

プロジェクトが配置してあるサーバーにログインして下記を実行。

> cd [TARGET_DIR_IN_TEST_CLASS]
> find ./ -name "*.php" | xargs grep -h -o 'assert[^(]*' | sort | uniq -c
     30 assertArrayHasKey
      3 assertContains
     11 assertEmpty
    200 assertEquals
     50 assertFalse
     10 assertGreaterThan
     30 assertInstanceOf
      5 assertNotContains
     29 assertNotEmpty
     17 assertNotEquals
     50 assertNotNull
     20 assertNull
      5 assertRegExp
     10 assertSame
     70 assertTrue

※ カウント数や利用メソッドは実際の値ではありません。

各アサーションメソッドごとに出現回数をカウントしています。

コマンド解説

実際に利用したコマンドは基本的なものが多いですが、コマンドごとに役割を再確認。

1. findコマンド

基本中の基本ですね。
サーバー内から任意の文字列でファイルやディレクトリを検索します。
だいたい利用するときは、

find ~/ -name [file_name]

を利用しています。

今回は事前に任意のディレクトリへ移動しているので対象は「./」でカレントディレクトリ以下としています。

対象は -nameオプションで指定します。
テストクラスはPHPファイルなので「.php」とテストクラスが格納されているディレクトリのTOPへ移動しているので「*」でワイルド・カードを利用しました。

2. xargsコマンド

このコマンドは最近まで知りませんでした。。。
コマンドの説明は、
標準入力から生成したコマンドラインを実行する
だそうです。

文字だけだとちょっとよくわからなかったので、今回のコマンドで考えてみます。

find ./ -name "*.php" | xargs grep -h -o 'assert[^(]*'
  1. findで検索結果の一覧を標準出力に出力。
  2. findの結果をパイプ経由でxargsが標準入力として受け取る。
  3. 受け取った結果をgrepコマンドを実行

他にもいろいろと用途があって便利なコマンドのようなので継続して確認する。

3. grepコマンド

もっともよく利用するコマンドですね。
役割もとってもシンプルで、文字列を検索する。です。

ただ、利用したオプションの -h と -o は初めて使ったので解説。

最終的に集計をかけているので、
-hオプションでファイル名を表示しない、
-oオプションでマッチした部分のみ取り出しています。

たとえば下記のような記述があったとしてハイライトされた行を抽出対象とする。

$actual = hoge();
$this->assertTrue($actual);

$expect = ['hoge' => 'test', 'fuga' => 'test2'];

$actual = hoge2();
$this->assertEquals($expect['hoge'], $actual['hoge']);
$this->assertEquals($expect['fuga'], $actual['fuga']);

マッチ部分の指定の正規表現は「’assert[^(]*’」として、
最初に出現したassert文字列から最初の「(」の手前までを表現しています。

ただし、コメントアウト行までは考慮していないのであくまで目安ということで。

4. sortコマンド

行の並び替えを行うコマンドです。
オプションなしで利用しているので辞書順にソートしています。

後述のuniqの集計のために利用しました。

オプションでソートする列の指定や、逆順の指定など当たり前な指定が可能。

ただし、日本語が含まれる場合にはちょっと注意が必要らしいです。
(参考サイト参照のこと)

5. uniqコマンド

連続して重複する行を1つにまとめるコマンドです。
連続して」がポイントで、あらかじめソートしていないとうまく集計ができません。

カウントを出すために -cオプションを利用してそれぞれの単語の重複数を表示しています。

今回は、件数がざっくり確認できればいいかなと思ったのでここまで。

さらにパイプでソートを行うことで集計結果の再ソートも可能。

番外編. パイプ

コマンドの実行結果を次のコマンドの入力として扱えるようにするシェルの機能。
実行コマンドをパイプでつなげることで複数の処理をワンライナーで実行可能にする。

lsやpsとgrepをパイプして結果を標準出力する用途が一番多いかなと。

まとめ

今回調べてみて、普段何気なく使ってるコマンドでも組み合わせ次第でいろいろなことができることを学びました。
一度理屈がわかればいくらでも応用できる汎用性があるので、これからも継続して「何かしたい時にコマンド実現」にチャレンジしようと思います。

参考サイト

【Linux】複数あるファイルの中から特定の文字列を検索するコマンド
[unix]単語抽出するちょっとしたテクニック
正規表現で部分マッチに .* を使うと上手くいかないことがあるよ、という話
grepのオプションおさらい
sort コマンド
Linux入門⑤:基本コマンド(grep、フィルタコマンド)
【 uniq 】 ソート済みのファイルから重複した行を削除する

(linuxコマンドは弱いので簡単な内容でも結構調べたなぁ。。。)

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る