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

Ski*_*ick 35 python git unit-testing githooks

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

我猜我需要用pre-commit/hooks,我已经成功地使它运行测试,但我似乎无法找到一种方法来阻止,如果他们失败测试的承诺.我正在运行测试make test,而后者正在运行python3.1 foo.py --test.似乎我没有得到不同的退出条件,无论测试通过还是失败,但我可能在错误的地方寻找.

编辑:我想在这里做一些不寻常的事吗?我原以为这是一个常见的要求......

编辑2:万一人们无法阅读评论,问题是unittest.TextTestRunner不会以非零状态退出,测试套件是否成功.要抓住它,我做了:

result = runner.run(allTests)
if not result.wasSuccessful():
    sys.exit(1)
Run Code Online (Sandbox Code Playgroud)

Bri*_*ell 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
Run Code Online (Sandbox Code Playgroud)

test.py:

import unittest

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

if __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

Makefile:

test:
    python3.1 test.py
Run Code Online (Sandbox Code Playgroud)

.git/hooks/pre-commit:

#!/bin/sh
make test || exit 1
Run Code Online (Sandbox Code Playgroud)

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

  • @Brian-谢谢.问题是我用`unittest.TextTestRunner`运行我的测试,它不会以非零状态退出.我必须做`如果不是result.wasSuccessful():sys.exit(1)`. (2认同)
  • 这里的另一个问题是测试是在修订版的工作副本上运行而不是分阶段.如果您总是提交所有更改,这不是问题,但如果您进行部分提交,那么您的中间提交可能无法通过测试(请参阅:[http://stackoverflow.com/questions/2412450/git-pre-commit -hook改变的添加,文件/ 3068990#3068990] (2认同)

Von*_*onC 6

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

如果要挂起提交,挂钩应在发出适当的消息后以非零状态退出.

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

  • 有趣的是,在Git Book中,Scott Chacon使用Ruby做了类似的事情(解析测试结果):http://book.git-scm.com/5_git_hooks.html (2认同)