有时候显示的BUG,你可能看不懂。有时候显示的BUG,你想不通。

下面这个案例,当时遇到的时候就非常想不通。我们产品将于GTF(公司的自动化测试框架),做了自动化测试。测试人员发现,在模拟绘制模型的时候,鼠标一旦移动就报错。

但是开发人员在实际复测的时候,怎么都复现不了。于是找到我来帮助诊断案例。因为GTF是我设计编写的。他们怀疑是不是GTF出问题了,导致这种奇怪的问题。

我上次就说过这个问题了,人们在怀疑BUG出在哪里的时候,往往容易对自己不熟悉的领域进行怀疑。不过这个时候,不是我来争论这个道理的时候,诊断问题要紧。

从案例的表象来看。如果GTF本身没有问题的话(我是坚信这点的),那么BUG肯定是因为两次模拟鼠标的事件导致了差异。于是就看了模拟鼠标和实际系统的鼠标事件的差异。没有发现问题!

那么问题出在什么地方呢?

没办法,看代码。于是我将这个模块的所有鼠标相关的事件都看了一下。发现一个问题,发现在鼠标移动的时候,程序处理了一段:如果发现某个对象,就将这个对象创建起来。

我突然灵光一现,自动化测试,模拟鼠标移动的过程,没有中间过程,而我们实际操作,都有中间过程,也就是说鼠标肯定会响应MouseMove事件。那么这个对象就肯定会被创建。但自动化测试的时候,这个对象就不会被创建。

基于这个猜测,我们将MouseMove的处理修改了一下,并且重新整理了一下创建对象的触发条件。就避免了这种情况的发生。

在MouseMove里创建对象的这种方式确实值得探讨。个人建议不要这样做。可以通过记录状态,其他系统通过的Observer模式来编写。

从实际编程的逻辑来看,确实可能出现MouseMove没有响应,就进行了Mouse的位置调整。编程的时候要注意了。有些假定条件是可能不成立的。