読者です 読者をやめる 読者になる 読者になる

アヤチノオト

覚書のこと

gitのhookを使ってコミットする前にpythonのunittestを走らせる

タイトルの通り、gitのフックを使ってコミットするたびにpythonのunittestを走らせます。
他の言語でもだいたいおなじ手順でできると思います。

準備

まず。自分のプロジェクトの.git/hooksフォルダにpre-commitというファイルを作って実行権限を付加。

my_ptoject/.git/hooks $ touch pre-commit
my_ptoject/.git/hooks $ chmod +x pre-commit

my_project/.git/hooks/pre-commit

コミット前にこのシェルスクリプトが実行されます。cygwin環境ならバッチでもいけるかもしれません(未確認)

#!/bin/sh
python test.py

my_project/test.py

import unittest


class Test(unittest.TestCase):
    def test(self):
        self.assertTrue(False)  # 失敗するテスト

if __name__ == '__main__':
    unittest.main()

試しにコミットしてみる。

my_ptoject $ git add test.py
my_ptoject $ git commit -m "hoge"
F
======================================================================
FAIL: test (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test.py", line 6, in test
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=1)
my_project $ git status # テストが失敗したのでコミットされていない
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#	new file:   test.py
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   test.py
#

テストを書きなおすと……

import unittest


class Test(unittest.TestCase):
    def test(self):
        self.assertTrue(True)  # 成功するテスト

if __name__ == '__main__':
    unittest.main()

今度はテストが成功するのでコミットできるはずです。

my_project $ git commit -m "I've pass the test!"
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
[master (root-commit) b92c213] I've pass the test!
 1 files changed, 9 insertions(+), 0 deletions(-)
 create mode 100644 test.py