一个软件测试工程师的加班经历

海交通大学计算机学士,企业管理硕士。现任职于英特尔中国软件实验室,从事嵌入式Linux相关的开发工作。PMT Community发起人之一,PMT是一个由软件行业专业人士自发组成的非营利性团体,致力于软件技术和管理的研究与实践。 
    写下这段流水帐似的周末加班经历,并不是因为无聊。只是老婆要我交待,一个“臭”(这个字眼只有很少机会享用)做软件的,老是这么晚回来,究竟在外面做些什么。如果哪天你也被要求写这样的材料,你可以参考;除了这个作用以外,或许,不同的人会从中看到不同的东西吧。 
(此处删除了向老婆表忠心的500字)

背景:

我们的软件产品需要在A、B、C三种硬件平台(理论上对我们的软件影响是不大的)上工作,早些时候已经成功在A上工作了,但在B、C上还有些问题,加班的那天是一个deadline,需要保证在B、C上也能够工作。这个产品由X、Y、Z三个部分组成,分别由三个team负责,基本的关系是:X和用户打交道,X调用Y,Y是数据进数据出,Y调用Z,Z和硬件打交道。 
    其中,X和Y都是新写的程序,而且早些时候,在X上发现了较多BUG,Y基本上没发现问题。Z的代码在以前的产品中就有,相对已经比较稳定。由于项目的时间压力,这三个部分没有时间做分别的测试,只是程序员简单测一下自己的代码后,就要集成和测试了(这就是我的具体工作)。除了三个team的leader留下外,X的程序员都留下了;Y的leader检查了team members的工作后,认为没什么问题就放他们回家了;Z的leader最“无辜”,目送所有手下下班后,自己不得不留下。

都是指针惹的祸:

一开始要加班是因为X的工作还没有完成,于是大家就一边等,一边“催”(X的leader声称要到12点才能完成,真是乌鸦嘴),一边各忙各的(我在上网看新闻)。事实上,X到7点多就完成了,但一测试发现有明显的内存访问问题。于是X就调试,由于X在内存访问问题上已经“臭名昭著”了,所以大家(至少我)相信是以前类似的问题,或者是以前的修改没有彻底。 
    但很快,X发现问题是:Y传了一个空指针给X;很快,Y也证实了X的说法。大家责问 Y,为什么程序员自己测试时没有发现?其实很简单,程序员的单元测试程序会检查是否是空指针,如果空就打印空行。于是,X和Y开始“踢球”,互相要对方加上空指针的错误处理代码;但踢了一会后,新的疑问出现了,Y照理不应该出现空指针,所以要么Y的代码有问题,要么Y要证明自己没错。

找一个BUG好难:

于是Y的leader也加入了调试队伍,因为Y的代码都有详细的Log,所以很快就定位到了他的一个team member的代码里。不幸的是,Y learder的开发机器在关键时刻down掉了。好在我们初步实施了软件配置管理,Y leader很快在别人的机器上重新搭建好了调试环境。 
    Y 作了些修改(事实上,他改的这些代码都是无关紧要的),经我测试后,发现还是不行。以我的职业感觉,我觉得X也有问题(后来知道是歪打正着)。但X宁可上 sina看“北京某景区有人裸泳”也不肯检查一下自己的代码。Y经过艰苦的调试(其实绝大部分时间我想是在理解这些不属于他的代码),发现是因为某个数据没有取得而导致了空指针的出现,但照理,Z应该总是把这项数据传送给Y的。但Y对Z的“指控”很快被证明是无效的,因为Z leader向大家“展示”了她从硬件取得的数据是好好的。 
    于是,Z leader继续吃饼干;Y leader继续调试;X一干人等继续“研究”我国风景区的管理问题。而我也终于无聊到了极点,开始“友情赞助”,检查Y的问题代码。代码很少注释,写得也很随意,甚至缩进的格式都显林乱;但好在代码不长,逻辑也不复杂。我重点检查了内存的操作,但没有发现问题。 
正在我纳闷同样一段代码,为什么其他数据都可以取得,偏偏这项数据取不到的时候,传来了Y learder的叫声。虽然听起来很像绝望后的惨叫,但我敢肯定,这的确是找到真正问题后的欢呼(和惨叫相似也是情理之中,毕竟都是在身心及其疲惫后发出的)。果然,他发现了:这项取不到的数据的名称写错了,应该是Status,但写成了State。(Y向Z要数据时,要传给Z一个数据的名称,然后Z就从硬件取得,并返回给Y。这些数据的名称是Z定义的)那么,怎么会发生这种低级错误的呢?原来,出错的代码Y的那个程序员从另外一处Copy来的,其他数据项的名称都是相同的,偏偏这项数据的名称不同。

有多少Code可以重来:

Y leader忙着改C文件和H文件,因为这个数据项的名称出现在多处,所以Y leader改得很仔细,也很辛苦;我想他心里一定在臭骂他的这个team member,为什么不定义一个常量或者宏。在Y leader改代码的时候,我也在想,这简直就像Z在故意制造陷阱:这两组数据这么类似,而且其他数据项的名称都相同,为什么偏偏这项数据,一个叫 State,另一个叫Status,真是有空,真TMD。 
    Y leader终于确认改正了所有该改的State。但用他的team member的单元测试程序一测发现还是有老问题。你可以想象到我们当时的感觉,就像吃了一吨广告上那个很夸张的“凉”得透顶的润喉糖。 
但是! Y leader大叫:单元测试程序里的State也要改成Status。在无数双眼睛的注视下,Y leader颤抖着replace all,save,F5。终于,当大家看到计算机上的一串字符后,每个人都舒心的笑了。(当然,如果没有刚才的虚惊一场,可能不是每个人都在快工作到午夜的时候还能笑得动的)。我想,此时此刻,此情此景,在Y leader的眼里,一定滚动着些东西,除了眼屎。

现在,又轮到我上场了。Build时发现X的代码中也需要把一些State改成Status。(如果当初他们也检查一下就好了)。X的程序员也没有定义常量或者宏的习惯,所以我Build了多次,他们才把所有要改的State改掉。

一个QA的精彩:

后来发生的事可以用一个“峰回路转”来形容,在无数双眼睛的注视下(我的手没有颤抖,因为人已经麻木了,或者说一切都习惯了),我启动了我们的软件,连接到B平台上,检查所有的数据,全部OK;连接到C平台上,检查所有的数据,全部OK。搞定了! 
    “回家,回家,回家的感觉是多么多么……”,我想,当时,也许每个人的心里都在回荡着王杰的这首老歌(如果知道这首歌的话),包括陪我们加班到深夜的可怜的老板。 
    当其他人已打算转身时,我的思想在激励的斗争着。看着同事们的脸,包括老板沧桑的脸和几张幼稚却不显年轻的程序员的脸,想着家里一天没能见到老爸的孩子,我想回家,但是,我是QA。我默默的连上了A平台,然后发现什么数据都没有。(如果把这个场景定格或者淡出,我怎么想都觉得象好莱坞预示续集的结尾)。 
    当我喊住大家时,我不知道该如何描述自己的感受。 
    无声,无声,又见无声!突然,老板告诉大家:今天的deadline搞定B和C平台就可以了,A平台下个礼拜再说。管他是真是假,老板发话就可以了,还不开溜。3分钟后(其中半分钟是给CVS打上Tag),我坐上了回家的Taxi。

凌晨一点的上海还是霓虹闪烁,好美。

后记:

本文纯属虚构,如有雷同,实属巧合。 
(事实上,本文99.99%是真实的,除了一些艺术加工,如果算得上“艺术”的话。我只是不想我的可爱的可敬的同事们发现我在背后骂他们乌鸦嘴和TMD)

(0)

相关推荐

  • 软件测试面试如何测试网页的登录页面

    软件测试面试如何测试网页的登录页面 这个面试题碰到过很多次, 再次总结下来. 具体需求: 有一个登陆页面, 上面有2个textbox, 一个提交按钮.  请针对这个页面设计30个以上的test case. 此题的考察目的: 面试者是否熟悉各种测试方法,是否有丰富的Web测试经验, 是否了解Web开发,以及设计Test case的能力 这个题目还是相当有难度的, 一般的人很难把这个题目回答好. 功能测试(Function test) 输入正确的用户名和密码,点击提交按钮,验证是否能正确登录. 输入

  • java selenium操作弹出对话框示例讲解

    Web 开发人员通常需要利用JavaScript弹出对话框来给用户一些信息提示, 包括以下几种类型 阅读目录 对话框类型 测试页面 Selenium 操作对话框的代码 对话框类型 1.  警告框: 用于提示用户相关信息的验证结果, 错误或警告等 2. 提示框: 用于提示用户在当前对话框中输入数据,一般需要用户单击取消或者确认按钮 3. 确认框: 用于提示用户确认或者取消某个操作,一般需要用户单击取消或者确认按钮 测试页面 用如下页面为例进行讲解, 包括了警告框,提示框,确认框 http://si

  • java selenium元素定位大全

    页面元素定位是自动化中最重要的事情, selenium Webdriver 提供了很多种元素定位的方法.  测试人员应该熟练掌握各种定位方法. 使用最简单,最稳定的定位方法. 阅读目录 自动化测试步骤 定位方法大全 如何定位 通过ID查找元素: By.id() 通过Name查找元素:By.name() 通过TagName查找元素: By.tagName() 通过ClassName 查找元素 By.className 通过LinkText查找元素 By.linkText(); 通过PartialL

  • java selenium使用浏览器调试工具实现方法

    在基于UI元素的自动化测试中, 无论是桌面的UI自动化测试,还是Web的UI自动化测试.   首先我们需要查找和识别UI元素. 在基于Web UI 自动化测试中, 测试人员需要了解HTML, CSS和Javascript的一些知识, 还需要学会使用各种浏览器的调试功能 查找Web UI 页面上的元素, 必须先了解页面的DOM结构, 元素的属性, 甚至一些JavaScript的调用信息.  现在主流的浏览器都自带了很多强有力的工具 阅读目录 Google Chrome Internet Explo

  • 软件测试方法大汇总

    软件测试方法大汇总 软件测试方法种类繁多,记忆起来混乱, 如果把软件测试方法进行分类, 就会清晰很多. 我参考一些书籍和网上的资料, 把常用的软件测试方法列出来, 让大家对软件测试行业有个总体的看法. 从测试设计方法分类 测试名称 测试内容 Black box黑盒测试 把软件系统当作一个"黑箱",无法了解或使用系统的内部结构及知识.从软件的行为,而不是内部结构出发来设计测试. White box白盒测试 设计者可以看到软件系统的内部结构,并且使用软件的内部知识来指导测试数据及方法的选择

  • java selenium XPath 定位实现方法

    xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. 阅读目录 什么是xpath xpath定位的缺点 testXpath.html 代码如下 绝对路径定位方式 使用浏览器调试工具,可以直接获取xpath语句 绝对路径的缺点 绝对路径和相对路径的区别 相对路径定位方式 使用索引号定位 使用页面属性定位 模糊定位starts-with关键字 模糊定位contains关键字 text() 函数 文本定位 什么是xpath xpath 是XML Path的简称, 由于H

  • 软件测试面试如何测试一个杯子

    软件测试面试如何测试一个杯子 在软件测试的面试中, 经常会碰到类似的问题. 比如:如何测试一个杯子, 或者如何测试一只笔. 要求你设计20个以上的test case. 这类的面试题目,是考察面试者是否熟悉各种软件测试方法, 设计test case的能力, 以及test sense. 首先应该反问下面试官, 需求是什么样的,比如大概是个什么样的杯子. 我回答这类问题的思路, 从软件测试的各种不同方法来联想,  具体如下. 功能测试(Function test) 能否装水, 除了装水, 能否装其他液

  • 流行的软件测试工具介绍

    英文原版书籍下载:https://bitbucket.org/xurongzhong/python-chinese-library/downloadss. 精品文章推荐: python 2.7 中文教程及自动化测试介绍 使用Python学习selenium测试工具 性能测试艺术 Java单元测试之模拟利器-使用PowerMock进行Mock测试 网络工具ATC 主页 http://facebook.github.io/augmented-traffic-control/ 代码托管:https:/

  • java selenium 常见web UI 元素操作及API使用

    本篇介绍我们如何利用selenium 来操作各种页面元素 阅读目录 链接(link) 输入框 textbox 按钮(Button) 下拉选择框(Select) 单选按钮(Radio Button) 多选框 check box 链接(link) <div> <p>链接 link</p> <a href="www.cnblogs.com/tankxiao">小坦克</a> </div> 链接的操作 // 找到链接元素

  • java selenium 操作浏览器实例

    本篇文章介绍selenium 操作浏览器 阅读目录 浏览器最大化 前进,后退, 刷新 截图操作 模拟鼠标操作 杀掉Windows浏览器进程 浏览器最大化 前进,后退, 刷新 public static void testBrowser(WebDriver driver) throws Exception { driver.get("http://www.cnblogs.com/tankxiao"); Thread.sleep(5000); // 浏览器最大化 driver.manage

随机推荐