《需求设计:构建用户想要和需要的产品》——3.8 测试与检验

简介:

本节书摘来自华章计算机《需求设计:构建用户想要和需要的产品》一书中的第3章,第3.8节,作者: [英] 克里斯·布里顿(Chris Britton) 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.8 测试与检验

大型项目的测试会分成很多层。我们经常能看见那种包含单元测试、功能测试、回归测试、组件测试、性能测试、系统测试及验收测试的项目。无论测试能找到多少bug,它都要耗费大量的资源与时间。在Software Estimating Rules of Thumb这篇文章[19]中,Capers Jones提出了他所总结的“软件开发成本动因定律”(Law of Software Development Cost Drivers),该定律宣称,“对于所有的软件来说,查找及修复bug都是成本最高的活动。”顺便再说一下,对于BDUF项目来说,还有几个成本比较高的活动排在该因素的后面,它们分别是:写文档、写代码、开会和管理。在军事项目中,写文档会升至第一位。在敏捷项目中,第二位和第四位互换。
测试有一个令人失望的特点,那就是它非常低效。其原因有很多:

  • 测试通常致力于证明程序已经实现了它所应该达成的功能,而很少会致力于查找错误。如果我们发现了bug,那就会修复该bug并撰写一项测试,以证明程序现在可以正常运作,然后,这项测试会反复地运行,于是,我们自然就会发现它每次都能够运行通过。简单来说,我们所测试的路径,只不过是程序最有可能走到的那些路径而已。
  • 测试,是由那些熟悉应用程序工作原理的人所编写的。而使用该应用程序的人,并不知道它的工作原理,因此可能会采用一些与测试者不同的方式,来操作该应用程序。早在1989年,Miller等就有一项惊人的发现,他们把一些胡乱生成的内容输入给各种UNIX实用程序[20],然后看到其中有25%~33%的程序无法通过测试。
  • 构建测试所需的工作量很大,因此我们不会构建太多的测试。
  • 测试本身通常也含有一些错误。
  • 有一些错误很难通过测试来检查,例如,时机错误、因数据库中缺失数据所引发的错误,以及由于网络入侵而造成的安全问题等。
  • 大部分的测试,都是在测试应用程序上面运行的,然而还有一些错误,则与版本不符或配置不当有关,这些错误发生在我们把应用程序移动到生产系统中的时候。

公司应该让最优秀的人去实现一套良好的系统测试机制。我们也可以换一种说法:编程本领最强的人,不一定是最能把测试写好的人。最适合写测试的,应该是那种颇具创意,而且特别喜欢把应用程序搞坏的人。
有一次笔者听到这样一种说法:专业的古典音乐家与业余的古典音乐家不同,后者只要能把某段乐谱准确地弹完一遍,就不再继续练习了,而前者则会反复练习,直到毫不出错。这是两种不同的境界,业余人士只满足于我能弹好一遍就行,而专家追求的则是每次都能弹好。测试也与之类似。测试并不是只保证应用程序能达到业余水平,而是要按照专业的水平来要求它。为了暴露程序的故障点,笔者建议你采用以下做法:

  • 试着令应用程序承担大量的负载,尤其是要使应用程序感觉到,这些负载好像是多位用户同时造成的。
  • 试着在程序里面引发故障,而且还要试着在错误恢复的过程之中引发故障。
  • 在接缝处寻找故障,也就是要检查部件之间的每一条依赖关系并对其进行测试。

如果应用程序已经发行,而且数据库里也已经有了真实的数据,那么就试着编写一些采用真实数据来运作的测试,同时可能还需要对这些数据做匿名处理。有许多测试都在反复地使用同一份数据,这些测试的编写者尤其需要注意:如果数据库发生了变化,那么相应的数据可能也会有所改变。
想要制作一款高质量的程序,单靠测试是不够的。还应该采取下列措施:

  • 使用静态分析器去分析代码,以便找出其中从来没有执行过的代码及变量、还没有初始化就直接使用的变量、有可能无法终止的循环,以及潜在的性能及安全问题。
  • 使用代码检查机制。笔者建议执行两个层面的代码检查,第一个层面是由团队内的其他程序员来检查,第二个层面是由系统测试组来检查。前者应该帮助我们消除那些简单的错误以及对系统配置方式的误解,而后者则应该指出安全隐患等更为微妙的问题。

有统计数据表明,上面这些做法和测试一样有效,它也能够检查出bug,而且这些bug还和那些经由测试所检查出来的bug有所不同。
如果我们能够很好地计算出bug的数量,那么可能就会注意到,其中某一部分代码会频繁地出现bug,这部分代码就好像烛光,而这些bug(程序错误/虫子),则像是扑火的飞蛾。这一部分代码需要更为详细地检视,而且有可能需要重写。

相关文章
|
2月前
|
监控 jenkins 测试技术
自动化测试框架的构建与实践
【10月更文挑战第40天】在软件开发周期中,测试环节扮演着至关重要的角色。本文将引导你了解如何构建一个高效的自动化测试框架,并深入探讨其设计原则、实现方法及维护策略。通过实际代码示例和清晰的步骤说明,我们将一起探索如何确保软件质量,同时提升开发效率。
53 1
|
2月前
|
测试技术 开发者 Python
自动化测试之美:从零构建你的软件质量防线
【10月更文挑战第34天】在数字化时代的浪潮中,软件成为我们生活和工作不可或缺的一部分。然而,随着软件复杂性的增加,如何保证其质量和稳定性成为开发者面临的一大挑战。自动化测试,作为现代软件开发过程中的关键实践,不仅提高了测试效率,还确保了软件产品的质量。本文将深入浅出地介绍自动化测试的概念、重要性以及实施步骤,带领读者从零基础开始,一步步构建起属于自己的软件质量防线。通过具体实例,我们将探索如何有效地设计和执行自动化测试脚本,最终实现软件开发流程的优化和产品质量的提升。无论你是软件开发新手,还是希望提高项目质量的资深开发者,这篇文章都将为你提供宝贵的指导和启示。
|
2月前
|
安全 Linux 虚拟化
|
3月前
|
缓存 Devops jenkins
专家视角:构建可维护的测试架构与持续集成
【10月更文挑战第14天】在现代软件开发过程中,构建一个可维护且易于扩展的测试架构对于确保产品质量至关重要。本文将探讨如何设计这样的测试架构,并将单元测试无缝地融入持续集成(CI)流程之中。我们将讨论最佳实践、自动化测试部署、性能优化技巧以及如何管理和扩展日益增长的测试套件规模。
59 3
|
3月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
4月前
|
人工智能 自然语言处理 测试技术
用图灵测试检验AI尤其是大语言模型,真的科学吗?
【9月更文挑战第25天】《Does GPT-4 Pass the Turing Test?》一文评估了先进AI模型GPT-4的图灵测试表现。尽管GPT-4在某些对话中成功迷惑了参与者,但其整体成功率仅为41%,低于人类的63%。图灵测试作为评估AI语言能力的工具依然有效,但存在局限性,如无法评估AI的认知机制且受主观判断影响。此外,测试还引发了关于AI智能及伦理的讨论。
221 6
|
4月前
|
人工智能 数据可视化 API
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
123 2
|
2月前
|
jenkins 测试技术 持续交付
自动化测试框架的构建与优化:提升软件交付效率的关键####
本文深入探讨了自动化测试框架的核心价值,通过对比传统手工测试方法的局限性,揭示了自动化测试在现代软件开发生命周期中的重要性。不同于常规摘要仅概述内容,本部分强调了自动化测试如何显著提高测试覆盖率、缩短测试周期、降低人力成本,并促进持续集成/持续部署(CI/CD)流程的实施,最终实现软件质量和开发效率的双重飞跃。通过具体案例分析,展示了从零开始构建自动化测试框架的策略与最佳实践,包括选择合适的工具、设计高效的测试用例结构、以及如何进行性能调优等关键步骤。此外,还讨论了在实施过程中可能遇到的挑战及应对策略,为读者提供了一套可操作的优化指南。 ####
|
2月前
|
敏捷开发 监控 测试技术
探索自动化测试框架的构建与优化####
在软件开发周期中,自动化测试扮演着至关重要的角色。本文旨在深入探讨如何构建高效的自动化测试框架,并分享一系列实用策略以提升测试效率和质量。我们将从框架选型、结构设计、工具集成、持续集成/持续部署(CI/CD)、以及最佳实践等多个维度进行阐述,为软件测试人员提供一套系统化的实施指南。 ####
|
2月前
|
监控 安全 测试技术
构建高效的精准测试平台:设计与实现指南
在软件开发过程中,精准测试是确保产品质量和性能的关键环节。一个精准的测试平台能够自动化测试流程,提高测试效率,缩短测试周期,并提供准确的测试结果。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
149 1