欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

测试学习7

程序员文章站 2024-02-26 23:53:46
...

代码级测试的基本理念和方法

  • 通常情况下,代码级测试工作都是由,开发人员完成,但是测试框架选型、覆盖率统计工具选型、测试用例涉及原则都需要资深的测试工程师参与
  • 代码级测试这个系列,为你呈现代码级测试技术入门、方法论、用例设计、覆盖率衡量、典型难点、解决思路
  • 代码级测试的测试方法一定是一个测试方法集合,而不是一个测试方法,因为单靠一种测试方法不可能发现所有的潜在错误,一定是一种方法解决一部分问题,多种方法解决全部问题

常见的代码错误类型

  • 1,语法特征错误
指从编程语法上就能发现的错误,如不符合语法的语句
如果使用IDE进行代码开发,那么IDE能提示大部分错误,只有解决了这类错误,才能编译通过,但是会有一些比较隐晦的语法特征错误,IDE不能及时发现,也不影响编译,只在运行阶段报错
  • 2,边界行为特征错误
边界行为特征错误是指,代码执行过程中发生异常,崩溃或者超时,之所以称为边界,是因为此类错误通常是发生在一些边界条件上
  • 3,经验特征错误
根据以往经验发现错误
如:在出现逻辑判断的地方出现了赋值语句
  • 4,算法错误
指代码完成的计算和之前预先设计的计算结果不一致
直接关系到要实现的业务逻辑,在整个代码级测试中占比最大,但是完全的代码错误并不常见,因为不能准确完成基本功能需求的代码,是一定不会被提交的
  • 5,部分算法错误
指在一系列特定条件或者输入情况下,算法不能准确完成业务要求实现的功能,这类错误是整个代码级测试国臣过程中最常见的类型

代码级测试常用方法

  • 代码级测试方法主要分为两大类:静态方法和动态方法

  • 静态方法:不实际执行代码的基础上发现缺陷的方法,分为人工静态方法和自动静态方法

  • 动态方法:实际执行代码发现缺陷,分为人工动态方法和自动动态方法

  • 人工静态方法

通过人工阅读代码查找代码中潜在错误的方阿飞,主要包括开发人员代码走查,结对编程,同行评审等
理论上可以发现5类错误,但是实际效果不理想
主要是过度依赖评审者的个人能力,而且完全依赖人工,效率普遍偏低
  • 自动静态方法
指在不运行代码的情况下,通过词法分析、语法分析、控制流分析等技术,并结合各种预定义和自定义的代码规则,对程序代码进行静态扫描发现错误
自动静态方法可以发现语法特征错误、边界行为特征错误和经验特征错误这三种'有特征'的错误
对于算法错误无能为力,根本原因在于,自动静态方法并不清楚代码的具体业务逻辑
  • 人工动态方法
指设计代码的输入和预期正确输出的集合,然后执行代码,判断实际输出是否符合预期
在代码级测试中,人工动态方法是最主要的测试手段,可以真正检验代码的逻辑功能,关注点是'什么样的输入,执行什么代码,产生什么样的输出',所以善于发现算法错误和部分算法错误
  • 自动动态方法
又称自动边界测试方法,指基于代码自动生成边界测试用例并执行,捕捉潜在的异常、崩溃和超时的方法
自动动态方法,可以覆盖边界行为特征错误,通常能够发现'忘记处理某些输入'引起的错误,因为容易忘记的输入,往往是边界输入,但是对于发现算法错误无能为力,毕竟工具不可能了解代码要实现的逻辑功能

静态测试方法

  • 人工静态方法属于流程上的实践,依赖于个人能力,这种方法在企业级测试中被广泛使用
  • 自动静态方法,可以通过自动化的手段,以很低的成本发现并报告各种潜在的代码质量问题,目前被广泛采用,并已经集成到CI/CD流水线了,作为测试工程师需要知道完成代码静态扫描环境的搭建

人工静态方法

  • 代码走查:开发人员检查自己的代码
  • 结对编程:两个开发人员结成对子在一台计算机上共同完成开发任务
  • 同行评审:代码提交到仓库前,需要和同技术级别或者更高级人员进行评审,通过评审后才会提交
  • 以上三种方式,使用最普遍的是同行评审,出现问题后责任明确;结对编程效果不错但是人员利用率低,用于非常关键和底层算法的代码实现

自动静态方法

  • 主要有三个特点
相比于编辑器,可以做到对代码更加严格、个性化审查
不真正检查代码的逻辑功能,只站在代码本身的视角,基于规则,尽可能多的发现代码错误
由于静态分析算法并不实际执行代码,会存在一定的误报率
  • 由于自动静态方法具有自动化程度高,检查发现问题成本低以及能够发现代码问题广等特点,被企业广泛用于前期代码质量控制和代码质量度量

  • 实际工程实践中,企业往往会结合自己的编码规范定制规程库,并于本地IDE开发环境和持续集成的流水线进行高度整合

  • 代码本地开发阶段,IDE环境可以自动对代码进行自动静态检查,代码提交到仓库后,CI/CD流水线也会自动触发代码静态检查,如果遇到潜在错误,就会自动邮件通知代码提交者

  • 目前自动静态扫描通常都会和持续集成的流水线做绑定,最常见的应用场景是提交代码后,持续集成流水线会自动触发自动静态扫描,这一功能是通过jenkins以及jenkins上的SonarQube插件来完成的,当你在Jenkins中安装了SonarQube Plugin,并将SonarQube服务器相关的配置信息加入Plugin之后,就可以在Jenkins Job配置中增加Sonar静态扫描步骤了

  • python中可以用pylint进行检查

动态测试方法

  • 需要实际执行代码去发现潜在代码错误的测试方法
  • 由于自动动态方法并不能理解代码逻辑,所以仅仅被用于发现异常、崩溃、超时这类有特征错误,对于代码逻辑功能的测试,主要还是依靠人工动态方法

人工动态方法

  • 主要用于发现算法错误和部分算法错误,是最主要的代码级测试手段
  • 代码级测试的人工动态方法其实就是单元测试所采用的方法
  • 单元测试中的三个最主要的难点
单元测试用例输入参数的复杂性
单元测试用例预期输出的复杂性
关联依赖的代码不可用
  • 单元测试用例’输入参数’的复杂性
1,被测函数的输入参数
2,被测函数内部需要读取的全局静态变量
3,被测函数内部需要读取的类成员变量
4,函数内部调用子函数获得的数据
5,函数内部调用子函数改写的数据
6,嵌入式系统中,在终端调用中改写的数据
  • 单元测试用例’预期输出’的复杂性
1,被测函数的返回值
2,被测函数的输出参数
3,被测函数所改写的成员变量和全局变量
4,被测函数中进行的文件更新,数据库更新,消息队列更新等
  • 关联依赖的代码不可用
关联依赖的代码---假设被测函数中调用了其他函数,那么被调用的其他函数就是被测函数的关联依赖代码
大型软件中往往是并行开发的,一般会采用桩代码来模拟不可用的代码,通过打桩补齐未定义部分
桩函数要与原函数完全相同的原型,仅仅内部实现不同,这样测试代码才能正确连接到桩函数

自动动态方法

  • 自动动态方法的重点是:如何实现边界测试用例的自动生成
  • 解决这个问题最简单直接的方法是,根据被测函数的输入参数生成可能的边界值
任何数据类型都有自己的典型值和边界值,可以为他们预先设定好典型值和边界值,然后组合就生成了
定义各种数据类型的典型值和边界值
根据被测函数原型,生成测试用例代码模板
将参数中分别取值,进行循环组合,分贝替换模板中对应内容,即可生成用例集
  • 由于该方法不可能自动了解代码要显示的逻辑功能,所以不会验证预期输出,而是通过try–except来观察