4月 07

android的monkey测试简单记录

  需要对android的一个软软件做个疲劳测试,使用android SDK自带的工具最为方便。所就开始做monkey测试,调用和回播的脚本是从网上搜集而来,自己做了小修改。原始脚本的网页url忘记记录,所以不能提供参考网连接。下面开始对我所做的简单测试做个记录。
  首先是在系统上安装java运行环境,这个比较简单。下载android SDK包,直接解压后就可以使用非常方便。
  进入android-sdk-windows/tools目录,在其下面写两个脚本。
录脚本的启动脚本名monkey_recorder.py脚本内容如下:

#!/usr/bin/env monkeyrunner
# Copyright 2010, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder

device = mr.waitForConnection()
recorder.start(device)

回放脚本名为monkey_playback.py脚本内容如下:

#!/usr/bin/env monkeyrunner
# Copyright 2010, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import sys
from com.android.monkeyrunner import MonkeyRunner

# The format of the file we are parsing is very carfeully constructed.
# Each line corresponds to a single command.  The line is split into 2
# parts with a | character.  Text to the left of the pipe denotes
# which command to run.  The text to the right of the pipe is a python
# dictionary (it can be evaled into existence) that specifies the
# arguments for the command.  In most cases, this directly maps to the
# keyword argument dictionary that could be passed to the underlying
# command. 

# Lookup table to map command strings to functions that implement that
# command.
CMD_MAP = {
    'TOUCH': lambda dev, arg: dev.touch(**arg),
    'DRAG': lambda dev, arg: dev.drag(**arg),
    'PRESS': lambda dev, arg: dev.press(**arg),
    'TYPE': lambda dev, arg: dev.type(**arg),
    'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg)
    }

# Process a single file for the specified device.
def process_file(fp, device):
    for line in fp:
        (cmd, rest) = line.split('|')
        try:
            # Parse the pydict
            rest = eval(rest)
        except:
            print 'unable to parse options'
            continue

        if cmd not in CMD_MAP:
            print 'unknown command: ' + cmd
            continue
        CMD_MAP[cmd](device, rest)
        
def go(file,num):
    n = num
    device = MonkeyRunner.waitForConnection()
    for i in range(int(n)):
        print 'now %s'%i
        fp = open(file, 'r')
        process_file(fp, device)
        fp.close();

def main():
    file = sys.argv[1]
    try :
        number = sys.argv[2]
    except :
        number = 1
    go(file,number)
 
if __name__ == '__main__':
    main()

  到此环境和脚本就算部署完了。下面开始记录脚本使用。
  首先将手机和电脑用usb线连好,使用“cmd”调出命令行,然后进入“android-sdk-windows/tools”目录。输入命令:
monkeyrunner.bat monkey_recorder.py
如果没有报错,并且出现以下界面,就可以开始录制脚本了。

  “wait”为每步操作间的等待时间。“Press a Button“发送,MENU,HOME,or SEARCH 按钮。“Type Something”为输入文字。“Fling”为模拟滑动操作。“Export Actions”为保存刚才录制的脚本。最后一个为刷新。   
  保存的脚本可以直接用文本编辑器手动编辑。假如我们录制的脚本为text.txt。下一步就是回放脚本,使用命令为:
monkeyrunner.bat monkey_playback.py test.txt 100
  最后的数字是将这个脚本循环100次。
  我只需要到此即可了。如果需要抓图片\照相\判断等高级功能,将来需要时再学习。

4月 01

C、go、python、java、php和node.js 简单循环累加运算速度测试

【张子萌 www.simonzhang.net 2012-4-1】
【张子萌 www.simonzhang.net 2012-8-8 修改增加go语言】

之前简单做了一下node.js和python的“hello ***”的页面测试,也做了循环的测试,本次主要是增加了java的语言,go语言。主要是想看一下主流四种脚本的速度java、python、php、c语言。均使用for循环进行简单的累加测试。个人技能有限所以只做了简单测试做参考。

实验环境使用linux 64位服务器,操作系统为contos 5.4,php版本5.1.6,python版本为2.6.6,node.js版本为0.4.12,java版本为1.6.0_03,gcc 版本 4.1.2 2008070,go语言为1.0.2。
一、脚本编写
php脚本
# cat test.php

python脚本
# cat test.py

#!/bin/env python
#-*- coding:utf-8 -*-
def main():
    j = 0;
    for i in xrange(10000000):
        j=j+i
    print j

if __name__=="__main__":
    main()

node.js脚本
# cat test.js

var j=0;
for (i = 0; i < 10000000; i++ ) {
   j=j+i
}
    console.log(j);

Java代码:
# cat Test.java

public class Test {
public static void main(String[] args) {
          long n = 0;
          for (int i = 0; i < 10000; i++) {
               n=n+i;
          }
          System.out.println(n);
     }
}

C语言,使用gcc编译,编译两种结果,一种是直接编译的,一种是优化编译的。

#include 
#include 
main()
{
    long i,j=0;
    for (i=0 ; i<10000000 ; i++)
       j=j+i;
    printf("%ld\n",j);
}

go语言代码

package main

import "fmt"

func main() {
    var sum,i int64
    sum=0
    for i=0;i<10000000;i++{
        sum+=i
    }
    fmt.Printf("%d",sum)
}

二、运行结果
使用time命令对程序运行时间进行统计

以下是循环一千万次的累加测试结果。

参数 C语言直接编译 C语言优化编译 go Node.js Python PHP Java
Real 0.024s 0.001s 0.011s 0.420s 1.055s 1.429s 0.087
User 0.023s 0.000s 0.011s 0.401s 1.046s 1.423s 0.067
sys 0.001s 0.001s 0.000s 0.019s 0.009s 0.007s 0.015

以下是循环一万次的累加测试结果

参数 C语言直接编译 C语言优化编译 go Node.js Python PHP Java
Real 0.001s 0.001s 0.004s 0.090s 0.027s 0.014s 0.087
User 0.000s 0.001s 0.003s 0.080s 0.022s 0.007s 0.041
sys 0.001s 0.000s 0.002s 0.010s 0.006s 0.007s 0.017

三、结论
从简单的测试来看,c语言不是一般的快,大数据计算情况下node.js速度最快,java次之,python和php比慢。但是如果是少量计算时php效果还是很不错。但是实际应用中,还需要调用各种函数和各方面的资源,并不能以一个空框架下的for来判断。go的速度与C相当,但是编译速度还是比C要慢一点,以上的代码C编译完只有6K多,go编译完有1.3M。每种语言都会有自己擅长的一方面,速度快与慢,还与编写的技巧性有关。学好每一步,认认真真踏实的做就好了。

注:C、go和java被编译后会对代码进行优化。各自不同的编译器优化的侧重也不一样,所以这个测试有些失实。比如即使循环数再大java时间也不会有改变,估计是在编译时已经将for里的值计算完毕,运行时直接取结果。有兴趣的可以学习编译原理。

3月 30

centos 硬盘只读

       通过ftp上传文件失败。直接登录服务器查看,权限都没有问题,直接创建文件,系统也是报系统只读。
       首先卸载分区,然后扫描,结果如下:
# fsck -f /dev/sdb1
fsck 1.39 (29-May-2006)
e2fsck 1.39 (29-May-2006)
fsck.ext3: Attempt to read block from filesystem resulted in short read while trying to open /dev/sdb1
Could this be a zero-length partition?

        很奇怪怎么分区为0呀,是不是主磁道坏了,如果是就比较麻烦了,真实不应该卸载。应该先把需要的数据考出来就好了。只能尝试修复了。之前看多过相关修复的页面如下:
http://www.cyberciti.biz/tips/surviving-a-linux-filesystem-failures.html
修复前先看看,系统日志里是否有些提示,如下:
kernel: sdb: Write Protect is off
kernel: SCSI device sdb: drive cache: write back
       奇怪硬盘被写保护了。直接看看硬盘状态
fdisk -l
      没有查询到相关的硬盘信息。这个就没有办法了,系统认不到,但是全部坏掉的几率不大,因为之前还可以读出文件。重启操作系统。
硬盘又认出来了。做扫描,果然有坏块,修复完毕挂载,一切正常。有惊无险。

       通过资料查询,此种处理为保护数据,应该是比较安全的。
提醒:如果参照面页面进行处理,输入命令“hdparm -W0 /dev/sdb”关闭写缓冲区,这个我没有测试。如果要重启,分区又不是必要的要将/etc/fstab中的扫描部分停掉,以避免因为扫描失败不能进入系统。
http://www.linuxforums.org/forum/red-hat-fedora-linux/136472-possible-sata-related-system-slowdowns.html

12月 11

新服务器的硬件测试

【2011-12-09 整理人:simon-zzm@163.com】
新买的服务器安装CentOS的操作系统,需要测试服务器硬件的稳定性。如果不运行服务
空跑根本没有意义,所以使用压测软件进行测试。
本次测试使用到stress软件,网站地址如下:
http://weather.ou.edu/~apw/projects/stress/
如果是服务器没有安装操作系统也可以到以下的网站下载iso或usb基本操作系统加压力软件的
集合。网站地址如下:
www.stresslinux.org

本次只是记录使用stress的过程。
stress用C编写,可以运行在x86,ppc64和PPC 32 GNU / Linux的,Tru64的,SPARC Solaris的平台。
可以自由配置参数,对cpu、内存、IO进行测试。

软件下载、编译、测试
为了避免编译失败,建议先确认已经安装gcc编译器。
# yum -y gcc*
# wget http://weather.ou.edu/~apw/projects/stress/stress-1.0.4.tar.gz
# tar zxvf stress-1.0.4.tar.gz
# cd stress-1.0.4
# ./configure && make

至此已经编译完毕,本软件不打算安装,所以直接使用。
# cd /root/stress-1.0.4/src
# ./stress –cpu 8 –io 8 –vm 8 –vm-bytes 32000M –timeout 180s

服务器的硬件为4核双cpu,32G内存,测试180秒中。所以使用以上命令,io和vm后的8为8个
进行,vm-bytes为32G的内存。

使用感受,能将所有的硬件资源耗尽,但是如果运行时间过长,就不知道是死机还是再测试了。
更主要的是测试完毕也没有测试报告生成。

10月 11

Reids的安装、配置和初级管理

【2011-10-11 整理编辑 simon-zzm@163.com】

一、 获取和部署

# wget http://redis.googlecode.com/files/redis-2.2.12.tar.gz

# tar zxvf redis-2.2.12.tar.gz

# cd redis-2.2.12

# make

src目录下会生成可执行文件,可以使用make install 进行安装,默认安装后放在/usr/local/bin中。也可以制定存放目录make PREFIX=/some/other/directory。可执行文件的作用

redis-server 服务器的daemon启动程序

redis-check-aof 数据修复

redis-check-dump 检查导出工具

redis-cli 命令行操作工具

redis-benchmark 性能测试工具,测试Redis在你的系统及你的配置下的读写性能

直接执行redis-server,使用默认配置控制台打印。再redis-2.2.12中有redis.conf配置文件的模板,可以将配置文件放到认可位置,建议放到/etc下,使用配置文件启动redis命令如下。修改系统内核参数

# echo vm.overcommit_memory=1 >> /etc/sysctl.conf

# sysctl vm.overcommit_memory=1

使用数字含义:

0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2,表示内核允许分配超过所有物理内存和交换空间总和的内存

启动

# redis-server /etc/redis.conf

二、配置说明

配置文件主要参数说明如下(多个#为系统默认注释的配置):

daemonize no

#默认不以守护进程的方式启动,生产环境下建议改为yes

pidfile /var/run/redis.pid

#pid文件位置

port 6379

#监听端口

bind 127.0.0.1

#监听IP地址,可用于监听指定IP

unixsocket /tmp/redis.sock

#sock文件位置

timeout 60

#超时断开时间

loglevel verbose

#日志级别debugnoticeverbosewarning

logfile stdout

#日志保存位置,默认是输出到/dev/nul,既不记录日志。

# syslog-enabled no

# 开启系统日志,默认关闭

###### syslog-ident redis

######syslog-facility local0

# 日志级别从LOCAL0-LOCAL7

databases 16

#数据库个数,登陆数据库默认dbid0,可以使用select 设置。

save 900 1

save 300 10

save 60 10000

# 持久化保持 save *(秒数)*(修改次数)保存到硬盘上。全部注释掉,则不进行持久化。

rdbcompression yes

# 持快照是否要压缩

dbfilename dump.rdb

# 快照文件名称

dir ./

#快照保存位置

######slaveof

# 如果为从库需要配置主库的IP和端口,需要注意,从机如果做数据修改是不能同步到主机的

######masterauth

# 如果主数据库有密码需要在从库上设置主库的密码

###### requirepass foobared

< p>#主数据库的密码设置,如果加密了客户端连接为./redis-cli?-a foobared

slave-serve-stale-data yes

# 当主库宕机时,备机接替主库工作

######requirepass foobared

# 设置客户端登陆访问密码

maxclients 1024

# 默认客户端链接数,如果为0 则是不限制

######maxmemory 2048000000

# 使用内存大小,如果不设置为使用所有。单位为bytes

######maxmemory-policy volatile-lru

#内存用满的清理策略(lru为最近最少使用算法):

# volatile-lru:删除过期和lru key(默认值)

# allkeys-lru : 删除lru算法的key

# volatile-random:随机删除即将过期key

# allkeys->random:随机删除

# volatile-ttl : 删除即将过期的

# noeviction : 永不过期,返回错误

######maxmemory-samples 3

# 可以用ttl这只key的生存时间,此配置为用lru检查ttl时间。个人认为应该是对ttl的排序

appendonly no

# 开启操作记录日志,每此操作都会写日志,效率比较低。但是服务器宕机重启后,服务会加载日志,提高安全性。

#### appendfilename appendonly.aof

# 日志名称

appendfsync everysec

# 写日志的规则 always 时时写,everysec美秒写一次,no为不写

no-appendfsync-on-rewrite no

#没有太懂,个人理解是因为I/O效率问题,所以使用的一种类似的增量写入的方式。

slowlog-log-slower-than 10000

slowlog-max-len 1024

#像系统日志一样,记录命令的执行时间。记录周期为毫秒级(1000000毫秒=1秒)负值表示禁用,0表示记录所有命令。记录能保存的最大行数。

vm-enabled no

#虚拟内存开关

vm-swap-file /tmp/redis.swap

# 虚拟内存swap文件的位置。不同的redis服务不能共用内存文件。不推荐使用tmp目录。

vm-max-memory 0

#虚拟内存的大小,0为不限制。

vm-page-size 32

#缓存中每页的大小,默认是32个字节

vm-pages 134217728

# 虚拟内存中可以最大的页数,虚拟文件大小为vm-page-size * vm-pages。如果是32字节的页,用134217728页,会有4G大的swap文件

vm-max-threads 4

#使用虚拟内存的最大线程数

hash-max-zipmap-entries 512

hash-max-zipmap-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

set-max-intset-entries 512

activerehashing yes

#为一种高级的哈希算法。原理没有明白,也不做修改了。

#以下为可以引入其它位置的配置文件。

# include /path/to/local.conf

# include /path/to/other.conf

三、基本管理

  Redis的命令共分为十个部分,其中主要的六个部分(KeyStringHashListSetSortedSet)的翻译可以到http://redis.readthedocs.org/en/latest/中查看。本问只是记录部分管理命令。

1Select

切换库,select后直接跟阿拉伯数字的dbid

举例:

redis 127.0.0.1:6379> select 1


OK

2Dbsize

统计库中key的数量

举例:

redis 127.0.0.1:6379> dbsize

(integer) 1

3Flushdb

Redis还支持对某个DB数据进行清除(当然清空所有数据的操作也是支持的)

redis 127.0.0.1:6379> dbsize

(integer) 1

redis 127.0.0.1:6379> flushdb

OK

redis 127.0.0.1:6379> dbsize

(integer) 0

4slaveof

同步命令,在从端参输入主机的IP和端口,进行数据同步。在复制的开始阶段处于阻塞状态(sync_readline)服务无法对外提供服务。

5Slowlog

获得slowlog日志中最近的2条记录

redis 127.0.0.1:6379> slowlog get 2

1) 1) (integer) 6

2) (integer) 1318257654

3) (integer) 19244

4) 1) “rpush”

2) “b”

3) “z”

2) 1) (integer) 5

2) (integer) 1318256413

3) (integer) 42203

4) 1) “keys”

2) “10*”

6Save Bgsave

将所有数据遍历一遍,然后存到一个扩展名为rdb的数据文件中。Bgsave为后台运行保存

redis 127.0.0.1:6379> SAVE

OK

7CONFIG RESETSTAT

充值redis服务器的统计信息,将被重置的内容如下:

Keyspace hits

Keyspace misses

Number of commands processed

Number of connections received

Number of expired keys

8Info

查看服务当前状态和版本信息。主要关心的空间使用信息used_memory_human使用内存量,vm使用率和swap使用。

举例:

redis 127.0.0.1:6379[1]> info

redis_version:2.2.12

redis_git_sha1:00000000

redis_git_dirty:0

arch_bits:64

multiplexing_api:epoll

process_id:27525

uptime_in_seconds:3085418

uptime_in_days:35

lru_clock:1807857

used_cpu_sys:79.22

used_cpu_user:186.33

used_cpu_sys_children:8.48

used_cpu_user_children:1.53

connected_clients:1

connected_slaves:0

client_longest_output_list:0

client_biggest_input_buf:0

blocked_clients:0

used_memory:83717864

used_memory_human:79.84M

used_memory_rss:127311872

mem_fragmentation_ratio:1.52

use_tcmalloc:0

loading:0

aof_enabled:0

changes_since_last_save:0

bgsave_in_progress:0

last_save_time:1318258998

bgrewriteaof_in_progress:0

total_connections_received:132983

total_commands_processed:5728570

expired_keys:0

evicted_keys:0

keyspace_hits:3588043

keyspace_misses:2140445

hash_max_zipmap_entries:512

hash_max_zipmap_value:64

pubsub_channels:0

pubsub_patterns:0

vm_enabled:0

role:master

db0:keys=664042,expires=0

db1:keys=1,expires=0