从测试角度浅谈如何提高代码质量

       对所有程序员来说,代码质量是伴随着职业生涯始终的一个问题。相比起实现业务功能,提升代码质量往往是个更能让人头疼指数飙升的要求,因为对很多人来说,它是代码编写过程中一项捉摸不定、又无处不在、还没有止境的工作。但恰好,它也是区分一个程序员是否真正优秀的重要分水岭。

 什么是代码质量?

       我们描述一个商品质量好,通常等价于好用、易用和耐用,而代码质量也与之类似。描述代码质量的词很多,最常被使用的词大概如下:

  • 可维护性(maintainability)
  • 可读性(readability)
  • 可扩展性(extensibility)
  • 灵活性(flexibility)
  • 简洁性(simplicity)
  • 可复用性(reusability)
  • 可测试性(testability)

       翻译下就是高质量的代码应该:做应该做的事情、遵循一致的样式、尽可能的简单、很容易理解、方便修改和复用、能够被测试。

测试与代码质量有什么关系?

       测试与代码质量是两个紧密联系的概念,提高代码质量是测试的目的,而测试是保障和提高代码质量的最有效手段。

       在实际软件研发过程中,大部分编写代码的研发人员,往往不屑于并故意推脱测试工作,认为那不是自己应该做的工作内容。而笔者认为,对于一个真正优秀的程序员来说,测试工作一定会在他所有工作中占到相当大的比例,尤其是在代码编写的早期阶段。

1、单元测试

       单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。它通过编写测试驱动(单元运行环境)和测试用例(单元运行的参数取值组合),使函数单元运行起来,可以快速验证代码是否准确地实现了设计目的,帮助提高代码设计的合理性(能进行单元测试的函数,一定是低耦合的)和健壮性(遍历函数的逻辑路径,函数不发生意料之外的问题),还能发现代码中的缺陷和bug。相比后续复杂的集成测试和系统测试,单元测试的创建和维护比较简单,发现的代码问题也容易定位和修复,具有高效率低成本的优势。

       单元测试主要内容包括:

1)逻辑测试:充分覆盖代码单元(通常是函数或类)的所有逻辑路径(语句、分支、条件、MC/DC等),查看单元的执行状态和结果,是否有意料之外的情况和无法到达的分支,验证单元的健壮性。

2)功能测试:根据单元功能,设计包含单元运行前后的参数取值,即初始取值和预期结果,并将预期结果与实际执行结果进行比对,如果不一致,通常意味着单元未能准确实现设计功能。

3)边界测试:测试参数取边界值和特殊值时单元的运行状态和结果。

4)缺陷查找:部分单元测试用例也会触发一些软件运行时错误,如内存越界、除零、空指针等。

可以看到,单元测试的内容验证了代码的健壮性和功能实现,而进行单元测试本身又对代码的可读、易于理解、简洁和可测试性提出了要求(因为不满足这些特性,测试用例的设计是个基本无法完成的工作)。必须要再强调的一点,单元测试是覆盖最充分且代码修复性价比最高的测试环节。

2、集成测试

       集成测试也叫部件测试,基于单元测试,将功能上联系紧密且相互调用的单元组成部件,再进行功能、边界、接口等内容的测试,从测试方法上说,与单元测试有一定的相似。

3、代码走查

       代码走查 (code walkthrough) 是一个开发人员与架构师集中讨论代码的过程。代码走查的目的是交换有关代码是如何书写的思路,并建立一个对代码的标准集体阐述。

       在代码走查的过程中,开发人员都应该有机会向其他人来阐述他们的代码。通常地,即便是简单的代码阐述也会帮助开发人员识别出错误并预想出对以前麻烦问题的新解决办法。

4、静态代码分析

      静态代码分析(或静态分析)是软件开发中的软件测试活动,其中分析源代码以查找已知与软件错误或安全漏洞相关的结构。当检测到高风险构造时,静态分析工具会报告违规行为,以供开发人员查看和修复。

      静态代码分析主要内容包括:

1)代码度量:分析统计代码度量指标,例如代码行、注释率、扇入/扇出、圈复杂度、最大嵌套深度等等,从统计的角度衡量代码的质量。

2)编码规范:是一种将不同程序员写的代码努力保持一致的风格的方法,也叫风格指南,当所有代码均保持一致的风格,后续人员在理解和维护大型代码库时更为轻松。通常依据一些行业规范如GJB8114等,也有组织或机构自己编制标准。

3)缺陷&漏洞:相比编码规范检查,缺陷和漏洞需要对代码更深层次的分析,通常会采用上下文敏感、值流图等技术,挖掘代码中可能存在的缺陷漏洞,提供代码质量和安全。

       静态代码分析也是一种直接高效的测试方法,借助静态分析工具可以快速地对大规模代码进行批量检测,度量数据、违规/漏洞信息都会被清晰地汇报,帮助优化和修复问题,最终提供代码质量。

5、系统测试

      系统测试,是对整个系统的测试,将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统说明书的地方。这种测试可以发现系统分析和设计中的错误。

      如安全测试是测试安全措施是否完善,能不能保证系统不受非法侵入;或者如,压力测试是测试系统在正常数据量以及超负荷量(如多个用户同时存取) 等情况下是否还能正常地工作。系统测试主要关注软件整体的功能性、可靠性、安全性,对发现的问题追溯到源代码再行进修改优化

推荐几款好用的测试工具 —— 轻松高效完成测试

     了解过测试之后,可以清楚地看到测试在提高代码质量上的巨大价值,对于代码编写人员来说,完备的测试是代码质量的有力保证。不过考虑到与代码联系是否直接、测试内容是否容易实施、质量提升效果是否明显、时间投入性价比等因素,单元测试、静态分析是值得被优先考虑的测试环节,因此我主要针对这两个环节介绍一些工具。

单元测试工具

      Testbed/TBrun是英国LDRA公司的旗舰产品,是可以同时支持主机平台软件测试和嵌入式软件测试的单元测试工具。该工具进入我国市场比较早,在各大研究机构、软件测试部门有较为广泛的采购。不过行业人士介绍工具的学习难度和使用难度较大(界面复杂,用例设计工作量大),主要是评测和航空的单位能真正用起来。

      iUnit是国内软件厂商湖南泛联新安研发的新一代智能单元测试工具,团队背靠国科大的技术积累,与多所著名高效有合作。iUnit除了基础的单元测试功能外,最大的亮点是可以自动生成高覆盖率的测试用例集,这样就很大程度上提高了单元测试的效率。此外工具的国产化背景、简明优美的界面、简便的操作流程(高自动化,表格驱动)、定制模板的报告生成等特点,也是加分项。

静态分析工具

      Fortify是Micro Focus旗下AST(应用程序安全测试)产品。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析,通过与软件安全漏洞规则集进行匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并可导出报告。扫描的结果中包括详细的安全漏洞信息、相关的安全知识、修复意见。

      Klocwork来自Perforce公司,是针对C,C ++,C#和Java编程语言的最准确的代码分析工具之一。它是一款现代化的敏捷代码静态分析工具,可扩展到任何规模的项目,并在DevOps周期内有效运行。此外,它还通过了TÜV-SÜD的功能安全合规认证 ,包括IEC  61508,ISO 26262,IEC 62304和EN 50128。

      CodeSense也是国内软件厂商泛联新安的产品。经过清华大学与国防科技大学的专家团队对代码静态分析技术的深度理论研究,结合软件工程实践研发而成。CodeSense 使用了控制流分析、数据流分析、上下文敏感分析、对象敏感分析、跨程序分析和跨文件分析等多种国内外先进技术,能够精准的检测软件安全漏洞与质量缺陷,支持多种编程语言,具有强大的检测规则扩展能力,支持多种开发环境与国产化平台。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值