unit-testing - 如何保证所有单元测试在提交之前通过?

标签 unit-testing svn tortoisesvn continuous-integration

我们最近遇到了一些问题,开发人员向 SVN 提交的代码没有通过单元测试,无法在所有平台上编译,甚至无法在他们自己的平台上编译。虽然这一切都由我们的 CI 服务器(巡航控制)接收,并且我们已经制定了流程来试图阻止它发生,但我们真的希望能够首先阻止流氓提交的发生。

基于此处的其他一些问题,将其强制作为服务器端的预提交 Hook 似乎是一个 Bad Idea™,主要是因为构建 + 运行测试所需的时间长度。我做了一些谷歌搜索,发现了这个(所有开发人员都使用 TortoiseSVN):

http://cf-bill.blogspot.com/2010/03/pre-commit-force-unit-tests-without.html

这将解决至少两个问题(它不会在 Unix 上构建),但如果提交失败,它不会拒绝提交。所以我的问题:

  • 有没有办法让 TortoiseSVN 中的预提交 Hook 导致提交失败?
  • 有没有更好的方法来做我想做的事情?
  • 最佳答案

    您的预提交 Hook 绝对没有理由无法运行单元测试!你所有的 pre-commit 钩子(Hook)要做的是:

  • 将代码 checkout 到工作目录
  • 编译一切
  • 运行所有单元测试
  • 如果单元测试失败,则使钩子(Hook)失败。

  • 这是完全可以做到的。而且,事后,您开发车间的每个人都会讨厌您的胆量。

    请记住,在预提交 Hook 中,必须完成整个 Hook 才能允许提交发生 并且可以将控制权返回给用户 .

    构建和运行单元测试需要多长时间? 10分钟?想象一下,做一个提交并坐在那里 10 分钟等待你的提交发生。 这就是为什么你被告知不要这样做的原因。

    您的持续集成服务器是进行单元测试的好地方。我更喜欢 HudsonJenkins在 CruiseControl 上。它们更容易设置,并且它们的网页对用户更友好。更好的是,他们有各种可以提供帮助的插件。

    开发人员不喜欢知道他们破坏了构建。想象一下,如果您小组中的每个人都收到一封电子邮件,说明您提交了错误的代码。你不会在提交之前确保你的代码是好的吗?

    Hudson/Jenkins 有一些漂亮的图表向您显示单元测试的结果,因此您可以从网页上看到哪些测试通过和失败,因此非常清楚到底发生了什么。 (CruiseControl 的网页对于普通人来说更难解析,所以这些东西并不那么明显)。

    我最喜欢的 Hudson/Jenkins 插件之一是持续集成游戏。在这个插件中,用户会因良好的构建、修复单元测试和创建更多通过的单元测试而获得积分。他们会因为糟糕的构建和破坏单元测试而失去分数。有一个记分牌显示所有开发者的分数。

    我很惊讶开发人员对它的重视程度。一旦他们意识到他们的 CI 游戏分数是公开的,他们就变得非常有竞争力。当构建服务器本身由于某种奇怪的原因失败时,他们会提示,并且他们会因为构建错误而失去 10 分。然而,失败的单元测试的数量一路下降,而编写的单元测试的数量猛增。

    关于unit-testing - 如何保证所有单元测试在提交之前通过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7109387/

    相关文章:

    java - 在 Netbeans/Maven 中远程调试单元测试

    node.js - 用 Jest 模拟间接依赖

    svn - 仅从工作副本中删除文件,而不是从存储库中删除文件

    svn - 在具有本地工作副本的所有文件夹上递归设置 SVN bugtraq 属性

    svn - 我如何查看2个修订版之间更改了哪些文件?

    unit-testing - 如何在 .net 核心中测试 Dapper 查询?

    java - 即使没有单元测试,构建自动化真的有助于提高生产力吗?

    java - 在 Eclipse Subversive 中更改项目 SVN 地址

    svn - TortoiseSVN写锁错误?

    svn - 乌龟SVN : how to svn update folder but NOT its subfolders?