如果每个开发人员在推送之前都运行测试,是否需要在CI服务器中运行测试?

时间:2018-07-06 04:20:28

标签: maven unit-testing jenkins continuous-integration

我不确定运行单元测试的最佳实践是什么。

我想每个开发人员都应在将代码推送到GIT存储库之前在本地通过单元测试。然后,CI服务器(Jenkins)将获取新的更改并再次运行测试。 为什么我们要做两次?应该吗?

如果单元测试需要大量时间来运行,我们是否假设假定我们有一个大型的Maven多用途开发人员,那么开发人员是否只选择与变更相关的测试或运行每个测试(甚至超出其项目范围)?模块POM。

还要考虑我们通常具有用于CI服务器的功能强大的硬件,而对于开发人员而言功能相对较弱的工作站。

2 个答案:

答案 0 :(得分:4)

  

如果单元测试需要很长时间才能运行,我们是否期望   开发人员仅选择与变更相关的测试或每次运行   测试(甚至超出他的项目范围),假设我们有一个很大的   maven多模块POM。

当开发人员更改类,修改数据库结构或进行可能有副作用的任何更改时,他/她将/不知道整个应用程序上的所有潜在副作用。
他/她永远不必试图变得太聪明,只需说:“我知道所做的更改可能会破坏它,所以我将只运行此测试”。

单元测试可确保一定程度的代码质量:别让它变得不太有用

单元测试也是非回归测试。在提交和推送之前不进行所有非回归测试会冒着在源内容管理中引入有缺陷的代码的风险。
您将永远不会做。

单元测试必须快速执行

如果单元测试的执行时间太长,因为它会损害开发人员的速度,则通常意味着它们的设计不当,或者不是真正的 单元测试。单元测试旨在快速运行。
如果您编写的测试由于需要启动服务器,加载/清除数据库中的数据,加载/卸载某些容器等而长时间运行,那么……这意味着您没有编写单元测试,但是集成测试。这些测试并非设计为在本地开发机器上定期自动执行,而是在CI工具上执行。

配置项必须运行所有测试

  

如果每个开发人员都运行测试,是否需要在CI服务器中运行测试?   推之前?

如前所述,集成测试必须由CI工具执行。
关于单元测试,也不希望在CI端执行它们。
当然,开发人员必须先进行测试,然后再推广到SCM,但实际上您不能保证将始终完成。
此外,即使在开发人员在推入之前执行所有测试的理想环境中,您也可能陷入在开发人员计算机上测试成功但在CI或其他开发人员计算机上失败的情况。
例如,开发人员可以在基本代码中引入一些特定于其计算机的绝对路径,或者他/她也可能忘记在CI环境中使用的数据库上复制修改。
因此,运行所有测试(单元测试和集成测试)并不是CI的选择。

答案 1 :(得分:1)

是的,它们应该运行两次。因为如果某些开发人员不这样做,那么他们将永远无法运行。开发人员应在本地运行测试,以确保其代码正确运行。

不过,您的CI系统是您的参考,因此没有人会争辩说它“可以在我的机器上运行”,而对其他人却失败了。期待持续交付,了解CI / CD系统上的状态变得更加重要。

您可能会希望,一直到永远,每个提交都已在本地成功测试(并且所有工作站都与生产系统相同且相同...),但是希望是一个错误的策略。