我参与了一个为Javascript提供变异测试的OSS项目 - 基本上通过改变单元测试测试的代码来测试单元测试的有效性。
改变代码的一个不可避免的影响是你可能遇到无限循环:
while(var i=0; i<10; i++){...}
可能会成为
while(var i=0; i<10; i--){...}
虽然可以排除一些基本突变(例如这一突变),但是排除可能导致无限循环的每个突变是不可能的(也不是IMO可取的)。 相反,我一直专注于检测无限循环,终止当前的突变测试并发出警告并继续下一个突变。
在Karma中,我遇到了一个问题:如上所述的循环会使浏览器占用并将CPU发送到100%。当我尝试关闭Karma服务器时,我收到以下错误:
Fatal error: socket hang up
Process finished with exit code 3
这不仅会杀死我的父进程,从而使所有剩余的突变都未经测试,而且还会留下子进程(我正在运行一个小型的业力服务器实例池)悬空,然后我必须手动杀死。
我一直在努力解决这个问题已经有一段时间了,感觉我已经撞到了混凝土墙。非常感谢任何帮助。
如果您想了解更多信息/背景信息,请随时查看https://github.com/jimivdw/grunt-mutation-testing/tree/kill_looping_karma_servers
上的项目在那个分支中,我有一个名为 script_endlessLoop.js 的文件,当它发生变异时,会在很多情况下导致无限循环。我现在通过添加@excludeMutations来禁用突变,因此需要删除或修改。然后运行grunt test:karma
应该会给您上述错误。
请小心!运行此操作后,请确保清理所有与节点相关的进程,因为这可能会导致计算机严重运行