# 可持续软件测试：为更绿色和更高效的未来制定 5 项策略


最近看到一篇文章是关于软件测试与节能减排的讨论的，可持续发展这个观点在西方国家目前经常被拿出来探讨，因为这与气候变化等的人类世问题关系非常密切。把这篇[可持续软件测试：为更绿色和更高效的未来制定 5 项策略](https://www.linkedin.com/pulse/sustainable-software-testing-5-strategies-greener-efficient-mair) 简单翻译了一下，里面还是有很多中肯的建议的，一些看法其实与效能提升关系密切，毕竟效率提高了，消耗和浪费可能会有所减少。

### 背景

在技术进步与进步同义的时代，软件开发的生态足迹往往被忽视。

- ShiftProject 的一项研究估计，2018 年信息和通信技术(ICT)行业的碳足迹约占全球温室气体排放的 2-3%。
- 彭博社预测，到 2030 年，IT 系统将占全球能源需求的惊人 20%。从这个角度来看，交通运输业目前占全球能源消耗的 25%。
- 根据国际能源署(IEA)的数据，2018 年数据中心在全球消耗了约 200 太瓦时(TWh)的电力。

绿色软件开发的出现宛如灯塔，提供了一种转向生态友好实践的范式转变，与全球对可持续发展的迫切呼吁一致。这种方法不仅仅是一个流行语，它呼吁在软件生命周期中致力于资源效率、减少能源消耗和全面考虑环境。

通过优化软件测试流程中的资源利用和能源需求，组织可以降低整体测试成本。对于大型测试项目来说，这可以节省大量的资金。此外，测试过程变得更加高效和流线化，从而实现更快的交付周期和更短的上市时间。

目标很简单：优化测试策略和自动化实践，以节省资源，从而节省能源。

以下是 5 项策略，可立即在您的组织中启动“绿色 QA”。

### 1. 使所有测试执行“上下文相关”

- 仅执行与代码更改相关的测试。避免盲目执行；不要在每个环境上运行每个测试。避免大批量的测试执行。这将减少资源消耗并最大限度地减少能源使用。
- 避免像晚上、一天多次等计划执行。这些执行会消耗太多资源，如果自上次执行以来部署的代码没有变化，则可能不会提供任何价值。
- 将测试隔离，确保每个测试套件或测试用例在不影响其他测试套件或测试用例的情况下独立运行。这可以防止资源争用并提高并行执行的整体效率。减少测试间依赖，以便更容易地在不等待其他测试完成的情况下并发执行测试。
- 利用云平台进行测试执行，因为它们可以根据需要动态分配资源。这可以为能源效率做出重大贡献。
- 重新设计 CI 和 CD pipeline，以在各种“测试”阶段结合上述原则。

可以通过转向 Trunk-based 开发和使用注释在代码中标记测试并将其作为参数传递给 CI/CD pipeline 来实现。

### 2. 实施节能的测试自动化 (编码) 实践

测试执行能耗 = 活动代码能耗 + 等待代码能耗 + 空闲代码能耗

- 将测试自动化框架和脚本容器化。容器提供了一个轻量级且孤立的环境，使其易于水平扩展。它们还减少了每次代码下载和构建过程生成的网络流量。
- 最小化文件 I/O 操作，尤其是在循环或频繁文件访问场景中。使用缓冲 I/O 操作来减少磁盘访问次数。例如：从文件中读取测试数据或从文件中读取配置或将结果推送到测试管理工具。
- 学习编写优化的代码，包括死代码消除、循环优化、公共子表达式消除等。此外，分析不同算法的性能特征并为您的特定用例选择最合适的算法。
- 保持测试工具和库是最新的，以受益于任何性能改进。
- 在代码中及时释放资源，尤其是在资源受限的环境中，如移动设备或物联网设备测试。
- 最小化后台进程、任务和线程，这些进程、任务和线程可能会提高 CPU 和内存利用率，从而增加功耗。
- 调整日志记录和报告的详细程度，以避免不必要的资源消耗。

可以通过在自动化指南文档中记录所有上述内容、与质量工程师沟通并在代码审查过程中将它们作为检查领域来实现。

### 3. 优化测试环境

- 建立明确的测试到环境映射（定义哪些测试应该在哪些环境上运行及其节拍），以避免冗余和重叠的测试执行。
- 每个环境都应从测试的角度发挥独特的作用。不要在所有地方测试所有内容。
- 实施动态资源分配，根据当前的测试需求分配资源。例如，运行负载测试的资源需求将与运行 API 测试的资源需求非常不同。
- 在使用后拆除测试环境。例如，启动一个动态环境，部署版本，运行测试，记录证据，然后将其拆除。
- 利用为效率和可扩展性而设计的基于云的测试服务。云平台通常会优化资源使用，比传统基础设施更节能。
- 考虑实际需要的环境数量。您是否真的需要 2 或 3 个环境？有什么理由？如今，许多组织正在转向单一环境策略。

可以通过有意识地与 SRE 团队共同设计环境配置（考虑到测试需求）并在合规性测试中引入可持续性检查来实现。

### 4. 在 QA 中设定可持续性 OKR

以下是一些示例 OKR：

**目标 1：提高软件测试执行效率**

- 关键成果 1：通过优化代码和基础设施，将测试执行的总体能耗降低 20%。
- 关键成果 2：实施一种在测试执行过程中监控和报告能耗的方法，提供对环境影响的可见性。
- 关键成果 3：进行审核并识别至少三个可以提高能效的领域。

**目标 2：在测试执行过程中最小化资源利用**

- 关键成果 1：通过采用容器化和高效的资源分配，将服务器资源使用量减少 15%。
- 关键成果 2：实施一个自动化系统来实时跟踪和管理资源消耗。
- 关键成果 3：评估和采用对环境友好的测试工具提供商或服务，考虑可再生能源的使用和资源效率。

**目标 3：推广可持续测试实践**

- 关键成果 1：对所有测试团队成员进行可持续编码实践和节能算法重要性的培训。
- 关键成果 2：将可持续性考虑纳入代码审查流程，目标是捕捉和解决至少 80% 的能源效率低下的代码。
- 关键成果 3：实施奖励制度，表彰和奖励那些始终如一地为可持续编码实践做出贡献的开发人员。

**目标 4：提高利益相关者意识**

- 关键成果 1：制定并启动针对内部和外部利益相关者的意识活动，强调可持续性的重要性。
- 关键成果 2：发布可持续性报告，详细说明测试对环境的影响以及为缓解影响而采取的措施。
- 关键成果 3：与至少三个外部组织或合作伙伴合作，开展软件开发中的可持续性举措。

可以通过采用资源监控工具和能源监控工具来实现。从市场上提供的多种选项中选择最适合您的选项。

### 5. 营造节能文化

- 教育工程师和团队有关可持续性和绿色软件开发实践及其必要性。
- 倡导缺陷预防文化。使用测试金字塔、左移和其他现代质量工程实践的原则，确保尽早发现缺陷。每个缺陷都有一个开发成本和一个环境成本来修复。
- 将绿色 QA 指南和标准包括在测试策略文档中。
- 在您的开发团队中营造节能编码实践的传统。定期进行回顾和回顾，以识别改进开发过程中可持续性的机会。
- 建立一个知识共享和可持续发展实践合作的论坛。
- 在团队中创建“可持续发展冠军”——他们是可持续发展领域的专家和旗手，可以教育和指导他人。
- 表彰和奖励始终如一地致力于可持续测试自动化开发的团队。

