针对一系列 Git 提交运行自动化测试并跟踪结果
项目描述
git test
git-test是一个命令行脚本,用于针对 Git 存储库中的提交运行自动化测试。它特别针对希望他们的测试通过分支中的每个提交的开发人员,而不仅仅是分支提示。
最好的使用方法git test是在存储库的第二个链接工作树中保持一个窗口打开,并且尽可能频繁地运行
git test run master..mybranch
git test将测试指定范围内的提交,报告任何失败。运行测试的通过/失败结果也会作为 Git“注释”永久记录在您的存储库中(请参阅 参考资料git-notes(1))。
如果该范围内的提交已经被测试过,那么默认情况下git test
会报告旧的结果而不是再次测试它。这意味着您可以在工作时一遍又一遍地运行上述命令,并且git test不会重复它已经知道结果的测试。(当然,有一些选项允许您明确请求重新测试提交。)
测试结果由被测试的树记录,而不是提交,因此即使在某些类型的提交重写中,旧的测试结果仍然有效:
- 如果提交被重写以更改其日志消息、作者身份、日期等,则测试结果仍然有效。
- 如果连续提交被压缩,结果仍然有效。
- 如果一个提交被分成两部分,则只需要测试第一个(部分)提交。
- 如果分支深处的某些提交被重新排序,则在重新排序的提交之上构建的提交的测试结果通常仍然有效。
当然,这意味着您的测试不应该依赖于树中文件以外的东西。例如,您的测试是否通过/失败不应取决于 当前分支名称或提交消息。
用法
定义测试
首先定义您要运行的测试;例如,
git test add "make -j8 && make test"
您指定的字符串可以是任意命令;它与sh -c. 如果测试通过,它的退出代码应该是 0,如果失败,它的退出代码应该是非零。测试定义存储在您的 Git 配置中。
测试一个或多个提交
默认情况下,git test run测试HEAD:
git test run
(如果工作副本脏了,无论如何都会运行测试,但不会记录结果。)
您可以使用单个命令测试一系列 Git 提交:
git test run commit1..commit2
测试针对范围内的每个提交运行,从旧到新。如果提交未通过测试,git test则报告错误并在签出损坏的提交时停止。您还可以指定要测试的单个提交:
git test run commit1 commit2 commit3
或测试通过标准输入提供的任意一组提交:
git rev-list feature1 feature2 ^master | git test run --stdin
您可以使用--verbosity/-v或
--quiet/-q选项调整输出的详细程度。这些选项中的任何一个都可以指定多次。
定义多个测试
您可以在单个存储库中定义多个测试(例如,便宜与昂贵的测试)。他们的结果是分开的。默认情况下,调用的测试default
会运行,但您可以使用
--test=<name>/-t <name>选项指定要添加/运行的不同测试:
git test add "make test"
git test run commit1..commit2
git test add --test=build "make"
git test run --test=build commit1..commit2
重试测试和/或忘记旧的测试结果
如果您有一些不稳定的测试偶尔会因虚假原因失败,您可能希望针对某个提交重新运行测试,即使git test已经记录了该提交的结果。为此,请git test run使用
--force/-f或--retest选项运行。
如果您想在不重新测试的情况下忘记特定的旧测试结果,git test run请使用该--forget选项运行。
如果您想永久忘记特定测试的所有存储结果(例如,如果您的环境中的某些内容发生了变化),请运行
git test forget-results [--test=<name>]
继续测试失败
通常,git test run在它发现的第一个损坏的提交处停止。如果您希望它在失败后继续,请使用
--keep-going/-k选项。
删除测试
要永久删除测试定义及其所有存储的结果,请运行
git test remove [--test=<name>]
求助
关于git test可以通过运行获得的一般帮助
git test help
可以通过以下任一方式获得有关特定子命令的帮助
git test help run
或者
git test run --help
最佳实践:git test在链接的工作树中使用
git test与git worktree. 保留第二个工作树,并在您工作时使用它来持续测试您的当前分支:
git worktree add --detach ../test HEAD
cd ../test
git test run master..mybranch
上一条命令可以随时重新运行;只有当您的分支发生变化时,它才会发挥重要作用。此外,通过此设置,您可以在测试运行时继续在主工作树中工作。
因为链接的工作树与主存储库共享分支和 git 配置,所以测试定义和测试结果在所有工作树中都是可见的。因此,您甚至可以在多个链接的工作树中同时运行多个测试。
安装
要求:
- 最近的 Git 命令行客户端
- 一个 Python 解释器。
git test已使用 Python 2.7 和 3.4 版本进行了测试。它可能适用于从 3.2 开始的任何 Python3 版本(它需要argparse)。
只需bin/git-test在您的 . 中的某处放置$PATH,如有必要,调整其第一行以在您的环境中正确调用所需的 Python 解释器。
未来增强的想法
其他一些不错的功能:
-
对恢复更加一致
HEAD。git test run当前检查您在完成时启动的分支,但前提是所有测试都通过了。我们需要某种git test reset类似于 的命令git bisect reset。 -
git test bisect:git bisect run针对一系列提交运行,使用配置的测试作为bisect用于确定提交是好还是坏的命令。 -
git test prune:删除过时树的注释。 -
持续测试模式,其中
git test监视存储库的更改,并在它正在监视更改的提交时自动重新运行。 -
测试之间的依赖关系;例如:
- 提供一种方式来表达“如果我的
full测试通过,这意味着build测试也会通过”。 - 作为测试的第一步,提供一种运行
build测试(并记录测试结果)的方法。buildfull
- 提供一种方式来表达“如果我的
-
允许标记树木
skip,如果它们不应该被测试(例如,由于已知的破损)。也许允许测试脚本发出一个特殊的返回码来要求标记提交skip(可能遵循 的约定git bisect run)。 -
记住返回码,如果旧结果被重用,则将其退回。
-
添加一个
git test fix <range>,它启动一个交互式变基,将第一个损坏的提交的命令从“pick”更改为“edit”。 -
支持依赖于commit的测试,而不是依赖于它们运行的 tree的测试。
执照
git test在 GPLv2+ 许可下发布。欢迎在项目的 GitHub 页面上提出拉取请求,https://github.com/ligurio/git-test
警告和免责声明
git test有相当不错的自动化测试,但毫无疑问它仍然存在错误和粗糙的边缘。需要您自担风险使用它。
请注意,当您告诉git test run测试指定的提交时,它会在您的工作目录中检查这些提交。如果测试失败,它将以分离的 HEAD 状态签出失败的提交。这是有意的,以便您可以检查失败的原因。但这意味着,如果您在原始 HEAD 上进行了不属于任何分支的更改,那么它们现在将无法访问。
如果您不知道分离的 HEAD 状态是什么,请继续阅读。此外,建议您git test在单独的工作树中运行,这样更方便(请参阅上面的说明)。请注意,该git worktree命令是在 Git 2.5 版中添加的,因此请确保您使用的是该版本的 Git 或(最好)更新版本。
上述注意事项不适用于git test针对 HEAD 或您当前的工作树运行。换句话说,
git test run
和
git test run HEAD
不要更改已签出的提交,它们不会将您的工作副本更改为分离的 HEAD 状态。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。