如果您的组织在过去五年中全速推进 DevOps 战略,那么您并不孤单。 采用了 DevOps 方法——这个数字在过去五年中翻了一番多。 四分之三的组织 尽管 DevOps 呈爆炸式增长,但只有 10% 的 受访者将他们的企业描述为“在快速软件开发和部署方面非常成功”。 哈佛商业评论调查 DevOps 转型需要更快的启动和部署,但增加构建频率会导致更多测试构建并导致开发瓶颈。 对于处于缓慢测试周期阻碍快速开发的团队,测试影响分析是一种通过仅运行与更改的源代码相关的测试来加速开发周期的方法。 什么是测试影响分析? 是一种通过仅运行对一组代码更改重要的测试来加速软件测试的方法。执行测试影响分析允许团队通过减少运送变更的开销来加快他们的开发和部署周期。 测试影响分析 传统上,软件测试中的影响分析通常依赖于静态源代码分析来构建代码和测试之间的依赖关系图。 如果您无法访问专门为测试影响分析而设计的工具或库,您可以手动跟踪对代码库的更改并使用此信息来确定哪些测试可能会受到影响。 例如,您可以维护与系统中每个模块或组件关联的测试列表,并在您进行更改时更新此列表。 如何执行测试影响分析 要手动执行测试影响分析,您需要运行每个测试并构建每个测试执行的代码映射。创建地图后,您可以编写一个小程序,在开发人员每次推送代码时运行。 该程序审查修改后的文件并查找您需要为更改运行哪些测试。 随着代码随时间的变化,您需要定期更新地图以获得准确的依赖关系图。 动手实践 Python 代码示例:手动测试影响分析 下面的代码片段将测试名称映射到它们关联的组件。在这个例子中,我们有三个模块: 登录 帐户创建 重设密码 对于每个修改后的组件,将测试添加到我们可以传递给测试执行框架的列表中。 # Define a dictionary that maps test names to the modules or components they are testing tests_by_component = { "test_login": ["login_module"], "test_account_creation": ["account_creation_module"], "test_password_reset": ["password_reset_module"] } # Define a list of the components that have been modified # This should be dynamically generated based on the code changes. modified_components = ["login_module"] # Determine which tests are likely to be affected by the changes affected_tests = [] for test, components in tests_by_component.items(): for component in components: if component in modified_components: affected_tests.append(test) # Now, we can pass the affected tests to our test harness. print(affected_tests) # Output: ["test_login"] 测试影响分析的好处和挑战 如果有效地完成,测试影响分析会带来许多好处,包括: 减少重新测试所花费的时间 提高测试过程的整体效率 更好的 开发者体验 无论您的项目是小型微服务还是巨型整体,您需要处理的测试数据量都会迅速变大。 手动软件测试影响分析可能很难做到正确。 随着开发人员随着时间的推移添加新功能和重构代码,手动测试分析很快变得笨拙且更具挑战性。 对于添加的每一行代码,您需要确定潜在影响以及哪些测试与该行代码相关。许多开发团队报告说, 需要大量工作才能 执行。 选择正确的测试 大规模 成长型组织的软件测试:测试的常见状态 让我们来看看一个非常熟悉的场景——一家中型科技初创公司的软件开发团队在过去三年中经历了爆炸式增长。 他们已经完成了风险投资的 C 轮融资,并利用现金注入来聘请开发人员快速构建新功能。该公司使用敏捷的、以 DevOps 为中心的模型,并以一套强大的 而自豪。 测试 我们从这里去哪里? 公司的快速扩张伴随着开发团队成长的痛苦。新功能的涌入意味着新测试和重大更改的涌入,这反过来又会导致测试碎片和长时间的运行时间。 初创公司中没有人再相信失败是合法的,因此开发人员反复点击“重新运行”按钮,直到测试通过。当他们无法使测试成功时,他们无论如何都会合并更改,并假设问题出在测试上,而不是他们的代码上。 开发人员会禁用耗时过长或与代码似乎不相关的测试——他们有工作要做,并且已经开始将软件测试视为完成任务的障碍。 开发人员所处的场景是他们不再信任测试并任意禁用或忽略它们——本质上是在进行他们自己的手动测试选择的风险版本。 工程团队开始担心这种情况是不可持续的。 如果有人因为忽略了会发现问题的测试而合并了损坏的代码,会发生什么情况? 团队在云资源上花费了多少钱来不断重新运行他们最终忽略的不稳定测试? 他们浪费了多少时间等待测试运行? 这家初创公司的工程主管决定是时候在 DevOps 技术债务导致代价高昂的事件之前解决它了。 与由试图加快工作流程的开发人员驱动的临时测试影响分析不同,他们将弄清楚如何选择对代码更改很重要的测试。 通过预测测试选择推进测试影响分析 预测测试选择是测试影响分析的一个分支,它使用数据根据历史测试结果和代码更改来预测您的 CI 系统需要运行哪些测试。 Launchable 正在使预测测试选择方法民主化,以便只需按一下按钮,它就可供各种规模的团队使用。 Launchable 的 通过利用机器学习的力量简化软件开发来解决测试影响分析。预测测试选择使用数据驱动的智能来确定哪些测试最适合每种类型的变更。 预测测试选择 您可以减少测试运行的次数并加快交付时间,同时减少浪费的资源。 如果没有这种做法,团队必须手动创建“ ”的子集或并行化他们的测试。 冒烟测试 在前面的场景中,初创公司的开发团队可以从预测测试选择中受益。他们的开发人员可以专注于交付最重要的功能,加快他们的工作流程,并再次信任测试套件。 动手实践 Python 代码示例:使用 Launchable 和 Pytest 进行预测测试选择 使用 Launchable,您无需猜测运行哪些测试并不断更新您的测试影响分析套件。下面是 Launchable 如何 Python 示例。 与 Pytest 框架一起工作的 使用 Launchable 的 Pytest 设置和执行 使用 到您的环境中 pip3 install pytest-launchable 通过运行 生成 Launchable 配置文件 launchable-config --create 。 从 生成 Launchable API 密钥 https://app.launchableinc.com/ 在将运行测试的机器上将其设置为 环境变量。 LAUNCHABLE_TOKEN 从包含 Launchable 配置文件的目录中,运行 pytest --launchable <your-pytest-project> 您的 pytest 结果将报告给 Launchable。随着时间的推移,Launchable 开始根据您的测试结果训练机器学习模型。 该模型优化了哪些测试最有可能在最短的测试时间内有用。 关于测试影响分析、预测测试选择和使您的管道数据驱动的最终想法 借助 Launchable 的 预测测试选择,团队通常会 。 ML 驱动的 在不影响质量的情况下减少 60-80% 的测试时间 组织选择 Launchable 的预测选择功能的主要原因是: 节省开发时间 减少基础设施支出 更快地发送代码 通过 ,了解各行各业的工程师如何通过 Launchable 取得成功。测试影响分析是提高测试过程效率的重要工具。但是,手动或静态分析可能很麻烦,并且可能无法提供价值。 这些案例研究 使用 Predictive Test Selection 正确实施测试影响分析可以通过使您的管道更加数据驱动来节省时间并提高测试质量。 Launchable 与您的 CI 无缝集成,无论提交频率或您拥有的 Git 分支数量如何。它支持所有应用程序和语言,团队报告测试时间减少了 90% 而对质量没有任何影响。