预提交钩子单元测试

4
我正在尝试运行一个 pre-commit 钩子,如果我的单元测试不通过,则会阻止我提交。目前,我有一个 shell 脚本来运行测试,我的终端告诉我它们失败了,这很好。但是,我不确定在我的 Shell 脚本中应该放什么来实际停止我的提交,一旦我的终端检测到我有失败的测试。 像这样: enter image description here 我倾向于认为我缺少的只是一个简单的 if 语句,它检查测试是否失败,然后停止提交,如果测试通过,则完成提交。但是我可能完全错了,这是我第一次使用 shell 脚本,所以我不太确定如何去做。谢谢。

你的测试命令通常会返回失败的退出代码。因此,要么将其放在脚本的最后一行,要么在脚本顶部加上 set -e,或者在其后加上 || exit 1 - Alex028502
3个回答

4

当测试失败时,您需要确保脚本以非零退出码退出。

来自Git文档:

从此脚本中以非零状态退出会导致git commit命令在创建提交之前中止。

https://git-scm.com/docs/githooks

基本上,如果测试失败,则执行exit 1,否则执行exit 0。现在,您可能在所有情况下都执行exit 0(或者只是让脚本结束)。

很可能,您的单元测试已经返回了一个有效的退出代码,您可以使用它来确定脚本的退出代码。

这样做的简单方法是:

<run unit tests>
EXIT_CODE=$?
...
exit EXIT_CODE

我理解不同的退出代码,但我仍然不完全清楚在if语句中应该放什么。所以这是我现在对情况的理解。只是为了将其放入伪代码:如果测试失败 { 退出1 } else { 退出0 }我是否应该费心使用if语句?如果是这样,我应该在条件部分放什么?谢谢。 - benjamin852
如果测试失败 {退出1} 否则 {退出0} — 这样也可以。或者你可以使用 testFail && exit 1 || exit 0 - phd
@phd 但是如果我在if语句中不想写testFail,该写什么呢?我只是将testFail写作伪代码示例。我真正应该在if关键字后面写什么才能真正检查测试是否失败,对此我并不确定。如果我表达不清楚,很抱歉:( - benjamin852
我们怎么知道呢?在你的问题中我们没有看到任何代码... - phd
也许提供更多细节会更好。具体来说,您使用哪个命令来运行测试,并且在运行该命令后,您的脚本执行了什么操作?此外,您可能需要知道 $? 变量显示最后一个退出代码。这适用于终端和脚本。 - mkasberg
@mkasberg 所以在我的shell脚本中,我只有这个命令:xcodebuild test -workspace Hooks.xcworkspace -scheme Hooks -destination 'platform=iOS Simulator,name=iPhone 7,OS=10.3' 然后我的终端告诉我测试失败并提交了项目,我在原始帖子中有一个屏幕截图显示了我的终端。对于延迟的回复表示歉意。 - benjamin852

4
这个简单的 shell 脚本在 .git/hooks/pre-commit 中对我很有用。
#!/bin/sh
npm run test || exit 1

如果npm run test失败,则会将控制权转移到退出(exit)语句,该语句将以正错误代码的形式失败,以终止程序。如果测试通过,则不会执行exit语句。

0

我的Maven项目的.pre-commit-config.yaml文件如下所示。

repos:
-   repo: https://github.com/ejba/pre-commit-maven
    rev: v0.3.3
    hooks:
    -   id: maven-test

参考:https://github.com/ejba/pre-commit-maven

您还可以在这里查看完整的可用预钩子列表,我相信会有适用于您所需语言的单元测试运行钩子,而不是使用 shell 脚本来运行单元测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接