测试学习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来观察
下一篇: oracle基础测试1