自动化一直如火如荼的发展的,但同时,很多从业者在经历了最初的热情、激进之后,也会陷入了冷静的思考:那就是投入产出比问题,那就是自动化测试是否真的给测试工作带来了质的改变。

在诸多的引起思考,带来彷徨的理由中,我认为代码健壮性是关键元素之一。这首先要从一个项目说起。

给单位一个项目组做自动化产品,前后五个模块,几百个用例,在我的开发环境中一一调试通过,并且是稳定通过。信心满满的提交给项目组验收,结果出现了很多问题,很多之前可以稳定跑通的case结果变得不稳定。我调试了几个之后,就上去看他们的运行环境,结果发现我的开发环境是WIN XP或者WIN 7 32位的双核处理器,2G内存电脑,而他们的验收环境则是一台XP上的虚拟机,虚拟机内存300M,单核CPU,这给用例运行带来了很多错误。比如,在开发过程中,为了追求运行速度,很多超时等待我都是取小值,而在虚拟机环境下运行,超时时间是明显不够的,所以很多函数返回False。并且由于系统资源太小,在短时间内频繁操作,还会出现产品卡死等偶然情况。反复了调试了很多次,往往顾此失彼,可以说,维护的工作量甚至达到或者超过了开发工作量,而这样质量的代码,手工测试人员也是不相信的,也很难应用到产品测试中去。

也就是因为这个项目,我深刻的思考了代码健壮性的问题。同时认知到一个道理:如果代码不具备健壮性,那这样的代码可以说是无意义的。本身的运行都会由于各种原因失败,更何谈用这样的代码测试产品,没有人会相信结果的。

所以,我修改了我们的测试框架,同时,也强化了一些增强代码健壮性的细节,包括如下这些内容:

1.在框架层面提高运行稳定性:

之前记得一句话,自动化测试框架使自动化测试成为现实,可见成熟稳定的框架的重要性。在面对批量case运行时,通过框架的调度执行,可以节约大量代码,同时在框架层面添加公共操作,处理case层面的异常,是有效的选择。

我们的框架采用的是类似白盒测试框架*Unit结构,只不过是自己实现的。在分析了一些产品卡死,运行超时等问题之后,决定将case的执行放到线程中去。

这里面首先有前提:case是独立单元的,每个casecase之前不具有强烈耦合性。另外就是,case自身是以函数形式出现,可调用执行的函数。

之所以选择使用线程而不是进程,只是因为进程在彼此通信之间存在着牵制。耳熟能详的进程通信方式:共享内存、管道、旗语、信号量等等,即便是父子进程之间,在面对大量的数据同步与交互,也会处理复杂。所以选择了线程,统一进程下的线程之间数据同步就方便的多。而且相比于进程,线程更轻量级,所占用的系统资源更少。当然,为了执行逻辑的清晰,也没有采用多线程模式,只是单线程的线性执行用例。

将case函数作为线程的run()函数内容调用,同时设置自定义的线程超时和线程清理函数,这样,在指定时间case执行未完成,则结束case运行并抛一个超时错误,同时执行自定义的线程清理函数,可以将系统环境最大化的清理干净,不影响后续的case执行。

所以,客观的说,框架层面的控制虽然简单,但意义重大,可保证每次批量用例执行时,整体上的稳定可靠。

2.在细节层面的技巧提供健壮性:

2.1使用消息传递方式取代页面操作:

当前很多应用软件使用自定义页面库或者第三方页面库进行UI开发,这些页面元素并非标准控件,甚至有些使用Spy++等工具完全无法抓取到控件,只是图。即便是能够抓取到的页面控件,在操作中,如果使用模拟鼠标键盘操作的方式,也存在非常大的风险。

因为常规的鼠标、键盘模拟,如果在运行过程中,鼠标发生移动,则会造成点击不成功。加入针对每一步的鼠标操作都超时处理,又会带来大量的无效代码和时间损耗。

针对这种问题,我们这面采用了消息传递方式来取代了鼠标键盘操作。当然,这需要研发人员的支持,也就印证了之前我们一直讨论的问题:自动化测试的良好开展还是需要研发同事的鼎力支持的。当然,我们这面现在已经是自己在产品代码中添加为自动化测试而使用的消息,这也是一直以来的工作得到了各方面的认可。

至于消息中内容的获取,一般采用标准的进程注入方式。这可之前上面提及的传统的进程数据交互不同,略有点Hack性质。

在这里不讨论UI测试鼠标模拟更真实等问题。

2.2必要时多使用WaitFor函数,同时调大timeout时间:

将所有的UI操作使用消息模式取代也是不现实的。有一些情况下也是需要鼠标等操作,或者在一些需要延时等待结果的步骤中,也可能会有timeout操作。在这里要首先选择,是否可以使用阻塞模式,如果步骤为关键步骤,那就直接使用阻塞模式即可,因为即便超时未返回结果,那就说明用例执行失败了,在框架层面会给出超时错误。对于一些比如超时的,可以增大timeout时间,这样可以在某些系统资源有限的情况下,程序依旧可以执行。

2.3合理布局函数返回值,保证函数返回值一致:

之前很多时候写函数往往很随性,返回值类型可以能代表函数执行成功或者失败的Bool型,也会有代表实际结果的Str或者Int等类型。这样的函数在外部调用时痛苦非常,因为在函数调用后处理时,处理不当就会出现typeError,所以在函数编写前,要思考后本函数的作用,同时确定返回值类型,在函数的所有涉及到返回结果时,给予一致类型的返回值,方便外部调用。

2.4必要情况下的Try…Except…处理:

Try…Except…出来处理异常是各种语言都有的模式。但到底在何处使用却有讲究。在没有抛异常的语句使用try语句,会降低性能,带来代码冗余,而在需要处理的语句未加异常处理,则会带来运行崩溃的可能。所以,要深刻的了解代码的语句,是否存在抛异常的可能,对可能抛异常的语言要加以处理。

2.5清理代码,去掉冗余代码:

很多时候,我们的代码都是迭代开发的。往往会罗列一些无用的函数,引入一些无用的类库。这些内容貌似无意义,但却是代码中的隐患。可能在后续的类库更新或者函数变更中爆炸。所以,代码要保持清理,对于无用的引用和定义,要加以清除。

。。。。。。

还有很多的细节思考,需要在不断的编码历练中加以总结,运用。

代码健壮性,说起来简单,但真想写出健壮性的代码也需要大量的实践和总结。不过,这也是自动化发展中的并经之路,只有高素质的自动化编码人员写出大量的稳定可靠的自动化代码,才会让自动化代码在实际测试中被信任,被应用。

php代码的健壮性,代码健壮性的几点思考 - 逍遥客 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...相关推荐

  1. 代码质量第4层——健壮的代码!

    健壮性(Robustness) 是指程序在遇到规范以外的输入,错误和异常时,仍能正常运行.简单来说,健壮代码的适应性很强,不会因为一些异常,就导致程序崩溃. 不健壮的前端代码体现为: 接口返回异常或报 ...

  2. 如何写出健壮的代码?

    简介:关于代码的健壮性,其重要性不言而喻.那么如何才能写出健壮的代码?阿里文娱技术专家长统将从防御式编程.如何正确使用异常和 DRY 原则等三个方面,并结合代码实例,分享自己的看法心得,希望对同学们有 ...

  3. 使用 CSS prefers-* 规范,提升网站的可访问性与健壮性

    文本将介绍 css 媒体查询中新增的几个特性功能: prefers-reduced-motion prefers-color-scheme prefers-contrast prefers-reduc ...

  4. java十进制小数转化为二进制小数代码 乘二取整法_(四)改掉这些坏习惯,还怕写不出健壮的代码?...

    Code Review 是一场苦涩但有意思的修行. (一)改掉这些坏习惯,还怕写不出健壮的代码? (二)改掉这些坏习惯,还怕写不出优雅的代码? (三)改掉这些坏习惯,还怕写不出优雅的代码? 书接上篇, ...

  5. (一)改掉这些坏习惯,还怕写不出健壮的代码?

    Code Review 是一场苦涩但有意思的修行. 近期对团队负责的项目,进行了一次 Code Review,代码评审过程中遇到的那些编码坏习惯,笑的合不拢嘴.不过,评审中很多代码编写问题,以往都多次 ...

  6. (四)改掉这些坏习惯,还怕写不出健壮的代码?

    Code Review 是一场苦涩但有意思的修行. (一)改掉这些坏习惯,还怕写不出健壮的代码? (二)改掉这些坏习惯,还怕写不出优雅的代码? (三)改掉这些坏习惯,还怕写不出优雅的代码? 书接上篇, ...

  7. 随手记——Linux中编写实时性代码时需要注意哪些问题

    在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习.我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直 ...

  8. java计分系统编程代码_使用Java代码对实时系统进行编程

    由于许多重要原因,Java语言在实时系统中的使用并不广泛. 这些包括Java语言设计固有的不确定性性能影响,例如动态类加载,以及Java Runtime Environment(JRE)本身,例如垃圾 ...

  9. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

最新文章

  1. cad lisp 两侧偏移并删除_弱电CAD不算CAD?学学操作,将手速发挥极致,让他人刮目相看...
  2. Fibonacci数列 矩阵快速幂
  3. 2018百度之星程序设计大赛 - 资格赛 1002 子串查询
  4. 更改路由器的外网IP
  5. 剑指Offer之二叉树的后序遍历序列
  6. 【整理操作】MQTT简单使用学习
  7. 最新声鉴卡H5网页源码_完整可运转,引流专用神器
  8. 最新Discuz【西瓜】微信登录插件
  9. OpenGL 饱和度调节
  10. 图片大小、像素、分辨率之间的关系
  11. Windows 10 屏幕亮度调节快捷方法
  12. 9.opengl-对qt中的QMatrix4x4进行矩阵实践
  13. linux中数据库的4种状态,数据库的数据持久有几种方案_数据库_数据管理_数据结构_课课家...
  14. 秋在季节轮回里,你在思念绽放中
  15. 短视频无尽流前端开发指南
  16. Lossless CNN Channel Pruning via Decoupling Remembering and Forgetting
  17. 戴尔t7610服务器安装系统,Dell Poweredge R730服务器系统安装和配置详细教程
  18. [弱校联萌2016]2016弱校联盟十一专场10.5
  19. 【图卷积网络】03-空域卷积介绍 (一)
  20. matplotlib 的使用技巧(局部放大图、坐标轴设置、边框设置、横纵比设置)

热门文章

  1. AD/DA的分类与指标
  2. sentinel卫星_IKONOS卫星 遥感影像解译数据 波段
  3. Java:月份的中英文转换
  4. 计算机专业还用考计算机等级考试吗,计算机计算与软件考试-计算机毕业相当于全国计算机等级考试几级?我 – 手机爱问...
  5. ssh连接服务器时特别慢的问题的解决方法
  6. 数据中心智能化运维之路
  7. linux的arp指令
  8. Activity间的转场动画(overridePendingTransition)
  9. 使用 iTextSharp 生成 PDF 表格
  10. 开发者必看:iOS应用审核的通关秘籍