为titanium 增加单元测试(add unit tests for titanium)
访问量: 2894
refer to: http://siwei.me/blog/posts/titanium-tishadow-unit-tests-using-tishadow
我们的主力项目之一: 乐股在线 (happy stock) 经过两个月的发展, 功能增加了很多, 所以需要增加单元测试了. 下面是个例子:
那么例子就从启动写起 .
对于启动 app之后, 使用spec描述的话,应该是:
describe('index page', function(){ it('对于第一次运行,需要显示四个介绍图片', function(){ }) it('对于没有登陆过的用户,需要显示登陆页面',function(){ }) it('对于已经登陆过的用户,直接跳转到主页',function(){ }) })
是不是如果去掉 boiler plate code ( (), function(){}) 这些东西的话,看起来就跟普通的文字描述一样了? ^_^ 跑一下试试.
先运行tishadow.
$ titanium build --target device --platform android --skip-js-minify --tishadow
在第二个terminal , 运行:
$ tishadow spec -t mocha-should --platform android
就可以看到结果了
2015-02-19 18:45:09 -- [INFO] Alloy compiled in 7.70866s [INFO] 851 file(s) bundled. [INFO] BUNDLE sent. [INFO] [android, 4.1.2, 192.168.1.102] Connected [INFO] [android, 4.1.2, 192.168.1.102] Connected [INFO] [android, 4.1.2, 192.168.1.102] App Bundle HappyStock is not for this app: test_tishadow_spec [INFO] [android, 4.1.2, 192.168.1.102] Unpacking new bundle: HappyStock [INFO] [android, 4.1.2, 192.168.1.102] Requiring: appdata-private://HappyStock/spec//index_spec.js index page + 对于第一次运行,需要显示四个介绍图片 + 对于没有登陆过的用户,需要显示登陆页面 + 对于已经登陆过的用户,直接跳转到主页 3 passing (48ms)
这里会有几种情况 屏幕会卡死(卡死在 BUNDLE set 那一步):
1. 应该是网络问题. 重新运行一下即可.
2. 要有一个 tishadow 进程在运行 ( 见上面的 $ titanium build --target device --platform android --skip-js-minify --tishadow )
3. 设备上要打开 我们的app. 否则 tishadow 表示 设备已经丢失.
4. 修改了titanium的非常规文件时 ( 除了xml, js, tss, 图片 之外的文件, 比如 增加文件夹, 增加lib/js, 修改了配置文件tiapp.xml 等) 都要重启tishadow server
现在,我们继续在Titanium的环境之下测试( 测试 titanium app的文字啊, button 啊啥的) ,这个才是我们最关心的.
describe('app启动后 (index.xml) ', function(){ var Alloy = require('alloy') var $ beforeEach(function(){ $ = Alloy.createController('index'); }) it('对于第一次运行,需要显示四个介绍图片', function(){ console.info('== 我们看看$ 是不是一个controller') $.should.equal('some var') }) it('对于没有登陆过的用户,需要显示登陆页面',function(){ }) it('对于已经登陆过的用户,直接跳转到主页',function(){ }) })
保存, 运行 单元测试, 大约一段时间后, 看到结果:
[INFO] [android, 4.1.2, 192.168.1.102] Requiring: appdata-private://HappyStock/android/alloy/cont 1) "before each" hook 0 passing (279ms) 1 failing 1) app启动后 (index.xml) "before each" hook: ReferenceError: app_session is not defined
原来错误发生在 beforeEach 阶段. 说app_session 没有找到.
解决的办法, 目前看来比较奇葩: 把app/alloy.js 文件复制到 spec 文件中,再运行就可以了.
同时记得运行的命令是: (看到末尾的 --update 了么? 这样的话速度就会特别快)
$ tishadow spec -t mocha-should --platform android --update