天天看点

Solution for Lead OPA test error ( add button clicked after cancel button )

改了Lead后遇到OPA的test failure:

Solution for Lead OPA test error ( add button clicked after cancel button )
Solution for Lead OPA test error ( add button clicked after cancel button )

我会把这个问题的分析思路写到github上。

找不到item的原因是因为dialog根本就没有render-> dialog render是通过fragment.open实现的。

在引起OPA fail的上一行语句,add button会call Dialog.open,但是此时open没有真正执行,因为line 415就已经返回了。

[外链图片转存失败(img-YJw9CIAP-1568814912233)(https://user-images.githubusercontent.com/5669954/32261668-10062408-bf0b-11e7-8ccd-aec1510a3260.png)]

为什么之前Cancel button已经调用了Popup.close,但是 随后Open的时候isOpen仍然返回true?

Solution for Lead OPA test error ( add button clicked after cancel button )
Solution for Lead OPA test error ( add button clicked after cancel button )

然后用延时操作将真正的close动作fnClose放在210毫秒之后执行:

[外链图片转存失败(img-Vy4zVc0z-1568814912234)(https://user-images.githubusercontent.com/5669954/32261671-10d4ea0e-bf0b-11e7-99f0-47f96cd17ad9.png)]

只有在210毫秒之后,popup的bOpen才会置为false,状态才会置为CLOSED. 但是我们随后的Add button click发生在这210毫秒之前,因此此时dialog的bOpen还为true,因此第二次Add button的执行并不能打开Dialog。

[外链图片转存失败(img-UI2ofEti-1568814912235)(https://user-images.githubusercontent.com/5669954/32261672-11094312-bf0b-11e7-846b-1d83198a59a0.png)]

Solution

第一种改法:

Product.js 做如下修改,这样每次点击add button会生成新的Dialog instance,避免了share同一个instance导致的问题。每次对oAddProductsFragment 赋上新的instance,之前的instance引用计数为0会被浏览器自动回收,不会出现内存泄露。我们Lead 代码里也没有任何地方需要显式通过”addProducts” id来引用这个dialog,所以这个改法可行。

[外链图片转存失败(img-CoZLlwqZ-1568814912235)(https://user-images.githubusercontent.com/5669954/32261673-113cd204-bf0b-11e7-8901-ac865e13fca1.png)]

我测试通过:

[外链图片转存失败(img-1IoENtgO-1568814912236)(https://user-images.githubusercontent.com/5669954/32261674-1171cdce-bf0b-11e7-892f-c1340ec8af75.png)]

第二种改法:

[外链图片转存失败(img-5mHhv4wI-1568814912236)(https://user-images.githubusercontent.com/5669954/32261660-0e92c2a2-bf0b-11e7-9719-e3c70c16c630.png)]

在open前面加上判断,抢先把210毫秒之后才会被修改的标志位提前由我们的application 代码自己改掉,这样之后的open能够成功。

但是这样做破坏了UI5的dialog.open和dialog.close的封装性,这些internal的属性bOpen和eOpenState UI5并不想让application touch,将来UI5升到新的版本随时可能修改,而且我也没试过Jenkins build会不会出错。所以这种做法技术可以但不能用在生产代码里。

第三种改法:

Debug dialog的close方法发现里面有个分支,如果传入的duration 为0,则真正做close的动作不通过animation来实现,而是立即执行fnClosed。

这种改法也能解决问题,但这样一来就相当于为了test 能通过而adapt了应用的UI behavior,感觉有点本末倒置。

[外链图片转存失败(img-1SkP7QOl-1568814912237)(https://user-images.githubusercontent.com/5669954/32261661-0ec950ce-bf0b-11e7-9d24-db9ed2440d1f.png)]

第四种改法:

以上三种方法都需要修改我们的应用代码。我在想有没有一种方法能够只修改OPA 代码,也能让测试通过。

Sent: Friday, 8 July, 2016 2:25 PM

UI5里的cancel点了之后的动画效果是用jQuery的animation实现的,代码里写死的动画效果的duration是210毫秒。

如果用这种解法,我还是能重用dialog fragment instance,只需要用dialog的API setDuration把close的animation设为0,这样close就没有动画效果了。

Solution for Lead OPA test error ( add button clicked after cancel button )

附件是延时为210毫秒和0毫秒的cancel 效果,大家看看肉眼能不能看出差别。

第四种解法的思路很简单,既然dialog的cancel是duration 210毫秒的动画效果,那么OPA代码里我只要保证OK button的点击是在这个cancel动画结束之后再执行就行了。用setTimeout将这个点击事件加到queue里,300毫秒后执行。

这种方法只用改OPA代码,可以作为最后的solution,现在OPA就能过了。

Solution for Lead OPA test error ( add button clicked after cancel button )
Solution for Lead OPA test error ( add button clicked after cancel button )

继续阅读