为什么要在CI服务器上运行单元测试?
当然,当某些事情要掌握时,开发人员已经在之前运行了所有单元测试,并修复了新代码可能发生的任何错误。这不是单元测试的重点吗?否则,他们只会提交损坏的代码。
master
应始终保持理智,最好在每次合并时自动部署到用于内部质量检查和测试的过渡环境。
为什么要在CI服务器上运行单元测试?
当然,当某些事情要掌握时,开发人员已经在之前运行了所有单元测试,并修复了新代码可能发生的任何错误。这不是单元测试的重点吗?否则,他们只会提交损坏的代码。
master
应始终保持理智,最好在每次合并时自动部署到用于内部质量检查和测试的过渡环境。
Answers:
当然,当某些事情要掌握时,开发人员已经在之前运行了所有单元测试,并修复了新代码可能发生的任何错误。
或不。发生这种情况的原因可能有很多:
但是真正的重点是在不是开发人员机器的机器上运行测试。一种配置不同的文件。
这有助于找出测试和/或代码依赖于特定于开发人员的工具(配置,数据,时区,语言环境等)的问题。
CI构建运行测试的其他良好理由:
作为一个在提交源代码管理之前不会运行所有集成和单元测试的开发人员,我将在这里提出自己的辩护。
我将必须构建,测试和验证应用程序在以下位置正确运行:
添加Fortran(具有Intel和GNU编译器),Python(以及不同版本,具体取决于操作系统)和bash / bat脚本组件,嗯,我认为您可以看到事情逐渐发展起来
这就是我必须拥有的16台机器,每天只能运行几次测试。仅为此管理基础结构,这几乎是一项全职工作。我认为几乎所有人都会同意这是不合理的,尤其是将其乘以项目中的人数。因此,我们让CI服务器完成工作。
单元测试不会阻止您提交损坏的代码,它们会告诉您是否知道您已损坏了某些内容。人们可以说“单元测试应该是快速的”,并继续讨论原理,设计模式和方法论,但实际上有时让我们为重复性,单调任务设计的计算机能够更好地完成这些任务,并且只有在它们参与进来后,告诉我们他们发现了一些东西。
除了出色的Oded答案:
我曾经在一家由于合并和部署过程而存在很多部署错误的公司工作。这是由于一个奇怪的专有框架导致测试和CI变得困难。发现无法在开发中完美使用的代码并没有投入生产,这不是一个快乐的经历。
您会以为不是-但是开发人员是人,有时会忘记。
同样,开发人员经常无法提取最新代码。他们的最新测试可能运行良好,然后在签入时,其他人做出了重大更改。
您的测试也可能依赖于本地(未签入)资源。您的本地单元测试无法进行。
如果您认为以上所有都是幻想,那么在CI之上(至少在TFS上)有一个称为Gated的级别,在该级别中,具有失败测试的构建将被搁置,并且不提交给代码库。
等到某个东西掌握了
我通常将CI配置为在每次提交时都运行。在测试分支之前,分支不会合并到master中。如果您依赖在master上运行测试,那么这将打开一个窗口,以破坏构建。
在CI机器上运行测试是关于可重现的结果。由于CI服务器具有从VCS提取的已知干净环境,因此您知道测试结果是正确的。在本地运行时,您可能会忘记提交通过它们所需的一些代码,或者忘记了使它们在失败时通过的未提交代码。
通过并行运行不同的套件,它还可以节省开发人员的时间,特别是如果某些缓慢,耗时数分钟的测试,并且每次更改后不太可能在本地运行。
在我目前的工作中,我们的生产部署是通过CI并通过所有测试的。除非通过脚本,否则部署脚本将阻止部署。这使得不可能意外忘记运行它们。
CI作为工作流的一部分,也减轻了开发人员的负担。作为开发人员,您通常是否对每一个更改都运行lint,静态分析器,单元测试,代码覆盖率和集成测试?CI可以完全自动且无需考虑-减少决策疲劳。