代码级测试的测试方法一定是一套测试方法的集合,而不是一个测试方法。 因为单靠一种测试方法不可能发现所有潜在的错误,一定是一种方法解决一部分或者一类问题,然后综合运用多种方法解决全部问题。
常见代码错误类型
第一,语法特征错误
语法特征错误是指,从编程语法上就能发现的错误。比如,不符合编程语言语法的语句等。
有的是在编译阶段可以发现,有的必须要在运行阶段才可以发现。
第二,边界行为特征错误
边界行为特征错误是指,代码在执行过程中发生异常,崩溃或者超时。之所以称为“边界”,是由于此类错误通常都是发生在一些边界条件上。比如0作为除数。
第三,经验特征错误
经验特征错误是指,根据过往经验发现代码错误。
第四,算法错误
算法错误是指,代码完成的计算(或者功能)和之前预先设计的计算结果(或者功能)不一致。
第五,部分算法错误
部分算法错误是指,在一些特定的条件或者输入情况下,算法不能准确完成业务要求实现的功能。这类错误,是整个代码级测试过程中最常见的类型。
代码级测试方法
主要分为两大类,分别是静态方法和动态方法。
静态方法,顾名思义就是在不实际执行代码的基础上发现代码缺陷的方法,又可以进一步细分为人工静态方法和自动静态方法;
动态方法是指,通过实际执行代码发现代码中潜在缺陷的方法,同样可以进一步细分为人工动态方法和自动动态方法。
静态方法
人工静态方法
人工静态方法是指,通过人工阅读代码查找代码中潜在错误的方法,通常采用的手段包括,开发人员代码走查、结对编程、同行评审等。理论上,人工静态方法可以发现上述五类代码错误,但实际效果却并不理想。理论上可以发现所有的代码错误,但也因为其对“测试人员”的过渡依赖,局限性非常大
自动静态方法
自动静态方法是指,在不运行代码的方式下,通过词法分析、语法分析、控制流分析等技术,并结合各种预定义和自定义的代码规则,对程序代码进行静态扫描发现语法错误、潜在语义错误,以及部分动态错误的一种代码分析技术。
自动静态方法可以发现语法特征错误、边界行为特征错误和经验特征错误这三类“有特征”的错误,但对于算法错误和部分算法错误这两种“无特征”的错误却无能为力。根本原因在于,自动静态方法并不清楚代码的具体业务逻辑。
你需要根据不同的开发语言,选择不同的工具。目前有很多工具都可以支持多种语言,比如 Sonar、Coverity 等,你可以根据实际需求来选择。Facebook出的Infer。常见的语言,C,Java, Pathon等都可以分析。
动态方法
人工动态方法
人工动态方法是指,设计代码的输入和预期的正确输出的集合,然后执行代码,判断实际输出是否符合预期。单元测试,采用的测试方法本质上就是人工动态方法。
在代码级测试中,人工动态方法是最主要的测试手段,可以真正检测代码的逻辑功能,其关注点是“什么样的输入,执行了什么代码,产生了什么样的输出”,所以最善于发现算法错误和部分算法错误。
目前,不同的编程语言对应有不同的单元测试框架,比如,对 Java 语言最典型的是 Junit 和 TestNG,对于 C 语言比较常用的是 Google Test 等。
自动动态方法
自动动态方法,又称自动边界测试方法,指的是基于代码自动生成边界测试用例并执行,以捕捉潜在的异常、崩溃和超时的方法。
自动动态方法,可以覆盖边界行为特征错误, 通常能够发现“忘记处理某些输入”引起的错误(因为容易忘记处理的输入,往往是“边界”输入)。但是它对于发现算法错误无能为力,毕竟工具不可能了解代码所要实现的功能逻辑。(比如?)
每种测试方法,所能覆盖的错误类型也不同,所以进行代码级测试时,你需要综合运用这些方法,并结合所在公司或者项目的编码规范一起使用。