微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 在Chrome中获得测试的间歇性失败

更新2:

在忘记这一周(并生病)之后,我仍然不在这里.唯一的消息是我在Safari和Firefox中重新进行测试,现在Safari总是在这些测试中失败,而Firefox总是超时.我假设我已经在某处改变了某些东西,但我不知道在哪里.

我也越来越确定某个地方存在计时问题.可能只是代码在不应该的地方进行异步,但更可能的是它被中断了.

更新:

我对找到真正的错误不太感兴趣,并且更加关注为什么它会断断续续.如果我能找到原因,我可能会发现错误,或者至少重写代码以避免它.

TL; DR:

我正在使用Karma(使用Webpack和Babel)在Chrome中运行测试,其中大多数都很好,但由于某种原因,7次测试会出现间歇性故障.

细节:

所以!上班!
当我在调试选项卡中运行它时,六个第一次测试MOSTLY成功,并且MIGHT失败.但是,正常运行时失败百分比似乎更高.这六个测试是相关的,因为它们在运行特定方法后都会失败,该方法对某些Backbone模型起到安全删除()的作用.基本上它意味着检查并清除()模型中要删除的所有链接模型,如果不能这样做则返回false.
如果失败率为100%,我确信我会发现错误并将其眨眼,但我唯一知道的是它与尝试访问或更改已删除的模型有关,这看起来像这是一个计时的事情……?什么东西是异步运行但不应该……?我不知道如何解决它…

第七次测试更容易一些.它使用Jasmine-Jquery来检查dom元素(开始为空)是否在我改变之后得到另一个div.这是为了测试Bootstrap的Alert-system是否正确实现,但是为了试图找出它失败的原因而进行了大量简化.如果我将其作为gulp任务运行,则此测试总是失败,但如果我打开调试选项卡并手动重新运行测试,则总是成功.所以我的假设是Chrome第一次没有正确呈现DOM,但如果我在调试选项卡中重新运行它,则修复它…?

TMI:

当我说我打开调试选项卡并手动重新运行测试时,我当然仍在同一个’gulp test’任务中.我也使用’gulp testonce’,但唯一的变化是它启用了singleRun并启用了HTML报告器.它显示了完全相同的模式,但我无法在那里检查调试页面,因为浏览器在测试后退出.

使用html报告器从前6个测试之一输出.

Chrome 47.0.2526(Mac OS X 10.11.2)模型库:句子:删除句子后不再有任何元素,两个元素都失败
        错误:没有这样的元素
            在Controller._delete(/Users/tom/dev/Designer/test/model.spec.js:1344:16< - webpack:///src/lib/controller.js:107:12)
            at Object.< anonymous> (/Users/tom/dev/Designer/test/model.spec.js:143:32< - webpack:///test/model.spec.js:89:31) 使用html报告器从测试7输出. 网站测试& raquo;消息系统
  预期({0:HTMLNode,长度:1,上下文:HTMLNode,选择器:’#messagefield’})不为空.
    at Object.& lt; anonymous& gt; (/Users/tom/dev/Designer/test/website.spec.js:163:39& lt; – webpack:///test/website.spec.js:109:37)

现在,您应该知道的第一件事是我当然尝试过其他浏览器,但Safari与Chrome有完全相同的模式,Firefox也给我带来了相同的错误,但错误消息最终在我的html报告器中占用了80MB的磁盘空间如果它完成,那么很长时间才能完成.大多数时候它只是断开连接 – 最终会更快.
所以我最终只是使用Chrome来试图找到这个特定的错误,这个错误现在已经困扰了我一周的梦想.

资源

测试:
https://dl.dropboxusercontent.com/u/117580/model.spec.js.html
https://dl.dropboxusercontent.com/u/117580/website.spec.js.html
测试输出(由于错误是间歇性的,这只是一个例子):https://dl.dropboxusercontent.com/u/117580/output.html

解决方法

好的,所有测试现在都成功了.我认为这是答案: 一些测试称为控制器,一些测试称为window.controller.这包括一些reset()和remove()命令. 在重写之后,我仍然有失败,所以我做了另一次重写.作为重写的一部分,我决定通过window.*进行所有调用,然后重写所有测试成功.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐