测试为什么要了解架构设计

需要针对互联网的架构来设计有针对性的测试,另外对于互联网的压力测试以及结果分析也需要对架构知识有比较清楚的认识.

诸如负载均衡器、缓存集群、数据库读写分离、消息队列、CDN、 反向代理服务器和分布式数据库等概念,在测试执行中也经常会和这些系统打交道。但是,很多时候, 你只是知道网站在架构设计上有这些组件,并不清楚这些组件真正的作用,在对应的测试设计时也很难 做到“有的放矢”

同样是对架构知识的学习和掌握,不同角色的工程技术人员都有不同的视角,需要了解和掌 握的全局知识和细节程度也各不相同.以消息队列知识为例:

  • 系统架构师,不仅要掌握各个不同消息队列实现的技术细节,还清楚不同方案的优势和劣势,最关键的是能够根据业务的应用场景和特点来选择最合适的消息队列方案
  • 软件开发人员,掌握消息队列的使用方法、消息push和pull的模式,以及在应用中如何以异步方式来对消息进行妥善处理,并且还要考虑到异常场景的处理
  • 软件测试人员,你需要知道消息队列的基本原理以及在被测系统中的部署情况,同时应该知道如何访问消息队列或者队列中消息的情况。在需要模拟消息进行解耦测试的场合,你还需要知道如何添加测试消息以满足测试的目的

学习架构知识遵循“由广度到深度”和“自 上而下”两个基本原则

  • “广度”是指在平时工作以外的时间中,应该多注重全领域架构知识的积累,此 时那些系统性地介绍架构知识的书籍或者专栏就可以给你最大程度的帮助了
  • “深度”是指,对于架构中某一领域的特定知识在项目中要实际使用的时候,必须要刨根问底,通过实际的测试来加深对架构知识细节的理解
  • “自上而下”是指,在实际测试项目中,当需要设计涉及架构的测试用例和场景的时候,千万不要直接 基于“点”来设计测试,而是应该:首先通过全局阅读理解上层架构设计;然后,在理解了架构设计的 初衷和希望达成目的的基础上,再向下设计测试场景和用例

这个过程,一方面可以帮你设计出有针对性的测试用例,另一方面可以帮助你理解架构在实际项目中是 如何落地的

Read More

形式化方法(formal methods)

基本信息

英文名formal methods

在逻辑科学中是指分析、研究思维形式结构的方法.它把各种具有不同内容的思维形式(主要是命题和推理)加以比较,找出其中各个部分相互联结的方式,如命题中包含概念彼此间的联结,推理中则是各个命题之间的联结,抽取出它们共同的形式结构;再引入表达形式结构的符号语言,用符号与符号之间的联系表达命题或推理的形式结构。例如,把全称肯定命题,用符号形式化为“SAP”;把联言命题、假言命题分别形式化为:“p∧q、“p→q”。又例如:一个具体的假言联言推理“如果这种金属是纯铝,那么它的物理性质必与纯铝相同;如果这种金属是纯铝,那么它的化学性质必与纯铝相同;但这种金属的物理性质和化学性质与纯铝不相同;所以,它不是纯铝。”这个推理的形式结构是:“如果p,则q;如果p,则r;非q且非r;所以非p。”可进而形式化为下列公式:((p→q)∧(p→r))∧┐q∧┐r→┐p

在计算机科学和软件工程领域,形式化方法是基于数学的特种技术,适合于软件和硬件系统的描述、开发和验证。将形式化方法用于软件和硬件设计,是期望能够像其它工程学科一样,使用适当的数学分析以提高设计的可靠性和鲁棒性。但是,由于采用形式化方法的成本高意味着它们通常只用于开发注重安全性的高度整合的系统。

形式化方法在古代就运用了,而在现代逻辑中又有了进一步的发展和完善。这种方法特别在数学、计算机科学、人工智能等领域得到广泛运用。它能精确地揭示各种逻辑规律,制定相应的逻辑规则,使各种理论体系更加严密。同时也能正确地训练思维、提高思维的抽象能力。

发展过程

20世纪60年代后期,针对当时所谓“软件危机”,人们提出种种解决方法,归纳起来有两类:一是采用工程方法来组织、管理软件的开发过程;二是深入探讨程 序和程序开发过程的规律,建立严密的理论,以其用来指导软件开发实践。前者导致“软件工程”的出现和发展,后者则推动了形式化方法的深入研究

形式化方法的发展趋势逐渐融入软件开发过程的各个阶段,从需求分析、功能描述(规约)、(体 系结构/算法)设计、编程、测试直至维护

Read More

基于模型的测试(MBT)

基于模型的测试,即Model-Based-Testing ,简称MBT。

MBT,是自动化测试的一个分支。它是将测试用例的设计依托于被测系统的模型,并基于该模型自动生成测试用例的技术

只关注建立系统的正确性以及模型的规范性,再通过专门的MBT工具根 据不同的测试用例设计策略从系统模型生成可靠的测试用例

基本原理

建立被测系统的设计模型,然后结合不同的算法和策略来遍历该模型,以此生成测试用例的设计

Read More

渗透测试

定义

渗透测试指的是,由专业安全人员模拟黑客,从其可能存在的位置对系统进行攻击测试,在真正的黑客 入侵前找到隐藏的安全漏洞,从而达到保护系统安全的目的。

开发人员通常并不是安全领域的专家,因此往往会缺少专业的安全知识,不 了解常用的系统攻击手段,从而导致他们并不能对安全相关的场景进行充分、客观的测试。

常用方法

  • 有针对性的测试,在测试人员完全了解系统内部情况的前提下开展
  • 外部测试,由内部的测试人员或者专业渗透测试团队,在假定完全不清楚系统内部情况的 前提下开展的
  • 内部测试
  • 盲测,由专业渗透测试团队在测试后期开展 的,通常会借助很多黑客攻击工具
  • 双盲测试

    Read More

精准测试

所谓精准测试,就是借助一定的技术手段、通过 算法的辅助对传统软件测试过程进行可视化、分析以及优化的过程。也就是说,精准测试可以使得测试 过程可视、智能、可信和精准。

借助一些高效的算法和工具,收 集、可视化并且分析原生的测试数据,从而建立起一套测试分析系统

传统软件测试短板:

  • 测试的维护成本日益升高,一个项目的功能是有限的,但是测试用例集合多数情况下是只增不减的,很可能维护了很多实际等价的测试用例.陈旧过时的用例也没有对应的淘汰机制
  • 测试过程的低效,无法提供有效的影响范围,无法发现角落里的问题
  • 缺乏有效的回归用例选取机制,全量回归的成本比较高,但无法根据实际情况选取回归测试用例,只能采取执行全部用例,甚至本身根本也不会对用例进行有效分类
  • 测试结果的可信度不高,测试数据的统计分析人工因素占据了绝大部分比重,由此导致测试数据本身的技术公信力不够高,进而需要依靠管理手段来保证真实的测试数据被准确地记录.执行成本高

    Read More

测试驱动开发

测试驱动开发,Test-Driven Development,简称为TDD

TDD的优势:

  • 保证开发的功能一定是符合实际需求的,用例根据实际使用场景编写
  • 更加灵活的迭代方式,使用测试用例描述需求,需求有变化,也可以很快地定位到需要修改的功能
  • 保证系统的可扩展性,测试用例开始仅有接口定义,相当于对开发过程添加了实现指导,有利于产出松耦合的设计
  • 更好的质量保证,TDD要求测试先于开发,也就是说在每次新增功能时,都需要先用测试用例去验证功能是否运行正常,并运行所有的测试来保证整个系统的质量.优化设计,重构代码等引入的新问题都能及时暴露出来
  • 测试用例即文档,编写的测试用例,首先一定是贴合用户实际需求的,然后又在开发调试的过程中经过 了千锤百炼,即一定是符合系统的业务逻辑的,所以我们直接将测试用例生成需求文档

实施过程

遵循以下流程:

  1. 为需要实现的新功能添加一批测试
  2. 运行所有测试,看看新添加的测试是否失败
  3. 编写实现软件新功能的实现代码
  4. 再次运行所有的测试,看是否有测试失败
  5. 重构代码
  6. 重复以上步骤直到所有测试通过

每添加一个新的功能点,都会添加一个测试方法;完成新功能点的软件代码后,接着运行当 前所有的测试用例,以保证新加的功能代码能够满足现有的测试需求

Read More

探索性测试

探索式测试发现的缺陷最多,而且发现的缺陷也很有代表性。从本质上来看,探索式测试具有即兴发挥、快速实验、随时调整等特征.

根据软件功能描述来设计最初的测试用例,然后执行测试;测试执行后,可能你得到的输 出和预期输出不完全一致,于是你会猜测这种不一致是否可能是软件的缺陷造成的;为了验证你的想 法,你会根据错误输出设计新的测试用例,然后采用不同的输入再次检查软件的输出

经过几轮这样的猜测和验证,进行反复“探索”,最终确定了一个软件的缺陷。 而这个过程中,你会发现,识别缺陷的思路和测试用例的设计,并没有出现在最初的测试设计和测试用 例文档中,而是以很快的速度在你的脑海中以及实际测试执行和验证中快速迭代

上述的两个过程就是探索式测试最基本的思维模型了

**探索式测试本身并不是一种测试技术,而是一种软件测试风格.**探索式 测试强调依据当前语境与上下文选择最合适的测试技术。所以,切记不要将探索式测试误认为是一种测 试技术,而应该理解为一种利用各种测试技术“探索”软件潜在缺陷的测试风格

**探索式测试强调独立测试工程师的个人自由和责任,其目的是为了持续优化其工作的价值.**测试 工程师应该为软件产品负责,充分发挥主观能动性,在整体上持续优化个人和团队的产出。这种思想方 法,与精益生产、敏捷软件开发的理念高度一致,这也正是探索式测试受到敏捷团队欢迎的原因之一

探索式测试对个人的能力有很高的依赖:同样的测试风格,由不同的人来具体 执行,得到的结果可能会差别巨大。因此,对执行探索式测试的工程师的要求就会比较高,除了要能够 从业务上深入理解被测系统外,还要有很强的逻辑分析与推理能力,当然对测试技术以及测试用例设计 的融会贯通也是必不可少的技能。

探索式测试相比即兴测试更强调 及时“反馈”的重要性,测试工程师不断提出假设,通过测试执行去检验假设,通过解读测试结果证实或推翻 假设。在这个迭代过程中,测试工程师不断完善头脑中被测试应用的知识体系,并建立被测应用的模 型,然后利用模型、过往经验,以及测试技术驱动进一步的测试.探索式测试要不停地优化测试模型和测试设计。

Read More

测试基础架构

广义的测试执行环境也被称为测试基础架构

由于需要执行的自动化测试用例数量多,再加上测试本身的多样性需求,测试基础架构的设计是否高效和稳定将直接影响产品是否可以快速迭代、发布上线。因此,中大型的软件公司都会在测试基础架构上有比较大的投入

中大型企业在测试基础架构上的投入,主要是为了解决以下这几方面的问题:

  • 简化测试的执行过程

  • 最大化测试执行机器的资源利用率

  • 提供大量测试用例的并发执行能力

  • 提供测试用例的版本控制机制

  • 提供友好的用户界面,便于测试的统一管理、执行与结果展示

  • 提供了与CI/CD流水线的统一集成机制

    Read More

性能测试类型

  • 性能基准测试,可以保证新发布系统的整体性能不会下降
  • 稳定性测试,主要通过长时间模拟被测系统的测试负载,观察系统在长期运行过程是否存在问题
  • 并发测试,往往被当作功能测试的补充去发现多线程、资源竞争、资源死锁之类的问题
  • 容量规划测试,主要用于确定给定负载下的系统集群规模,其测试结果可以被用作系统容量设计的 依据

性能基准测试

通常被称为 Performance Benchmark Test,对外发布产品版前必须要完成的测试类型.

基于固定的硬件环境和部署架构,通过执行固定的性能测试场景得到的性能测试报告.然后与上一版本指标进行对比,如有恶化趋势,需要排查问题.

恶化表现:

  • 同一事务响应时间变慢
  • 系统资源占用率变高
  • 网络带宽使用率变高

通过对每个预发布版本的性能基准测试,我们可以保 证新发布系统的整体性能不会下降,这也就是性能基准测试最终要达到的目的

Read More

性能测试典型流程与步骤

获取测试需求,测试结果分析与性能问题定位是性能测试中两个最难的问题.

1.性能需求收集以及负载计划制定

性能测试的具体需求,主要包含以下内容:

  • 系统整体的并发用户数
  • 并发用户业务操作的分布情况
  • 单一业务操作的用户行为模式
  • 并发用户高峰期的时间分布规律
  • 达到最高峰负载的时间长度

Read More