-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
296 lines (256 loc) · 67.7 KB
/
atom.xml
File metadata and controls
296 lines (256 loc) · 67.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[JimmyLeaf的个人小站]]></title>
<link href="/atom.xml" rel="self"/>
<link href="http://yoursite.com/"/>
<updated>2015-10-20T02:28:42.000Z</updated>
<id>http://yoursite.com/</id>
<author>
<name><![CDATA[JimmyLeaf]]></name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title><![CDATA[最近的小事]]></title>
<link href="http://yoursite.com/2015/10/20/%E6%9C%80%E8%BF%91%E7%9A%84%E5%B0%8F%E4%BA%8B/"/>
<id>http://yoursite.com/2015/10/20/最近的小事/</id>
<published>2015-10-20T01:30:16.000Z</published>
<updated>2015-10-20T02:28:42.000Z</updated>
<content type="html"><![CDATA[<h2 id="一、炉石传说大圆满">一、炉石传说大圆满</h2><p>上个月终于冲上了一次传说,想想从13年底封测开始玩的,也快两年了,炉石传说终于也圆满了(天梯上传说&竞技场12胜),到这个月就不怎么想玩这游戏了,想来是因为没有目标了,也就没有动力了。现在唯一的乐趣就剩下和朋友切磋,指导新人入坑了。。</p>
<h2 id="二、_工作越来越没成就感了">二、 工作越来越没成就感了</h2><p>重复着做之前已经做过的东西,不过是换了家公司再重新做了一遍,对现在的工作没有什么热情了,目前只想自己学一些东西,做一些能帮到别人的事,不知道为什么,每次别人因为你做的事由衷感谢你得时候,都觉得心里很舒服。目前也就只能靠这点活着了。</p>
<h2 id="三、看球_&_dota_&_琅琊榜">三、看球 & dota & 琅琊榜</h2><p>如果有人问我最近晚上空闲的时间都是怎么打发的,我只能回答看球,看剧,打dota(不是豆豆)。像是找回了大学时候的样子,每天晚上跟一帮朋友语音开黑,赢了一起开心,输了一起沮丧。有恒大比赛的时候,就拿杯饮料,悠闲的躺在沙发上看球。每天晚上12点追今天更新的琅琊榜。可是最近琅琊榜已经完结了,dota也因为公司的mac拿去标准了,导致不能切换到windows系统了,球赛也不是天天都有的,现在晚上的时间好难打发啊。</p>
<h2 id="四、她">四、她</h2><p>她是喜欢的她。最近和她聊的越来越少了,我也不知道为什么,感觉好像关系突然降温了下来,每天晚上想找机会和她多聊聊,要么在看书,要么不知道在做什么。好像也没有什么话题可聊了,我也搞不懂这种忽远忽近的关系是闹哪样。我是不是应该把我心里想得都告诉她呢?是不是应该去表白,至少让她知道我是一直一直喜欢她得。哎,好烦。</p>
]]></content>
<summary type="html">
<![CDATA[<h2 id="一、炉石传说大圆满">一、炉石传说大圆满</h2><p>上个月终于冲上了一次传说,想想从13年底封测开始玩的,也快两年了,炉石传说终于也圆满了(天梯上传说&竞技场12胜),到这个月就不怎么想玩这游戏了,想来是因为没有目标了,也就没有动力了。现在唯一的乐趣就]]>
</summary>
<category term="随笔" scheme="http://yoursite.com/tags/%E9%9A%8F%E7%AC%94/"/>
</entry>
<entry>
<title><![CDATA[jenkins小技巧]]></title>
<link href="http://yoursite.com/2015/09/23/jenkins%E5%B0%8F%E6%8A%80%E5%B7%A7/"/>
<id>http://yoursite.com/2015/09/23/jenkins小技巧/</id>
<published>2015-09-23T05:56:20.000Z</published>
<updated>2015-10-20T01:26:28.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>这周接到一个新的需求,开发说能不能通过他们svn ci的log信息来定制jenkins的构建<br>其实也就是,他们提交代码的时候附带log,如果写上[jenkins:xxx],就触发打包,否则本次构建就不执行操作</p>
<h3 id="实现原理">实现原理</h3><ol>
<li>首先jenkins,是可以配置去轮询svn有没有新的代码提交的,配置方法是,在构建触发器-Poll SCM中输入 <em>/x </em> <em> </em> * 表示x分钟去查询一次有没有代码变动,这里的配置方法类似于linux的定时任务命令contrab的配置,具体请百度</li>
<li>其次如果代码有提交,jenkins查询到是会触发一次新的构建,新的构建在job/builds/{BUILD_NUMBER}/changelog.xml 是保存了代码变动信息的,包括svn check log,说明一下,{BUILD_NUMBER}是jenkins的默认环境变量,代表本次构建的构建号,可以运用于Execute shell等构建项下,当然还有其他很多变量,请自行百度,这里不做详细介绍</li>
<li>根据相应的正则表达式,就能在对应changelog.xml里找到对应格式的信息,在本实例是要获取xxx的值,方便后续打包使用,具体情况这里可以变通</li>
</ol>
<h3 id="具体实现">具体实现</h3><p>shell具体实现如下,在job配置构建栏,新增Execute shell<br><figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">xxx=`perl -<span class="keyword">n</span> -<span class="keyword">e</span> '/\[jenkins:(.*)$\]/ && <span class="keyword">print</span> <span class="string">"$1"</span>' ../builds/<span class="label">${BUILD_NUMBER}</span>/changelog.xml`</span><br></pre></td></tr></table></figure></p>
<p>通过上面一句就能获取到xxx,如果开发提交的svn check log没有类似格式的信息,就停止这次构建,这样就达到了开发控制job走向的功能<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [ ! <span class="variable">${xxx}</span> ]; <span class="keyword">then</span> </span><br><span class="line"><span class="built_in">echo</span> <span class="string">"停止构建!!"</span></span><br><span class="line"><span class="built_in">exit</span> <span class="number">0</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure></p>
<h3 id="总结">总结</h3><p>整体方法就是如上所述,通过这种方法,开发通过svn提交代码时候附带的check log 信息,就能控制jenkins job的走向,比如如果一份svn地址有多个项目工程的情况下,可以选择对哪一个进行打包之类的操作。<br>如果你还有更好的方法,欢迎讨论~</p>
<p>-The End-</p>
]]></content>
<summary type="html">
<![CDATA[<h2 id="前言">前言</h2><p>这周接到一个新的需求,开发说能不能通过他们svn ci的log信息来定制jenkins的构建<br>其实也就是,他们提交代码的时候附带log,如果写上[jenkins:xxx],就触发打包,否则本次构建就不执行操作</p>
<h3 id]]>
</summary>
<category term="jenkins" scheme="http://yoursite.com/tags/jenkins/"/>
</entry>
<entry>
<title><![CDATA[使用symbolicatecrash分析ios crash文件]]></title>
<link href="http://yoursite.com/2015/09/11/%E4%BD%BF%E7%94%A8symbolicatecrash%E5%88%86%E6%9E%90ios-crash%E6%96%87%E4%BB%B6/"/>
<id>http://yoursite.com/2015/09/11/使用symbolicatecrash分析ios-crash文件/</id>
<published>2015-09-11T06:08:56.000Z</published>
<updated>2015-09-11T06:27:48.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>测试人员和ios开发都得掌握的一项技能就是把ios设备原始的crash文件解析成能读懂的crash<br>为此就需要用到symbolicatecrash这一个工具,通过这个工具和报crash对应包得符号表文件就可以做到</p>
<h4 id="找到工具所在路径">找到工具所在路径</h4><p>在终端中输入命令搜索:<br><figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">find /Applications/Xcode.<span class="keyword">app</span> -name symbolicatecrash -<span class="keyword">type</span> <span class="literal">f</span></span><br></pre></td></tr></table></figure></p>
<p>比如我自己的就放在:<br><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="regexp">/Applications/</span>Xcode.app<span class="regexp">/Contents/</span>SharedFrameworks<span class="regexp">/DTDeviceKitBase.framework/</span>Versions<span class="regexp">/A/</span>Resources<span class="regexp">/symbolicatecrash</span></span><br></pre></td></tr></table></figure></p>
<p>可以把这个工具拷贝在常用目录,也可以配置软链接指向这个路径<br><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ln -s <span class="regexp">/Applications/</span>Xcode.app<span class="regexp">/Contents/</span>SharedFrameworks<span class="regexp">/DTDeviceKitBase.framework/</span>Versions<span class="regexp">/A/</span>Resources<span class="regexp">/symbolicatecrash /u</span>sr<span class="regexp">/local/</span>bin<span class="regexp">/symbolicatecrash</span></span><br></pre></td></tr></table></figure></p>
<p>之后就可以直接输入symbolicatecrash 使用了</p>
<h4 id="执行解析">执行解析</h4><p>执行前有几个前置条件:</p>
<ul>
<li>对应crash的原始文件,可以通过xcode从手机的device log导出</li>
<li>对应安装包得符号表文件,XXXX.dSYM</li>
<li>配置DEVELOPER_DIR,执行命令前export DEVELOPER_DIR=”/Applications/Xcode.app/Contents/Developer” 或者配置到~/.bash_profile 再执行 source ~/.bash_profile<br>执行命令:<figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">symbolicatecrash xxxx<span class="class">.crash</span> XXXX<span class="class">.dSYM</span> > yyyy.crash</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>这时候得到的yyyy.crash就是经过解析后的crash文件</p>
]]></content>
<summary type="html">
<![CDATA[<h2 id="前言">前言</h2><p>测试人员和ios开发都得掌握的一项技能就是把ios设备原始的crash文件解析成能读懂的crash<br>为此就需要用到symbolicatecrash这一个工具,通过这个工具和报crash对应包得符号表文件就可以做到</p>
<h4 ]]>
</summary>
<category term="ios" scheme="http://yoursite.com/tags/ios/"/>
</entry>
<entry>
<title><![CDATA[Apache配置rewrite规则-实例记录]]></title>
<link href="http://yoursite.com/2015/09/06/Apache%E9%85%8D%E7%BD%AErewrite%E8%A7%84%E5%88%99-%E5%AE%9E%E4%BE%8B%E8%AE%B0%E5%BD%95/"/>
<id>http://yoursite.com/2015/09/06/Apache配置rewrite规则-实例记录/</id>
<published>2015-09-06T09:00:08.000Z</published>
<updated>2015-09-06T09:19:44.000Z</updated>
<content type="html"><![CDATA[<h3 id="需求描述">需求描述</h3><p>今天遇到一个需求,大概是这样子的,配置apache服务器的一个rewrite规则<br>目的是把类似请求 <a href="http://www.baidu.com/xxx/aaa/bbb/数字/ccc/ddd?eee=fff&ggg=hhh" target="_blank" rel="external">http://www.baidu.com/xxx/aaa/bbb/数字/ccc/ddd?eee=fff&ggg=hhh</a> 这种类型的url<br>重定向成 <a href="http://www.baidu.com/xxx/aaa.php?pid=数字&url='/ccc/ddd" target="_blank" rel="external">http://www.baidu.com/xxx/aaa.php?pid=数字&url='/ccc/ddd</a>‘ 的请求<br>ddd后面的参数也要再aaa.php 通过$_SERVER[‘QUERY_STRING’]获取</p>
<h3 id="实际配置">实际配置</h3><ul>
<li>打开apache http.conf 把对应文件目录的配置打开,添加如下内容<figure class="highlight mathematica"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><<span class="keyword">Directory</span> <span class="string">"xxx"</span>></span><br><span class="line"> AllowOverride <span class="keyword">All</span></span><br><span class="line"></<span class="keyword">Directory</span>></span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>打开rewrite模块 LoadModule rewrite_module modules/mod_rewrite.so</p>
<p>重启apache后生效</p>
<ul>
<li>在对应目录xxx新建/修改.htaccess文件<br>输入如下内容<figure class="highlight xquery"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">RewriteEngine On</span><br><span class="line">RewriteBase /xxx</span><br><span class="line"></span><br><span class="line">RewriteRule ^aaa/bbb/([<span class="number">0</span>-<span class="number">9</span>]+)/(.+)$ aaa.php?bbb=<span class="variable">$1</span>&url=<span class="variable">$2</span> [QSA]</span><br></pre></td></tr></table></figure>
</li>
</ul>
<p>对应正则表达式解释,请自行百度<br>重点是后面[QSA]配置</p>
<p>在apache rewrite文档里面有一段介绍[QSA]参数,专门用来传递?后的请求参数到实际地址。<a href="http://httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa" target="_blank" rel="external">apache文档</a></p>
<blockquote>
<p>When the replacement URI contains a query string, the default behavior of RewriteRule is to discard the existing query string, and replace it with the newly generated one. Using the [QSA] flag causes the query strings to be combined.</p>
</blockquote>
<p>Consider the following rule:</p>
<figure class="highlight xquery"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">RewriteRule /pages/(.+) /page.php?page=<span class="variable">$1</span> [QSA]</span><br></pre></td></tr></table></figure>
<blockquote>
<p>With the [QSA] flag, a request for /pages/123?one=two will be mapped to /page.php?page=123&one=two. Without the [QSA] flag, that same request will be mapped to/page.php?page=123 - that is, the existing query string will be discarded.</p>
</blockquote>
<p>要想再aaa.php,通过$_SERVER[‘QUERY_STRING’]能获取到ddd后面的参数则必须加上[QSA]参数</p>
<h3 id="参考文档:">参考文档:</h3><p><a href="http://www.cnblogs.com/ainiaa/archive/2011/11/14/2248673.html" target="_blank" rel="external">http://www.cnblogs.com/ainiaa/archive/2011/11/14/2248673.html</a><br><a href="http://httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa" target="_blank" rel="external">http://httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa</a></p>
]]></content>
<summary type="html">
<![CDATA[<h3 id="需求描述">需求描述</h3><p>今天遇到一个需求,大概是这样子的,配置apache服务器的一个rewrite规则<br>目的是把类似请求 <a href="http://www.baidu.com/xxx/aaa/bbb/数字/ccc/ddd?eee=fff&]]>
</summary>
<category term="apache" scheme="http://yoursite.com/tags/apache/"/>
</entry>
<entry>
<title><![CDATA[搬家随笔]]></title>
<link href="http://yoursite.com/2015/08/31/%E6%90%AC%E5%AE%B6%E9%9A%8F%E7%AC%94/"/>
<id>http://yoursite.com/2015/08/31/搬家随笔/</id>
<published>2015-08-31T02:47:49.000Z</published>
<updated>2015-08-31T03:45:27.000Z</updated>
<content type="html"><![CDATA[<h4 id="从跟司机闲聊到互联网改造传统行业">从跟司机闲聊到互联网改造传统行业</h4><p>来深圳后第一次搬家,叫了一个小面包车,搬家师傅帮忙搬了下行李,整个过程自己没出什么力<br>一路上聊过来,和搬家师傅聊了很多,他说自己以前是在路边摆车接单的,一天顶多就一到两单,<br>现在加入了<strong>58到家速运</strong>后,虽然一单的价格比之前少了,但是量也多了,而且现在不但没有补贴,<br>还要交佣金了,虽然这样,他还是觉得这是一个趋势,而且现在也比以前赚得多了,就是量多了,<br>也就累了一点,不过觉得自己还年轻,接多几单也没问题。<br>看得出来互联网介入了很多传统行业,也改变了很多人得生活方式,<br>至少个人觉得出行方面比之前只能苦逼等的士,等公交,搬家要车只能找熟人,方便了许多</p>
<p>说着说着就聊到了深圳的房价,房租之类的,免不了要抱怨一番生活成本好高,而像搬家师傅,<br>帮我把行李从四楼搬下再搬上四楼,也才收小费30,一趟路费加搬运费算下来也不过100块钱,<br>顿时觉得赚钱不易,且花且珍惜啊</p>
<p>–众生皆苦–</p>
]]></content>
<summary type="html">
<![CDATA[<h4 id="从跟司机闲聊到互联网改造传统行业">从跟司机闲聊到互联网改造传统行业</h4><p>来深圳后第一次搬家,叫了一个小面包车,搬家师傅帮忙搬了下行李,整个过程自己没出什么力<br>一路上聊过来,和搬家师傅聊了很多,他说自己以前是在路边摆车接单的,一天顶多就一到两单,<]]>
</summary>
<category term="随笔" scheme="http://yoursite.com/tags/%E9%9A%8F%E7%AC%94/"/>
</entry>
<entry>
<title><![CDATA[IOS 测试自动化框架——smallapple]]></title>
<link href="http://yoursite.com/2015/08/28/IOS-%E6%B5%8B%E8%AF%95%E8%87%AA%E5%8A%A8%E5%8C%96%E6%A1%86%E6%9E%B6%E2%80%94%E2%80%94smallapple/"/>
<id>http://yoursite.com/2015/08/28/IOS-测试自动化框架——smallapple/</id>
<published>2015-08-28T09:42:04.000Z</published>
<updated>2015-08-31T02:30:34.000Z</updated>
<content type="html"><![CDATA[<h1 id="smallapple简介">smallapple简介</h1><h2 id="下载地址">下载地址</h2><p><a href="https://github.com/jimmyleaf/smallapple" target="_blank" rel="external">github</a></p>
<h2 id="介绍">介绍</h2><p>Smallapple是一个开源的IOS自动化测试工具,旨在提供一套完整的IOS自动化测试解决方案,提供针对IOS App的功能和性能测试,同时提供类似Android adb、重签名、instruments结果解析、录制回放等工具集。</p>
<p>Smallapple通过一键式的执行方式,自动完成App重签名、安装、测试、性能采集(包括CPU、内存、流量等)、Crash检测和结果报告等工作。</p>
<h2 id="特性">特性</h2><p>Smallapple致力于以最简单的方式,最小的代价提供给用户使用。</p>
<ul>
<li>支持非越狱设备</li>
<li>不需要依赖源码</li>
<li>支持Appstore或者第三方下载的App安装测试</li>
<li>完全的命令行模式</li>
</ul>
<p>Smallapple是基于苹果官方的instruments工具来开发,测试脚本支持原生的UI Automation,同时扩展了很多功能使得自动化测试更加便捷、易用。<br><a id="more"></a></p>
<h1 id="如何部署">如何部署</h1><h2 id="前置条件">前置条件</h2><ul>
<li>一台 MAC( macbook pro、air、iMac均可)</li>
<li>要求OSX 10.9+</li>
<li>安装 XCode 5.1+</li>
<li>确保已安装Apple Developer Tools (command line tools)</li>
<li>申请开发者证书,打发者证书的Debug包</li>
</ul>
<h1 id="快速开始">快速开始</h1><p>先查看smallapple.sh 的使用说明:<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">smallapple version <span class="operator">0.<span class="number">9.5</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">install</span> : <span class="keyword">install</span> app</span><br><span class="line"> appinfo : <span class="keyword">get</span> app infomation</span><br><span class="line"> resign : resign app</span><br><span class="line"></span><br><span class="line"> <span class="built_in">record</span> : <span class="built_in">record</span> & playback tool</span><br><span class="line"></span><br><span class="line"> automation : automation testing</span><br><span class="line"> vcheck : <span class="keyword">version</span> <span class="keyword">compatibility</span> testing</span></span><br></pre></td></tr></table></figure></p>
<p>如上图所示</p>
<ol>
<li>install app 安装对应的app,需要ipa包(开发者证书,机器加入provision)<figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sh smallapple<span class="class">.sh</span> install xxx<span class="class">.ipa</span></span><br><span class="line"></span><br><span class="line">如果不输入ipa包路径,会提示</span><br><span class="line">usage: smallapple install <.ipa/<span class="class">.app</span> path></span><br></pre></td></tr></table></figure>
</li>
</ol>
<p>2.appinfo 查找对应app包得一些信息<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">sh</span> <span class="tag">smallapple</span><span class="class">.sh</span> <span class="tag">appinfo</span> <span class="tag">xxx</span><span class="class">.ipa</span></span><br></pre></td></tr></table></figure></p>
<p>3.resign app 重签名app<br><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">sh smallapple<span class="class">.sh</span> resign</span><br><span class="line">resign [options] <.ipa/<span class="class">.app</span> path> <output path></span><br><span class="line">options:</span><br><span class="line"> -<span class="tag">p</span> <<span class="class">.mobileprovision</span> path></span><br><span class="line"> or -e <entitlement path></span><br><span class="line"> -<span class="tag">i</span> <developer identity></span><br></pre></td></tr></table></figure></p>
<p>看出来参数需要签名id和provision的path<br>使用-p指定描述文件(Provisoning Profiles),-i指定开发者证书(Certificates)</p>
<p>4.automation testing <strong>最重要的命令,进行自动化测试</strong><br><figure class="highlight nimrod"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">sh smallapple.sh automation</span><br><span class="line">usage: smallapple automation [options] <.ipa/.app path | bundle id></span><br><span class="line">options:</span><br><span class="line"> -s <device id> : specify device id. default the first found device</span><br><span class="line"> -b : use bundle id instead <span class="keyword">of</span> app path</span><br><span class="line"> -o <<span class="literal">result</span> dir> : <span class="literal">result</span> direcotry. default $<span class="type">PWD</span>/<span class="literal">result</span></span><br><span class="line"></span><br><span class="line">script options:</span><br><span class="line"> -t <<span class="keyword">template</span>> : instruments <span class="keyword">template</span>. default <span class="type">SMALLAPPLE</span>/templates/<span class="type">Automation_Monitor_CoreAnimation_Energy_Network</span>.tracetemplate</span><br><span class="line"> -c <script> : instruments automation js. default <span class="type">SMALLAPPLE</span>/scripts/<span class="type">UIAutoMonkey</span>.js</span><br><span class="line"></span><br><span class="line">resign options:</span><br><span class="line"> -p <.mobileprovision path> : .mobileprovision path</span><br><span class="line"> <span class="keyword">or</span> -e <entitlement path> : entitlement path</span><br><span class="line"> -i <developer identity> : ios developer identity</span><br><span class="line"></span><br><span class="line">crash options:</span><br><span class="line"> -d <dsym path> : dSYM path <span class="keyword">for</span> crash analyze</span><br><span class="line"></span><br><span class="line">example:</span><br><span class="line"> smallapple automation test.ipa</span><br><span class="line"> smallapple automation -b com.baidu.<span class="type">BaiduMobile</span></span><br><span class="line"> smallapple automation -c <testcase> -b com.baidu.<span class="type">BaiduMobile</span></span><br><span class="line"> smallapple automation -s <device> -p <provision> -i <identity> -c <testcase> test.ipa</span><br></pre></td></tr></table></figure></p>
<p>具体命令使用方式看上面的提示就行了,-c 执行指定js脚本,如果没有这选项,默认执行monkey脚本</p>
<h1 id="扩展">扩展</h1><p>运行完之后,如果没啥报错,在根目录下会生成一个 result文件夹,打开该文件夹下的 result.html可查看测试报告<br>大多数情况下,只需要提供一个编译好的App(.ipa or .app)即可进行自动化的测试。<br>建议每次新跑测试时将原来的result目录删除或者-o指定其它目录。</p>
<p><img src="http://img.blog.csdn.net/20150512222338484" alt="运行效果"></p>
<h3 id="通过iosutil查看已安装App,找到对应的Bundle_Id">通过iosutil查看已安装App,找到对应的Bundle Id</h3><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">bin/iosutil </span>listapp</span><br></pre></td></tr></table></figure>
<h3 id="可视化脚本录制回放">可视化脚本录制回放</h3><p>mallapple record或者直接open bin/iOSRecorder.app即可打开录制回放工具<br><figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">sh</span> smallapple.<span class="keyword">sh</span> record</span><br></pre></td></tr></table></figure></p>
<h3 id="覆盖安装测试">覆盖安装测试</h3><p>bin/iosutil可以查看指定App的数据文件,并且可以将App的Documents和Library目录下文件拷贝到Mac机进行旧版本数据的备份,或者将Mac机文件还原上传到这2个目录下。</p>
<p>查看com.baidu.BaiduMobile的Documents目录<br><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bin/iosutil ls -<span class="tag">b</span> com<span class="class">.baidu</span><span class="class">.BaiduMobile</span> /Documents</span><br></pre></td></tr></table></figure></p>
<p>备份com.baidu.BaiduMobile的Documents目录下data文件<br><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bin/iosutil pull -<span class="tag">b</span> com<span class="class">.baidu</span><span class="class">.BaiduMobile</span> /Documents/data ./backup</span><br></pre></td></tr></table></figure></p>
<p>完成新版本安装后,还原com.baidu.BaiduMobile的Documents目录下data文件<br><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">bin/iosutil </span><span class="keyword">push </span>-<span class="keyword">b </span>com.<span class="keyword">baidu.BaiduMobile </span>./<span class="keyword">backup/data </span>/Documents</span><br></pre></td></tr></table></figure></p>
<p>—-THE END—</p>
]]></content>
<summary type="html">
<![CDATA[<h1 id="smallapple简介">smallapple简介</h1><h2 id="下载地址">下载地址</h2><p><a href="https://github.com/jimmyleaf/smallapple">github</a></p>
<h2 id="介绍">介绍</h2><p>Smallapple是一个开源的IOS自动化测试工具,旨在提供一套完整的IOS自动化测试解决方案,提供针对IOS App的功能和性能测试,同时提供类似Android adb、重签名、instruments结果解析、录制回放等工具集。</p>
<p>Smallapple通过一键式的执行方式,自动完成App重签名、安装、测试、性能采集(包括CPU、内存、流量等)、Crash检测和结果报告等工作。</p>
<h2 id="特性">特性</h2><p>Smallapple致力于以最简单的方式,最小的代价提供给用户使用。</p>
<ul>
<li>支持非越狱设备</li>
<li>不需要依赖源码</li>
<li>支持Appstore或者第三方下载的App安装测试</li>
<li>完全的命令行模式</li>
</ul>
<p>Smallapple是基于苹果官方的instruments工具来开发,测试脚本支持原生的UI Automation,同时扩展了很多功能使得自动化测试更加便捷、易用。<br>]]>
</summary>
<category term="ios" scheme="http://yoursite.com/tags/ios/"/>
<category term="测试" scheme="http://yoursite.com/tags/%E6%B5%8B%E8%AF%95/"/>
</entry>
<entry>
<title><![CDATA[如何进行ios稳定性测试]]></title>
<link href="http://yoursite.com/2015/08/28/%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8Cios%E7%A8%B3%E5%AE%9A%E6%80%A7%E6%B5%8B%E8%AF%95/"/>
<id>http://yoursite.com/2015/08/28/如何进行ios稳定性测试/</id>
<published>2015-08-28T03:09:57.000Z</published>
<updated>2015-08-28T03:30:29.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>稳定性测试一直是app测试的重点,保证app较低的crash率即能提高用户的使用体验,也是大部人kpi得一部分<br>下面的monkey测试脚本,转自之前的一个同事,也是我一直在用来跑monkey得<br>可以直接运行再instrument工具中,也可以使用命令instruments来启动<br><a id="more"></a><br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">iOSMonkey2</span>(<span class="params"></span>)</span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>.elementArray = <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._addToArray = <span class="function"><span class="keyword">function</span>(<span class="params">root,len</span>)</span>{</span><br><span class="line"> <span class="keyword">var</span> rootname = root.name()+<span class="string">""</span></span><br><span class="line"> rootname = rootname.toLowerCase();</span><br><span class="line"> <span class="keyword">if</span>( !<span class="keyword">this</span>._isIndicator(root) && root.toString() != <span class="string">"[object UIAKey]"</span> && rootname.match(<span class="string">"notap"</span>+<span class="string">"$"</span>) !=<span class="string">"notap"</span> ){</span><br><span class="line"> <span class="keyword">if</span>(root.isEnabled() && root.isVisible()){</span><br><span class="line"> <span class="keyword">if</span>(len==<span class="number">0</span>){</span><br><span class="line"> <span class="keyword">if</span>(root.hitpoint() != <span class="literal">null</span>){</span><br><span class="line"> <span class="keyword">var</span> rect = root.hitpoint();</span><br><span class="line"> <span class="keyword">if</span>(rect.y><span class="number">20</span>){</span><br><span class="line"> <span class="keyword">this</span>.elementArray.push(root);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(<span class="keyword">this</span>._toFlick(root) || <span class="keyword">this</span>._toType(root)){</span><br><span class="line"> <span class="keyword">this</span>.elementArray.push(root);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._iterator = <span class="function"><span class="keyword">function</span>(<span class="params">root</span>)</span>{</span><br><span class="line"> <span class="keyword">var</span> eleArray = <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">if</span>(root.toString() !=<span class="string">"[object UIAWebView]"</span> && root.toString() != <span class="string">"[object UIAKeyboard]"</span>){</span><br><span class="line"> eleArray = root.elements();</span><br><span class="line"> <span class="keyword">this</span>._addToArray(root,eleArray.length);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span>(eleArray.length != <span class="number">0</span> && eleArray != <span class="literal">null</span>){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i = <span class="number">0</span>; i< eleArray.length; i++){</span><br><span class="line"> <span class="keyword">this</span>._iterator(eleArray[i]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._isIndicator = <span class="function"><span class="keyword">function</span>(<span class="params">element</span>)</span>{</span><br><span class="line"> <span class="keyword">return</span> element.toString().match(<span class="string">"Indicator"</span>+<span class="string">"$"</span>)==<span class="string">"Indicator"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._findIndicator = <span class="function"><span class="keyword">function</span>(<span class="params">root</span>)</span>{</span><br><span class="line"> <span class="keyword">var</span> elements = root.elements();</span><br><span class="line"> <span class="keyword">if</span>(elements.length !=<span class="number">0</span> && elements != <span class="literal">null</span>){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i =<span class="number">0</span>; i<elements.length;i++){</span><br><span class="line"> <span class="keyword">if</span>(<span class="keyword">this</span>._isIndicator(elements[i])){</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">this</span>._findIndicator(elements[i]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._getAllElements = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{</span><br><span class="line"> <span class="keyword">var</span> app = UIATarget.localTarget().frontMostApp();</span><br><span class="line"> <span class="keyword">this</span>.elementArray = <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">this</span>.elementArray = <span class="keyword">new</span> <span class="built_in">Array</span>();</span><br><span class="line"> <span class="keyword">this</span>._iterator(app);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._getElementAncestry = <span class="function"><span class="keyword">function</span>(<span class="params">element</span>)</span>{</span><br><span class="line"> <span class="keyword">var</span> arr = element.ancestry();</span><br><span class="line"> <span class="keyword">var</span> tmp = <span class="string">""</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i = <span class="number">0</span>; i< arr.length; i++){</span><br><span class="line"> tmp += arr[i].toString()+<span class="string">"->"</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> tmp;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._selector = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{</span><br><span class="line"> <span class="keyword">this</span>._getAllElements();</span><br><span class="line"> <span class="keyword">var</span> len = <span class="keyword">this</span>.elementArray.length;</span><br><span class="line"> <span class="comment">//UIALogger.logMessage(len+"");</span></span><br><span class="line"> <span class="keyword">var</span> random = <span class="built_in">Math</span>.round(<span class="built_in">Math</span>.random() * len);</span><br><span class="line"> <span class="keyword">if</span> (random == len){</span><br><span class="line"> random = random-<span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">this</span>.elementArray[random];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._toFlick = <span class="function"><span class="keyword">function</span>(<span class="params">element</span>)</span>{</span><br><span class="line"> <span class="keyword">if</span>(element.toString()==<span class="string">"[object UIATableView]"</span> || element.toString()==<span class="string">"[object UIAScrollView]"</span> || element.toString()==<span class="string">"[object UIATableCell]"</span>){</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._toType = <span class="function"><span class="keyword">function</span>(<span class="params">element</span>)</span>{</span><br><span class="line"> <span class="keyword">if</span>(element.toString()==<span class="string">"[object UIATextField]"</span> || element.toString()==<span class="string">"[object UIASecureTextField]"</span> || element.toString()==<span class="string">"[object UIATextView]"</span>){</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._tap = <span class="function"><span class="keyword">function</span>(<span class="params">element</span>)</span>{</span><br><span class="line"> <span class="keyword">if</span>(element.toString()==<span class="string">"[object UIASwitch]"</span>){</span><br><span class="line"> <span class="keyword">if</span>(element.value() != <span class="string">""</span> && element.value() != <span class="literal">null</span>){</span><br><span class="line"> element.setValue(<span class="keyword">this</span>._falseString(element.value()));</span><br><span class="line"> }</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> <span class="keyword">var</span> x = <span class="built_in">Math</span>.random().toFixed(<span class="number">2</span>);</span><br><span class="line"> <span class="keyword">var</span> y = <span class="built_in">Math</span>.random().toFixed(<span class="number">2</span>);</span><br><span class="line"> element.tapWithOptions({tapOffset:{x:x,y:y}});</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._flick = <span class="function"><span class="keyword">function</span>(<span class="params">element</span>)</span>{</span><br><span class="line"> <span class="comment">//element.scrollToVisible();</span></span><br><span class="line"> <span class="keyword">var</span> x = <span class="built_in">Math</span>.random().toFixed(<span class="number">2</span>);</span><br><span class="line"> <span class="keyword">var</span> y = <span class="built_in">Math</span>.random().toFixed(<span class="number">2</span>);</span><br><span class="line"> element.flickInsideWithOptions({startOffset:{x:<span class="number">0.5</span>, y:<span class="number">0.5</span>}, endOffset:{x:x,y:y}});</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._getAppSize = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{</span><br><span class="line"> <span class="keyword">var</span> rect = UIATarget.localTarget().frontMostApp().rect();</span><br><span class="line"> <span class="keyword">return</span> rect;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._type = <span class="function"><span class="keyword">function</span>(<span class="params">element</span>)</span>{</span><br><span class="line"> <span class="keyword">var</span> len = <span class="built_in">Math</span>.round(<span class="built_in">Math</span>.random()*<span class="number">100</span>);</span><br><span class="line"> <span class="keyword">var</span> value = <span class="keyword">this</span>._randomChar(len);</span><br><span class="line"> element.setValue(value);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._falseString = <span class="function"><span class="keyword">function</span>(<span class="params">value</span>)</span>{</span><br><span class="line"> <span class="keyword">if</span>(value==<span class="string">"0"</span>){</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"1"</span>;</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"0"</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>._randomChar = <span class="function"><span class="keyword">function</span>(<span class="params">len</span>)</span>{</span><br><span class="line"> <span class="keyword">var</span> x=<span class="string">"0123456789qwertyuioplkjhgfdsazxcvbnm"</span>;</span><br><span class="line"> <span class="keyword">var</span> tmp=<span class="string">""</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i = <span class="number">0</span>;i < len;i++){</span><br><span class="line"> tmp += x.charAt(<span class="built_in">Math</span>.ceil(<span class="built_in">Math</span>.random()*<span class="number">100000000</span>)%x.length);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> tmp;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>.operator = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{</span><br><span class="line"> <span class="keyword">var</span> element = <span class="keyword">this</span>._selector();</span><br><span class="line"> UIALogger.logMessage(<span class="string">"本次操作的对象的类型是:"</span>+element.toString());</span><br><span class="line"> <span class="keyword">var</span> ancestry = <span class="keyword">this</span>. _getElementAncestry(element);</span><br><span class="line"> UIALogger.logMessage(ancestry+element.toString()+<span class="string">"->name:"</span>+element.name());</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">this</span>._toFlick(element)){</span><br><span class="line"> <span class="keyword">this</span>._flick(element);</span><br><span class="line"> }<span class="keyword">else</span> <span class="keyword">if</span>(<span class="keyword">this</span>._toType(element)){</span><br><span class="line"> <span class="keyword">this</span>._type(element);</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> <span class="keyword">if</span>(element.hitpoint() != <span class="literal">null</span>){</span><br><span class="line"> <span class="keyword">this</span>._tap(element);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>.screenShoot = <span class="function"><span class="keyword">function</span>(<span class="params">imageName</span>)</span>{</span><br><span class="line"> <span class="keyword">var</span> target = UIATarget.localTarget();</span><br><span class="line"> <span class="keyword">var</span> app = target.frontMostApp();</span><br><span class="line"> target.captureRectWithName(target.frontMostApp().rect(),imageName);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">this</span>.waitForLoad = <span class="function"><span class="keyword">function</span>(<span class="params">preDelay</span>) </span>{ </span><br><span class="line"> <span class="keyword">var</span> target = UIATarget.localTarget();</span><br><span class="line"> <span class="keyword">if</span> (!preDelay) {</span><br><span class="line"> target.delay(<span class="number">0</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> target.delay(preDelay);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> done = <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">var</span> counter = <span class="number">0</span>; </span><br><span class="line"> <span class="keyword">while</span> ((!done) && (counter < <span class="number">60</span>)) {</span><br><span class="line"> <span class="keyword">var</span> progressIndicator = UIATarget.localTarget().frontMostApp().windows()[<span class="number">0</span>].activityIndicators()[<span class="number">0</span>];</span><br><span class="line"> <span class="keyword">var</span> indicator = <span class="keyword">this</span>._findIndicator(UIATarget.localTarget().frontMostApp());</span><br><span class="line"> <span class="keyword">if</span> (indicator == <span class="number">1</span>) {</span><br><span class="line"> UIALogger.logMessage(<span class="string">"来到这里等待一下"</span>)</span><br><span class="line"> target.delay(<span class="number">0.5</span>);</span><br><span class="line"> counter++; </span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> done = <span class="literal">true</span>; </span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> target.delay(<span class="number">0.5</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">mon = <span class="keyword">new</span> iOSMonkey2();</span><br><span class="line">UIATarget.localTarget().setTimeout(<span class="number">0</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">var</span> i = <span class="number">0</span>; i< <span class="number">1000</span>; i++){</span><br><span class="line"> <span class="keyword">try</span>{</span><br><span class="line"> mon.operator();</span><br><span class="line"> }<span class="keyword">catch</span>(err){</span><br><span class="line"> UIALogger.logMessage(<span class="string">"这里有一个异常"</span>);</span><br><span class="line"> UIALogger.logMessage(err.toString()+<span class="string">""</span>);</span><br><span class="line"> }</span><br><span class="line"> mon.screenShoot(<span class="string">"test"</span>);</span><br><span class="line"> mon.waitForLoad(<span class="number">1</span>);</span><br><span class="line"> <span class="comment">//UIATarget.localTarget().delay(2);</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>在 Instruments中直接运行,连接真机时,在 xcode=>device中查看 crashlog。运行在模拟器时,在 控制台.app下查看 crashlogs.</p>
<p>另外,还需要考虑一些临界条件下的稳定性测试:<br>1.频繁收到内存警告时;<br>2.电池电量低;<br>3.3G网络不稳定时;</p>
]]></content>
<summary type="html">
<![CDATA[<h2 id="前言">前言</h2><p>稳定性测试一直是app测试的重点,保证app较低的crash率即能提高用户的使用体验,也是大部人kpi得一部分<br>下面的monkey测试脚本,转自之前的一个同事,也是我一直在用来跑monkey得<br>可以直接运行再instrument工具中,也可以使用命令instruments来启动<br>]]>
</summary>
<category term="ios" scheme="http://yoursite.com/tags/ios/"/>
<category term="测试" scheme="http://yoursite.com/tags/%E6%B5%8B%E8%AF%95/"/>
</entry>
<entry>
<title><![CDATA[PHP CURL单独获取http状态码]]></title>
<link href="http://yoursite.com/2015/08/24/PHP-CURL%E5%8D%95%E7%8B%AC%E8%8E%B7%E5%8F%96http%E7%8A%B6%E6%80%81%E7%A0%81/"/>
<id>http://yoursite.com/2015/08/24/PHP-CURL单独获取http状态码/</id>
<published>2015-08-24T07:18:00.000Z</published>
<updated>2015-08-28T03:25:50.000Z</updated>
<content type="html"><![CDATA[<h2 id="前言">前言</h2><p>PHP使用CURL能获取访问某URL返回的html的头信息,body信息等,下面讲述的是从返回的头信息单独获取状态码的方法</p>
<h2 id="实例">实例</h2><p>直接贴核心代码<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*模拟浏览器*/</span></span><br><span class="line"><span class="variable">$user_agent</span> = <span class="string">"Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"</span>;</span><br><span class="line"><span class="comment">//初始化</span></span><br><span class="line"><span class="variable">$ch</span> = curl_init();</span><br><span class="line">curl_setopt(<span class="variable">$ch</span>,CURLOPT_HEADER,<span class="number">1</span>);<span class="comment">//获取http头信息</span></span><br><span class="line">curl_setopt(<span class="variable">$ch</span>,CURLOPT_NOBODY,<span class="number">1</span>);<span class="comment">//不返回html的body信息</span></span><br><span class="line">curl_setopt(<span class="variable">$ch</span>,CURLOPT_TIMEOUT,<span class="number">30</span>); <span class="comment">//超时时长,单位秒</span></span><br><span class="line">curl_setopt (<span class="variable">$ch</span>, CURLOPT_USERAGENT, <span class="variable">$user_agent</span> ); <span class="comment">// 模拟用户使用的浏览器</span></span><br><span class="line">curl_setopt(<span class="variable">$ch</span>, CURLOPT_REFERER, <span class="string">"http://www.baidu.com/search/spider.html"</span>);<span class="comment">//模拟百度爬虫获取,防止被禁</span></span><br><span class="line">curl_setopt(<span class="variable">$ch</span>, CURLOPT_URL, <span class="variable">$url</span>);<span class="comment">//$url代表你要请求的链接</span></span><br><span class="line">curl_setopt(<span class="variable">$ch</span>, CURLOPT_RETURNTRANSFER, <span class="number">1</span>);<span class="comment">//返回值,而不是直接输出</span></span><br><span class="line">curl_setopt(<span class="variable">$ch</span>, CURLOPT_CUSTOMREQUEST, <span class="string">'GET'</span>);<span class="comment">//设置请求方式GET</span></span><br><span class="line"><span class="comment">//执行并获取HTML文档内容</span></span><br><span class="line">curl_exec(<span class="variable">$ch</span>);</span><br><span class="line"><span class="variable">$http_code</span> = strval(curl_getinfo(<span class="variable">$ch</span>,CURLINFO_HTTP_CODE));<span class="comment">//单独获取http状态码;</span></span><br><span class="line">var_dump(<span class="variable">$http_code</span>);<span class="comment">//输出http状态码</span></span><br><span class="line"><span class="comment">//释放curl句柄</span></span><br><span class="line">curl_close(<span class="variable">$ch</span>);</span><br></pre></td></tr></table></figure></p>
<h2 id="后记">后记</h2><p>PHP结合CURL还能做到很多事,待研究,在此记录</p>
]]></content>
<summary type="html">
<![CDATA[<h2 id="前言">前言</h2><p>PHP使用CURL能获取访问某URL返回的html的头信息,body信息等,下面讲述的是从返回的头信息单独获取状态码的方法</p>
<h2 id="实例">实例</h2><p>直接贴核心代码<br><figure class="high]]>
</summary>
<category term="CURL" scheme="http://yoursite.com/tags/CURL/"/>
<category term="PHP" scheme="http://yoursite.com/tags/PHP/"/>
</entry>
<entry>
<title><![CDATA[七夕节随笔]]></title>
<link href="http://yoursite.com/2015/08/21/%E4%B8%83%E5%A4%95%E8%8A%82%E9%9A%8F%E7%AC%94/"/>
<id>http://yoursite.com/2015/08/21/七夕节随笔/</id>
<published>2015-08-20T16:23:17.000Z</published>
<updated>2015-08-20T16:36:31.000Z</updated>
<content type="html"><![CDATA[<p>哪里有人会喜欢寂寞,只不过是不想失望罢了<br>不知道自己一个人过了多少个光棍节,情人节,七夕。。。<br>自从毕业以来,好像就把自己的交友圈封闭了,除了职场圈和之前的朋友,就没有兴趣,也没有精力去发展新的朋友了<br>所以才会一直单身到现在吧(不过是自己给自己找个理由罢了)</p>
<p>也是,何必去羡慕他人晒出来的幸福,只要心里装着一个喜欢的人就够了<br>而刚好,我心里装着一个<br>好像喜欢很多年了,一直不敢表白,怕失去,怕被拒绝,什么都怕,胆小如鼠<br>是时候勇敢往前踏一步了,就算前方是悬崖又如何<br>加油!少年<br>晚安~</p>
]]></content>
<summary type="html">
<![CDATA[<p>哪里有人会喜欢寂寞,只不过是不想失望罢了<br>不知道自己一个人过了多少个光棍节,情人节,七夕。。。<br>自从毕业以来,好像就把自己的交友圈封闭了,除了职场圈和之前的朋友,就没有兴趣,也没有精力去发展新的朋友了<br>所以才会一直单身到现在吧(不过是自己给自己找个理由罢了]]>
</summary>
<category term="心情记录" scheme="http://yoursite.com/tags/%E5%BF%83%E6%83%85%E8%AE%B0%E5%BD%95/"/>
<category term="随笔" scheme="http://yoursite.com/tags/%E9%9A%8F%E7%AC%94/"/>
</entry>
<entry>
<title><![CDATA[Hello World]]></title>
<link href="http://yoursite.com/2015/08/19/hello-world/"/>
<id>http://yoursite.com/2015/08/19/hello-world/</id>
<published>2015-08-19T02:09:06.000Z</published>
<updated>2015-08-19T02:09:06.000Z</updated>
<content type="html"><![CDATA[<p>Welcome to <a href="http://hexo.io/" target="_blank" rel="external">Hexo</a>! This is your very first post. Check <a href="http://hexo.io/docs/" target="_blank" rel="external">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="http://hexo.io/docs/troubleshooting.html" target="_blank" rel="external">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="external">GitHub</a>.</p>
<h2 id="Quick_Start">Quick Start</h2><h3 id="Create_a_new_post">Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure>
<p>More info: <a href="http://hexo.io/docs/writing.html" target="_blank" rel="external">Writing</a></p>
<h3 id="Run_server">Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure>
<p>More info: <a href="http://hexo.io/docs/server.html" target="_blank" rel="external">Server</a></p>
<h3 id="Generate_static_files">Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure>
<p>More info: <a href="http://hexo.io/docs/generating.html" target="_blank" rel="external">Generating</a></p>
<h3 id="Deploy_to_remote_sites">Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure>
<p>More info: <a href="http://hexo.io/docs/deployment.html" target="_blank" rel="external">Deployment</a></p>
]]></content>
<summary type="html">
<![CDATA[<p>Welcome to <a href="http://hexo.io/" target="_blank" rel="external">Hexo</a>! This is your very first post. Check <a href="http://hexo.io]]>
</summary>
</entry>
</feed>