如果您的组织在过去五年中全速推进 DevOps 战略,那么您并不孤单。 四分之三的组织采用了 DevOps 方法——这个数字在过去五年中翻了一番多。
尽管 DevOps 呈爆炸式增长,但只有 10% 的哈佛商业评论调查受访者将他们的企业描述为“在快速软件开发和部署方面非常成功”。
DevOps 转型需要更快的启动和部署,但增加构建频率会导致更多测试构建并导致开发瓶颈。
对于处于缓慢测试周期阻碍快速开发的团队,测试影响分析是一种通过仅运行与更改的源代码相关的测试来加速开发周期的方法。
测试影响分析是一种通过仅运行对一组代码更改重要的测试来加速软件测试的方法。执行测试影响分析允许团队通过减少运送变更的开销来加快他们的开发和部署周期。
传统上,软件测试中的影响分析通常依赖于静态源代码分析来构建代码和测试之间的依赖关系图。
如果您无法访问专门为测试影响分析而设计的工具或库,您可以手动跟踪对代码库的更改并使用此信息来确定哪些测试可能会受到影响。
例如,您可以维护与系统中每个模块或组件关联的测试列表,并在您进行更改时更新此列表。
要手动执行测试影响分析,您需要运行每个测试并构建每个测试执行的代码映射。创建地图后,您可以编写一个小程序,在开发人员每次推送代码时运行。
该程序审查修改后的文件并查找您需要为更改运行哪些测试。
随着代码随时间的变化,您需要定期更新地图以获得准确的依赖关系图。
下面的代码片段将测试名称映射到它们关联的组件。在这个例子中,我们有三个模块:
对于每个修改后的组件,将测试添加到我们可以传递给测试执行框架的列表中。
# 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 的预测测试选择通过利用机器学习的力量简化软件开发来解决测试影响分析。预测测试选择使用数据驱动的智能来确定哪些测试最适合每种类型的变更。
您可以减少测试运行的次数并加快交付时间,同时减少浪费的资源。
如果没有这种做法,团队必须手动创建“冒烟测试”的子集或并行化他们的测试。
在前面的场景中,初创公司的开发团队可以从预测测试选择中受益。他们的开发人员可以专注于交付最重要的功能,加快他们的工作流程,并再次信任测试套件。
使用 Launchable,您无需猜测运行哪些测试并不断更新您的测试影响分析套件。下面是 Launchable 如何与 Pytest 框架一起工作的Python 示例。
使用pip3 install pytest-launchable
到您的环境中
通过运行launchable-config --create
生成 Launchable 配置文件。
从https://app.launchableinc.com/生成 Launchable API 密钥
在将运行测试的机器上将其设置为LAUNCHABLE_TOKEN
环境变量。
从包含 Launchable 配置文件的目录中,运行pytest --launchable <your-pytest-project>
您的 pytest 结果将报告给 Launchable。随着时间的推移,Launchable 开始根据您的测试结果训练机器学习模型。该模型优化了哪些测试最有可能在最短的测试时间内有用。
借助 Launchable 的ML 驱动的预测测试选择,团队通常会在不影响质量的情况下减少 60-80% 的测试时间。
组织选择 Launchable 的预测选择功能的主要原因是:
更快地发送代码
通过这些案例研究,了解各行各业的工程师如何通过 Launchable 取得成功。测试影响分析是提高测试过程效率的重要工具。但是,手动或静态分析可能很麻烦,并且可能无法提供价值。
使用 Predictive Test Selection 正确实施测试影响分析可以通过使您的管道更加数据驱动来节省时间并提高测试质量。
Launchable 与您的 CI 无缝集成,无论提交频率或您拥有的 Git 分支数量如何。它支持所有应用程序和语言,团队报告测试时间减少了 90% 而对质量没有任何影响。