持续集成 - 降低风险

项目中出现问题的可能性很大.通过有效地实施CI,您可以了解在整个过程中的每个步骤中发生的事情,而不是在项目进入开发周期时. CI可以帮助您识别和降低风险,并根据具体证据更轻松地评估和报告项目的健康状况.

本节将集中讨论风险可以通过使用持续集成来避免.

在任何项目中,都需要管理许多风险.通过消除开发生命周期早期的风险,当系统实际上线时,这些风险发生问题的可能性较小.

风险1  - 缺乏可部署软件

"它可以在我的机器上运行,但不能在另一台机器上运行"  - 这可能是任何软件组织中遇到的最常见的短语之一.由于每天对软件构建所做的更改次数很多,因此有时对软件构建是否真正起作用几乎没有信心.这种担忧有以下三个副作用.

1、对我们是否可以构建软件几乎没有信心.

2、在内部(即测试团队)或外部(即客户)交付软件之前的冗长集成阶段,在此期间没有其他任何事情可以完成.

3、无法生成和复制可测试版本.

解决方案

消除IDE与构建过程之间的紧密耦合.使用单独的机器仅用于集成软件.确保构建软件所需的一切都包含在版本控制存储库中.最后,创建一个持续集成系统.

持续集成服务器可以在检测到存储库更改时监视版本控制存储库中的更改并运行项目构建脚本.可以增加持续集成系统的功能,包括使构建运行测试,执行检查,以及在开发和测试环境中部署软件;通过这种方式,您总是可以使用正常运行的软件.

"无法与数据库同步"  - 有时开发人员无法在开发过程中快速重新创建数据库,因此发现很难做出改变.这通常是由于数据库团队和开发团队之间的分离.每个团队都将专注于自己的职责,彼此之间几乎没有合作.这个问题有以下三个副作用和减号;

  • 害怕进行更改或重构数据库或源代码.

  • 使用不同的测试数据集填充数据库的难度很大.

  • 难以维持开发和测试环境(例如,开发,集成,质量保证和测试).

解决方案

上述问题的解决方案是确保执行版本控制存储库中所有数据库工件的放置.这意味着重新创建数据库模式和数据所需的一切:数据库创建脚本,数据操作脚本,存储过程,触发器和任何其他数据库资产都是必需的.

重建数据库和通过删除和重新创建数据库和表来构建脚本中的数据.接下来,应用存储过程和触发器,最后插入测试数据.

测试(并检查)您的数据库.通常,您将使用组件测试来测试数据库和数据.在某些情况下,您需要编写特定于数据库的测试.

风险2  - 在生命周期的后期发现缺陷

既然有这样的话许多开发人员经常对源代码进行的许多更改,总是有可能在代码中引入一个只能在稍后阶段检测到的缺陷.在这种情况下,这可能会产生很大的影响,因为软件中检测到的缺陷越晚,删除缺陷的成本就越高.

解决方案

回归测试 : 这是任何软件开发周期中最重要的方面,再次进行测试和测试.如果软件代码有任何重大更改,则绝对必须确保运行所有测试.这可以在Continuous Integration服务器的帮助下实现自动化.

测试覆盖率 : 如果测试用例不能涵盖代码的整个功能,则无需测试.确保为测试应用程序而创建的测试用例是完整的并且所有代码路径都经过测试非常重要.

例如,如果您有一个需要测试的登录屏幕,你不能拥有一个成功登录场景的测试用例.您需要有一个负面的测试用例,其中用户输入不同的用户名和密码组合,然后需要查看在这种情况下会发生什么.

风险3  - 缺乏项目可见性

手动沟通机制需要大量协调,以确保及时向合适的人员传播项目信息.向你旁边的开发人员倾斜,让他们知道共享驱动器上的最新版本是相当有效的,但它不能很好地扩展.

如果还有其他内容怎么办?需要此信息的开发人员是否休息或无法使用?如果服务器出现故障,您如何通知?有些人认为他们可以通过手动发送电子邮件来降低这种风险.但是,这不能确保信息在正确的时间传达给合适的人,因为您可能会意外地遗漏有兴趣的人,有些人当时可能无法访问他们的电子邮件.

解决方案

此问题的解决方案是Continuous Integration服务器.所有CI服务器都可以在构建失败时触发自动电子邮件.通过向所有关键利益相关者的自动通知,还确保每个人都了解软件的当前状态.

风险4  - 低质量软件

存在缺陷,然后存在潜在缺陷.当您的软件设计不合理或者不符合项目标准或维护复杂时,您可能会遇到潜在的缺陷.有时人们会将此称为代码或设计气味 - "某种情况可能是错误的."

有些人认为低质量的软件只是延迟的项目成本(交付后).它可能是延迟的项目成本,但在将软件交付给用户之前,它还会导致许多其他问题.过于复杂的代码,不遵循架构的代码和重复的代码 - 所有这些通常都会导致软件出现缺陷.在它们出现缺陷之前找到这些代码和设计气味可以节省时间和金钱,并且可以产生更高质量的软件.

解决方案

有一些软件组件可以执行代码质量检查,可以与CI软件集成.这可以在构建代码之后运行,以确保代码实际符合正确的编码指南.