Skip to main content

针对一系列 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 testgit 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 解释器。

未来增强的想法

其他一些不错的功能:

  • 对恢复更加一致HEADgit test run当前检查您在完成时启动的分支,但前提是所有测试都通过了。我们需要某种git test reset类似于 的命令git bisect reset

  • git test bisectgit 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 状态。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

git-test-0.1.0.tar.gz (5.3 kB 查看哈希)

已上传 source

内置分布

git_test-0.1.0-py3-none-any.whl (11.7 kB 查看哈希

已上传 py3