一枚小Bug的独白(挺有意思的~)

我是一枚潜藏在数据库引擎深处的Bug,躲在一个黑暗的角落很久了,历经多个版本、N轮回归测试的风雨洗礼,我存在,我骄傲。还记得那天,我怀着激动而忐忑的心情等待一位QA新人把我发布出去……

  产品发布在即,一位颇有经验的QA在无意间写了一条短小精悍的用例让QA新人来执行一遍,就是这条不起眼的用例,使我原形毕露。这个用例看起来很简单:就是向数据库里插入一条null记录(还记得我们的Mr Null吗?),一条字符串记录;再一条null记录,一条同样的字符串记录……如此反复,来个5000次,然后启用创建数据字典的功能,将这若干条看似规律的记录进行压缩。好歹咱也算经历过风风雨雨的,每天的持续回归测试也没有拿我怎么样,可就在执行这条小用例时,神奇的事情发生了------数据库发生了崩溃。

  原因分析:

  这个难题先后困扰过好几个人,直到一位研究“炸弹”的开发GG,他对我进行了好好的剖析,终于发现了问题的缘由。具体要从数据库引擎的压缩机制开始讲起:

  ● 记录压缩:是基于数据字典的压缩。所谓数据字典,就是数据库表所有记录中出现频率最大的字符串集合。压缩时,将记录中与数据字典相同的字符串进行替换,替换为数据字典的下标。由于数据字典的下标一定会远远小于字典所代表的字符串,因此就达到了记录压缩的效果。

  ● 实现流程:该引擎的数据字典在采集时,是将所有的记录拼成一条长长的字符串流,然后从字符串流中采集出现频率最高的子串,作为数据字典,而拼接记录时并未在记录间添加分隔符。这种一行null记录、一行字符串记录的方式,会使数据库引擎采集的数据字典的长度超过记录的最大长度,导致系统内部验证报错。

  解决办法:

  知道了问题的本质,解决起来就很方便了,在将记录拼接为长字符串流时,在每个记录的拼接处添加分隔符。不能跨越分隔符采集数据字典,从而保证了数据字典的长度一定小于等于记录的长度限制,问题解决!

  经验总结:

  ● 注意边界问题。问题往往出现在边界情况下,比如最大值/最小值/0值。如果在代码中加入一些边界断言,可以帮助提早发现问题。

  ● 注意“null”的使用。不论开发还是测试,注意“null”的使用都可以帮助我们少犯一些错误,或者多发现一些问题。

  ● “杀虫剂困境”的思考。再严密的单一性测试也不可能发现100%的Bug。将不同的测试思路和方法相结合,采用探索式的测试思维或许能帮助发现更多潜在问题。

  说了这么多,我得闭嘴了,不低调的Bug是不厚道的,最后把一句很喜欢的佛语送给大家:“你见,或者不见我,我就在那里”,但是我们始终敌不过开发和测试的协同努力。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-11-08 20:06:38

一枚小Bug的独白(挺有意思的~)的相关文章

asp.net 2.0中tablecontrol搭配masterpage的小bug

asp.net|erp 在asp.net 2.0中,如果在一个masterpage页面中,使用服务端的table控件的话,如下所示,会在设置视图时,没了其中的contentplaceholder,     <asp:Table ID="tbl" runat="server">            <asp:TableRow>                <asp:TableCell>                    Th

c++-二叉树搜索的问题,以及一个小bug

问题描述 二叉树搜索的问题,以及一个小bug #include<iostream> #include<string> using namespace std; class node{ public: string name; string keyword; node* left; node* right; node(string a = "0", string b = "0", node* c = 0, node* d = 0) : name

Win10 UWP系列:关于错误 0x80073CF9及一个小bug的解决

原文:Win10 UWP系列:关于错误 0x80073CF9及一个小bug的解决 最近一直在开发XX的uwp版本,也是边摸索边做,最近遇到几个比较奇怪的问题,记录于此. 1.项目可用部署到PC,但无法部署到手机,提示以下错误: 错误 : DEP0001 : 意外错误: Install failed. Please contact your software vendor. (Exception from HRESULT: 0x80073CF9 为了方便开发,我将常用的类库引用好.默认的几个页面做

menu-关于popupwindow学习中出现的一个小bug

问题描述 关于popupwindow学习中出现的一个小bug 我设置了一个buttonde点击事件 点击后能弹出popuowindow的框 ,我也设置了menu键,点击menu键 也可以弹出这个popupwindow的框 ,但是奇怪的地方在于,如果我不先点击button,我点menu键,它不会再弹出这个popupwindow的框了 ,意思就是只有先点button弹出那个popupwindow框先,点击menu才会有popupwindow这个框.我一直找不到原因,特地找各位大神帮帮忙!然后还有一个

c++-pta:大炮打蚊子,有点小bug,求大神帮忙解决一下

问题描述 pta:大炮打蚊子,有点小bug,求大神帮忙解决一下 现在,我们用大炮来打蚊子:蚊子分布在一个M×N格的二维平面上,每只蚊子占据一格.向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意: O OXO O 其中,X为炮弹落点中心,O为紧靠中心的四个有杀伤力的格子范围.若蚊子被炮弹命中(位于X格),一击毙命,若仅被杀伤(位于O格),则损失一半的生命力.也就是说,一次命中或者两次杀伤均可消灭蚊子.现在给出蚊子的分布情况以及连续k发炮弹的落点,给出每炮消灭的蚊子数. 输入格式: 第一行为两个不

Chrome出了个小bug:论如何在Chrome下劫持原生只读对象

Chrome出了个小bug:论如何在Chrome下劫持原生只读对象       概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证网页的安全性和网页制作者的一定控制权,有些浏览器对象是无法更改的,比如"window.location"对象,或者对它们的更改是无效的,比如"window.navigator"对象.然而,最近我发现Chrome出现了一个小"bug",在C

linux的一点小bug

那天,我们"操作系统"课程安排上机实验,主题是让我们熟悉 Linux 下的系统调用,内容是尝试用 fork() 创建一个子进程. 老师告诉我们:fork() 执行后,父进程和子进程共享代码段.我当时还不清楚子进程运行的时候,到底是从头开始执行还是从 fork() 开始执行.fork 这个单词的字面意思是分叉,按这个逻辑进程应该是从 fork() 这个分叉口继续执行.于是,写了如下代码检验我的推测. /** * Linux 的小 Bug * Code 1 * Author: redrai

[实录]解决Migrator.Net 小bug

好久没写了,平时比较忙,只能趁周末的时候,写一点小东西,自己也记录一下. 平时我们做项目的时候,都会有自己的数据访问层,为了能方便以后的升级,我们一般会抽象出数据访问层,利用某些方式(比如工厂模式),达到数据库类型的切换,这大大提高了我们的开发效率,只需要修改建立一个新数据库,再配置的时候修改一下就能使用了.但每次我们必须要建立这个新的数据库,有时候这个工作量也非常的大,如果不熟悉的人,还可能建立的数据库与原先的数据访问不兼容,那怎么解决呢?有什么办法使我们建立数据库能够统一呢?答案是肯定的,我

一个挺有意思的Javascript小问题说明_javascript技巧

先来看以下3段代码 复制代码 代码如下: var firstName = "Mark"; (function DisplayFirstName() { console.log(firstName); })();//必然输出 Mark var lastName = "Aut"; (function DisplayLastName() { var lastName = "Bru"; console.log(lastName); })();//必然输出