测试的目的就是确保软件应用程序完美运行。无论是小型初创公司还是大型企业,都没有关系;这件事很重要。但是,当然,当与 Meta 这样的科技巨头打交道时,事情会变得更加复杂。他们拥有大量的产品、数以百万计的用户,并且面临着很大的风险。
因此,他们必须非常擅长测试。但秘密是:测试的基本思想保持不变。这一切都是为了确保软件能够完成它应该做的事情,这是人们可以理解的事情。
在 Testμ 2023 会议的知识丰富的会议中, Meta 的工程经理Dmitry Vinnik将带您进入 Meta 的大规模测试世界。
让我们来看看本次会议的主要亮点吧!
Dmitry 开始了会议,并谈论了他在 Mеta 的工作经历,以及它如何涉及开源项目和各种产品,如 Mеssenger、Facebook、Instagram 和 WhatsApp。
但他强调,他的演讲重点并不局限于大型组织;同样的原则也适用于较小的企业。不同之处在于,在较小的组织中可能是次要的问题可能会成为较大组织中的主要挑战,特别是在测试和质量方面。
一、测试中质量优先于数量
Dmitry 强调了在软件测试时选择质量而不是数量的重要性。他专注于这一原则,特别是在像 Meta 这样的科技巨头中,确保每次进行的测试都能真正提高软件的质量至关重要。这不仅仅是运行大量测试;这是为了使软件健壮、可靠和高质量。
他强调,组织无论规模大小,都面临着与测试质量相关的重大挑战。他用“小孩子”、“小问题”来比喻;大孩子,大问题来说明较小组织中的小问题如何在与较大企业打交道时成为重大障碍。这个叙述强调了无论组织规模如何,保持高测试标准的重要性。
二、在测试中取得正确的平衡
Dmitry 介绍了金发姑娘测试套件的想法,它强调在测试的数量和质量之间找到适当的平衡。这个概念确保了有效的测试——进行适当数量的测试来增强软件质量,而不会给测试过程带来不必要的复杂性。
他鼓励组织重新关注核心用例和关键测试场景,并避免追求 100% 代码覆盖率的常见错误。这种方法通常会导致不必要的复杂性并增加维护成本。
此外,Dmitry 强调了测试效率的重要性。通过创建在全面性和敏捷性之间达到适当平衡的套件,组织可以加快测试过程,同时保持对质量的坚定承诺,使用金发姑娘测试套件组织可以采用更实用、更有效的软件测试方法。
三、测试金字塔的作用
然后德米特里解释了一个称为“测试金字塔”的概念。” 这就像为房子打坚实的地基一样。在这个金字塔中,有三个级别的测试,每个级别都有特定的目的。
在金字塔的底部,我们有单元测试。这些就像测试的基石。它们体积小,运行速度快,并且可以检查软件的各个部分。单元测试就像检查房子里的每一块砖是否坚固并且在正确的位置。
在金字塔的中间,我们找到集成测试。这些测试确保软件的不同部分能够很好地协同工作。这就像确保房子里的管道和电力系统正确连接并作为一个整体运行。
在金字塔的顶端,我们进行端到端测试。这些测试模拟真实用户如何与软件交互。他们从头到尾检查一切是否按预期工作,就像测试整个房子对于居住在其中的人来说是否舒适且实用一样。
德米特里的观点是,平衡的测试金字塔至关重要。这并不是说进行大量一种类型的测试而很少进行另一种类型的测试。相反,它是关于单元、集成和端到端测试的正确组合。这种方法有助于有效地保持软件质量,就像建造一座具有坚固地基的房子,同时确保其所有部件无缝协作一样。
四、蛋卷冰淇淋问题
德米特里解释了一个被称为“蛋卷冰淇淋”问题的测试挑战。在这种情况下,测试金字塔(理想情况下在底部有更多的单元测试,中间有更少的集成测试,甚至在顶部有更少的端到端测试)被颠倒了。
在冰淇淋蛋卷场景中,基础上的单元测试非常少。相反,有更多的集成测试,甚至更多的端到端测试,以及大量的顶部手动测试,就像蛋卷冰淇淋上的糖霜一样。
德米特里指出,这种情况可能会导致几个问题。首先,这通常意味着快速并向开发人员提供快速反馈的单元测试被忽视。其次,过度依赖手动测试,速度较慢且效率较低。第三,它可能会导致重复工作,不同的团队为相同的功能编写相同的端到端测试。
蛋卷冰淇淋问题会影响测试效率、减慢开发过程并增加成本。德米特里建议努力建立一个更加平衡的测试金字塔,因为它有助于保持质量,同时保持测试的可管理性和成本效益。
在演讲中,Dmitry 还提到了Elisabeth Hendrickson 所著的《实用程序员 – 探索它》一书。本书涵盖了软件开发人员与软件开发相关的宝贵资源,包括测试和软件质量方面。
五、手动测试不是核心测试
然后,德米特里谈到了手动测试,并解释了为什么它不应该成为软件开发过程中测试的核心或主要方法。他指出了这一观点的几个关键原因:
1、手动测试依赖于人类测试人员来执行测试用例,这使得它成为一个耗时且成本高昂的过程,特别是对于大型复杂的软件系统。这种资源密集型的性质会减慢开发周期。
2、由于人为限制,手动测试可能无法涵盖所有可能的测试场景。测试人员可能会无意中忽略某些测试用例或无法复制特定的用户交互,从而导致测试覆盖率存在差距。
3、手动测试可能会受到测试人员的偏见、期望或经验的影响。这种主观性可能会导致测试结果不一致,并遗漏自动化测试能够一致捕获的缺陷。
4、重复执行相同的手动测试可能会很单调,并且会增加人为错误的风险。自动化测试擅长准确、一致地执行重复性任务。
5、随着软件的发展和复杂性的增长,仅仅依靠手动测试变得越来越具有挑战性并且不太实用。它可能会导致测试过程中出现瓶颈,并阻碍跟上开发步伐的能力。
6、严重依赖手动测试可能会导致测试成本增加,并且由于测试周期较长而导致项目延迟,尤其是在大型软件项目中。
Dmitry 建议使用手动测试作为自动化测试方法(例如单元测试、集成测试和端到端测试)的补充方法。自动化测试可以有效地处理重复性和全面的测试场景,使手动测试人员能够专注于探索性测试、可用性测试和软件的其他定性方面——这种平衡的方法确保了高效的测试刺痛,同时保持软件质量。
六、为什么要进行如此多的 UI 测试?
由于存在几个潜在问题,Dmitry 建议不要进行过多的 UI 测试。首先,UI 测试通常速度较慢且资源密集,导致测试时间更长并导致构建延迟。其次,随着软件的发展,维护大量的 UI 测试可能会变得复杂且成本高昂,UI 元素会随着时间的推移而变化,需要持续的努力和资源。
此外,更多的 UI 测试可能会导致不同团队之间的冗余和重复工作等问题。人们普遍认为,更多的 UI 测试可以提供更好的覆盖范围。Dmitry 指出,过多的 UI 测试可能会减慢开发人员的反馈循环。
最后,应仔细考虑与管理大量 UI 测试相关的增加的维护成本,促使组织在 UI 测试和其他测试类型之间取得平衡。这种方法可确保高效的测试过程和有意义的覆盖范围,同时最大限度地减少过多 UI 测试的缺点。
七、沙漏有什么帮助?
Dmitry 在软件测试和团队动态的背景下引入了沙漏。在这个概念中,他强调了以与生产代码相同的注意力和专业水平来处理测试代码的重要性。这意味着确保测试代码具有高质量,遵循既定的编码模式和风格,并且像生产代码一样接受代码审查。
他强调开发人员需要积极参与审查测试代码,反之亦然,从而促进开发人员和测试人员之间的协作。德米特里建议采用一对一的模型,其中对于每个故事或功能,应该至少有一个与之相伴的单元测试或集成测试。在审查关键或复杂区域(例如登录功能)时应特别小心,以防止可能影响多个团队的潜在回归。
德米特里提到,团队内拥有一名专门的“测试冠军”会很有帮助。此人的角色将涉及持续审查测试代码以维持代码质量标准。总体目标是弥合工程师和测试人员之间的差距,鼓励分担测试责任并培育协作文化。
此外,德米特里谈到了测试作为软件开发反馈循环的关键组成部分的重要性。测试不仅仅是发现缺陷;而是发现缺陷。它在向开发人员提供快速反馈方面发挥着至关重要的作用。这种反馈循环有助于及早发现问题,从而加快迭代速度并提高软件质量。
此外,他强调了不同利益相关者(包括工程师、测试人员和项目经理)之间团队协作和共享理解的重要性。
他提到——透明的沟通和协调是解决测试过程中的挑战的关键,特别是在大型组织中——这些原则是增强软件测试实践的基本指导原则。
八、问答环节!
1、举例说明 Meta 的测试方法如何适应不同的项目需求,同时保持一致的质量标准?
德米特里:大型组织的运作方式有几个关键方面,这不仅仅是一个机会问题。这些组织通常遵循结构化方法,通常从我所描述的训练营开始。
无论您加入哪个特定团队,通常都会有一个类似于训练营的初始入职流程。例如,在我工作的 Mеta,这种入职培训可能会持续几周,在此期间您要参加课程、讲座、研讨会和其他培训课程。此阶段的目的是让您熟悉组织的产品、工具和编码实践。这包括学习 Rust、Swift、Objactive-C 等编程语言,并采用团队遵循的编码风格。
然而,大型组织也面临着平衡团队之间的自由度和一致性的挑战。虽然团队通常可以选择最适合当前问题的工具,但仍然必须遵守某些标准。在同一组织和团队中,您通常会发现一组标准化的代码风格。
例如,如果您使用 Java,您可能需要遵守 Google 的编码风格作为基准。这确保了即使团队具有一定的灵活性,但在编码约定(例如缩进和代码结构)方面仍然存在统一性。
为了提供更全面的概述,入职流程通常被比作训练营,是了解组织实践的第一步。在此阶段,您将深入了解测试的进行方式、代码库的外观以及项目的总体架构框架。
重要的是,大型组织倾向于强调通过实践经验学习,而不是严格执行特定的方法。他们对开发者抱有期望,但为个人创造力和解决问题留有空间。
2、Meta 的测试方法如何处理各种设备、平台和网络条件?
Dmitry:在某些组织中,您可以使用测试解决方案来测试具有不同配置的各种设备和浏览器。这包括手动和自动测试。较大的组织经常采用这种方法,维护物理设备并收集测试指标。
关键是专注于基于用户指标的核心用例,而不是测试一切。确定测试工作的优先级有助于有效地分配资源,并避免对模糊配置进行不必要的测试。
3、在 Meta 作为一个团队自主工作有多容易/困难?完成工作是否需要经历很多繁文缛节?
德米特里:在大型组织中,体验可能会因环境而异。非常强调自主性和跨职能协作。虽然某些因素(例如面向客户的工作和数据处理)可能会带来限制,但总有大量的工作要做。
大型组织通常在更大的实体内以初创公司网络的形式运营,鼓励协作并提供团队之间的流动性。如果需要的话,这种充满活力的环境可以提供成长和变革的机会。
4、否遇到过很难接受这些想法/原则的 PM?你是怎么处理的?
Dmitry:解决团队内部的冲突,尤其是与产品经理 (PM) 或高层存在分歧时,需要保持客观的方法。必须给予产品经理对客户洞察的怀疑和信任,这一点至关重要。
在坚持质量和技术卓越的同时,可以采用有效的论据和妥协来达成共识。冲突解决应优先考虑产品的最佳利益,考虑快节奏的发布周期中速度和质量之间的平衡。
5、深入了解 Meta 的测试策略如何随着公司的发展而演变,同时仍保持敏捷?
Dmitry:在像 Meta 这样的组织及其向敏捷方法和快速发布周期演进的背景下,组织不太可能恢复到瀑布实践。
然而,敏捷和灵活的概念将继续重要,组织可能会简化其工具集以提高效率。对于希望在发展过程中保持快速发布周期的小型组织来说,一个关键的最佳实践是定期审查和删除不必要的代码和测试。
专注于编写复制核心客户用例的测试,而不是首先深入研究边缘案例,确保开发符合客户需求,保持敏捷和高效。
卓码软件测评是一家[ 具备CMA、CNAS双重资质 ]的专业做软件测试的第三方软件测试服务机构, 可根据您的需求提供各类软件测试服务,并出具合格有效的软件测试报告。点击→→可了解测试报价
部分文字、图片来自网络,如涉及侵权,请及时与我们联系,我们会在第一时间删除或处理侵权内容。负责人:曾菲 电话:4006070568