问题描述
在持续交付(CD)环境中,新功能被隐藏在特性开关(feature flags)后面,有必要确保推送到生产环境的代码在效果上几乎是零变化的。尤其在受变更管理控制的环境中,理想情况是不将代码部署视为变更,只视为特性开关的启用。为了实现这一点,有没有方法可以证明所有的代码更改都受到了特性开关的保护?并且实际上的代码流变化是零变化的。感觉这应该是一个有可能且应该存在的需求。但也许其他人采用不同的方法来解决这个问题?
解决方案
请注意以下操作可能涉及版本差异及风险,确保谨慎操作。
方案1
静态分析工具本身难以完全验证特性开关的行为,因为这需要对应用程序行为有一定的了解。为了证明所有代码更改都受到特性开关的保护,需要运行一个关闭所有特性开关的测试套件。
在使用特性开关时,是否需要测试“开”状态和“开”状态的组合取决于你如何使用特性开关。如果你使用它们来隐藏开发中的功能,与将系统配置为用户可配置的特性开关相比,情况就大不相同。或者特性开关可能具有多个值。特性开关和特性值越多,组合就越多。这很快就可能只需要测试“选定的组合”。
方案2
一种方法是编写自定义脚本或使用工具来检查特性开关是否生效,以及检查特性开关是否对应用的行为产生所需的变化。这可以作为一个补充,不仅仅依赖于静态分析。
例如,你可以编写脚本来模拟特性开关的开和关,然后运行一系列测试来验证应用程序在不同特性开关状态下的行为是否正确。这将需要一些脚本编写和测试编写工作,但可以提供对特性开关行为的额外保障。
总结
确保特性开关在持续交付环境中的安全性是一个复杂的问题,无论是通过静态分析还是编写测试脚本,都需要仔细考虑应用程序的特性开关使用方式以及可能的行为变化。综合多种方法,可以增加特性开关的安全性,并在部署新代码时减少潜在的变更。
请记住,特性开关的使用要考虑不同的使用场景,以及特性开关可能对应用程序行为带来的影响。综合考虑不同层级的测试,包括单元测试、组件/服务/接口测试以及整体接受测试,以确保特性开关的有效和安全使用。