下文原本作于2015年5月9日,当时使用长微博,并没有太多不适。只不过最近想要写的技术文章需要贴一些代码,长微博就不合适了。为了保证一点连贯性,所以干脆把这篇也搬运过来。以下是正文。
昨天看了一下沉鱼老师早先在QCon做的关于多终端测试的分享。实际上我们去年也做了类似的事情,解决方案比较类似,单细节处略有不同。觉得有几处比较好奇,就还是拉代码下来看了一下。代码量不多,逻辑也很清晰,看着真是舒服。下面记录一下。
有这么几个角色,client就是测试需求方,server测试分配方,还有labor实际测试,干活的浏览器们。
- server起来
- labor跑来面试好了面试通过
- client说我要测试,server说你给我一个可以访问到的地址,于是client
3.1 有就直接给,没的话
3.2 如果是本地文件,就启个本地server,得到地址
3.3 如果是代码片段,建一个临时文件,叫啥你别管,得到地址 - 发起order请求到server,带上必要材料,比如要测哪些浏览器,待测地址blahblah
- server生成一个order,挑一个工作不饱和的labor,拼上orderId和laborId分配给这个labor跑
- labor收到跑测试的消息后,window.open或者通过iframe(在移动平台无法window.open),开始屁颠屁颠的测试
- server其实还偷偷摸摸做了一件事情,就是把host换成自己的(proxy),这样他就可以插入一些龌龊美妙的东西。页面中引用的资源因为有refer就直接放行
7.1 替换掉全局的alert,prompt,confirm这些会添堵的东西
7.2 注册一个totoro.report方法,各种事儿都往一个本地变量result里丢
7.3 完事儿后发个end的report,通过ajax告诉server,完事儿了
7.4 server会根据页面引入的script来猜测使用的测试框架,来插入不同的适配 - server把结果告诉client,然后做些清理总结工作,labor没事了,可以去买瓶汽水
- 总之client开开心心得到测试报告,server赚钱了钱付给labor一点大家开心(并没有)
PS 第3步在某些时候可能会有问题,比如server网络访问不到工作机网络之类,可以通过部一个localtunnel-server来绕过去,其他一些细节的处理思路挺值得学习借鉴的。