只有在测试通过时才在git中提交

时间:2010-01-18 15:47:51

标签: python unit-testing git githooks

我最近开始使用git,并开始进行单元测试(使用Python的unittest模块)。我想在每次提交时运行我的测试,只有在他们通过时才提交。

我猜我需要在pre-commit中使用/hooks,我已经设法让它运行测试,但我似乎找不到停止提交的方法他们测试失败。我正在使用make test运行测试,python3.1 foo.py --test正在运行unittest.TextTestRunner。无论测试通过还是失败,我似乎都没有得到不同的退出条件,但我可能会在错误的位置找到它。

编辑:我想在这里做什么不常见?我原以为这是一个常见的要求......

Edit2:以防人们无法阅读评论,问题是result = runner.run(allTests) if not result.wasSuccessful(): sys.exit(1) 不会以非零状态退出,无论测试套件是否为成功与否。为了抓住它,我做了:

{{1}}

3 个答案:

答案 0 :(得分:31)

我会检查以确保每个步骤,您的脚本在失败时返回非零退出代码。如果测试失败,请检查python3.1 foo.py --test是否返回非零退出代码。检查以确保您的make test命令返回非零退出代码。最后,检查您的pre-commit挂钩本身在失败时返回非零退出代码。

您可以通过在命令末尾添加|| echo $?来检查非零退出代码;如果命令失败,将打印退出代码。

以下示例适用于我(我将stderr重定向到/dev/null以避免在此处包含太多无关输出):

$ python3.1 test.py 2>/dev/null || echo $?
1
$ make test 2>/dev/null || echo $?
python3.1 test.py
2
$ .git/hooks/pre-commit 2>/dev/null || echo $?
python3.1 test.py
1

<强> test.py

import unittest

class TestFailure(unittest.TestCase):
    def testFail(self):
        assert(False)

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

<强> Makefile

test:
    python3.1 test.py

<强> .git/hooks/pre-commit

#!/bin/sh
make test || exit 1

请注意|| exit 1。如果make test是挂钩中的最后一个命令,则不需要这样做,因为最后一个命令的退出状态将是脚本的退出状态。但是如果您在pre-commit挂钩中稍后进行了检查,那么您需要确保退出时出错;否则,钩子末尾的成功命令将导致脚本退出状态为0

答案 1 :(得分:6)

你能解析python测试会话的结果并确保以非零状态退出预提交钩子吗?

  

如果发出适当的消息,钩子应该以非零状态退出   它想要停止提交。

因此,如果您的python脚本因任何原因未返回相应的状态,则需要直接从pre-commit钩子脚本确定该状态。
如果测试失败,这将确保提交不会继续进行 (或者您可以从钩子中调用一个python包装器来调用测试,并根据测试结果确保sys.exit(exit_status)

答案 2 :(得分:0)

另一种选择,如果您不想手动处理预先提交,请执行以下操作: 有很好的工具可以运行Python,Ruby等测试和语法检查:github/overcommit