🔄

ファイルを保存した瞬間ユニットテストを実行

2013/02/24に公開

概要

いままで、vimでコーディングするときは「コードを書く、→ユニットテストを実行する」の繰り返しばかりで同じような操作をしていましたが、ファイルを保存した瞬間にユニットテストを実行できるようにしました。

上記のスクリーンショットのように、別のtmuxなどの別ペインに表示しておけば保存した瞬間にユニットテストの実行結果が見られます。

ソースコード

Gist

qiita.rb
##!/usr/bin/env python
## -*- coding: utf-8 -*-
import sys
import datetime
import time
import os
from stat import *
import commands
import fnmatch
 
 
def watch(dir, command, extension):
    timestamp = time.mktime(datetime.datetime.now().utctimetuple())
    while True:
 
        for root, dirnames, filenames in os.walk(dir):
            for filename in fnmatch.filter(filenames, '*' + extension):
                file = os.path.join(root, filename)
                file_timestamp = os.stat(file)[ST_MTIME]
                if timestamp < file_timestamp:
                    timestamp = file_timestamp
                    print "Executing..."
                    print(commands.getoutput(command))
                    break
        # 100ミリ秒待機
        time.sleep(0.1)
 
def help():
    print(u'第一引数が監視対象のディレクトリです.')
    print(u'第二引数が監視下のファイルに変更があった場合に実行するコマンドです.')
    print(u'第三引数が拡張子')
    print(u'例: % dirwatch . \'phpunit\' \'php\'')
    print(u'例ではカレントディレクトリ内のファイルに変更があった場合にhelloと表示します.')
 
if __name__ == '__main__':
    # 引数足りない場合にヘルプを表示する.
    if 4 > len(sys.argv):
        help()
    else:
        watch(sys.argv[1], sys.argv[2], sys.argv[3])

設置例

% wget https://gist.github.com/matsubo/4992894/raw/36c0c4a08953effabfa2731ccd5186f2d6c92347/dirwatch.py
% chmod 755 dirwatch.py

引数

% ./dirwatch.py [ファイル監視先ディレクトリ] [ファイルが変更されたら実行するコマンド] [監視対象のファイル拡張子]

実行例

% ./dirwatch.py /path/to/sourcecode/ phpunit php
% ./dirwatch.py /path/to/sourcecode/ "phpunit Tests/UserRegistrationTest.php" php

以下のように、ファイルを保存した瞬間にユニットテストが実行されます。テストファーストで開発し、screenやtmuxでウィンドウ分割して常時表示しておくととても良いです。
phpunitの例

Discussion