Wanyor 发布的文章

0x00.这段时间做服务器接口测试,遇到一个需要动态获取校验码的,需要自己开发插件。

0x01.准备基本的开发环境eclipse,下载jmeter源码,导入工程。下载地址:http://jmeter.apache.org/download_jmeter.cgi,请选择你使用的jmeter对应版本的源码。
0x02.在src/functions下新建你自己的函数类
0x03.开始码代码:

package org.apache.jmeter.functions;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;

public class {"函数名称"}extends AbstractFunction {
    
    //private static final Logger log = LoggingManager.getLoggerForClass();
    private static final List desc = new LinkedList();
    private static final String KEY = "__函数名称";
    private Object[] values = null;

    //Add arguments description
    static{
        desc.add("参数提示一");
        desc.add("参数提示二");
    }
    
    @Override
    public List getArgumentDesc() {
        // TODO Auto-generated method stub
        return desc;
    }

    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
        
        String numberString1 = ((CompoundVariable) values[0]).execute().trim();
        String numberString2 = ((CompoundVariable) values[1]).execute().trim();
        String 参数一;
        String 参数二;
        try{
            url = numberString1;
            isAuth = numberString2;
        } catch (Exception e){
            return null;
        }

        return String.valueOf(work(参数一,参数二));
    }
    
    public static void  print(String s){
        System.out.println(s);
    }

    private String work(String 参数一,String 参数二) {        
            
        String ret = null;
        //.....your code
        return ret;
    }

    @Override
    public void setParameters(Collection parameters) throws InvalidVariableException {
        //可以检查参数数量,主要包括以下两种方法
        checkMinParameterCount(parameters, 2);
        checkParameterCount(parameters, 2, 2);
        values = parameters.toArray();
        
    }

    @Override
    public String getReferenceKey() {
        //显示的函数名称
        return KEY;
    }
    
}    

工作需要用到Java的SDK环境,所以下载安装,一般安装就是复制到对应的位置,然后配置下环境变量即可。

0x00.下载Java的SDK二进制包,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,下载后缀为tar.gz的包。

0x01.tar解压文件,复制文件夹到/usr/lib/jvm/目录下。

0x02.配置环境变量:

sudo gedit /etc/profile 

在文件末尾添加以下代码:

#set jdk environment  
export JAVA_HOME=/usr/lib/jvm/jdk1.x.x_xx (此处修改为自己下载的版本)
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH  
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH  

Ctrl+S保存,使用source /etc/profile刷新环境变量,使之生效。

0x03.在Terminal下输入java -version和javac -version检查是否生效,正确的应该是返回对应的版本。
java -version:

java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)


javac -version:

javac 1.8.0_102

0x04.如果显示openjdk的,执行以下命令修改下优先级(注意自己的版本):

sudo update-alternatives --install /usr/lib/java java /usr/lib/jvm/jdk1.x.x_xxx/bin/java 300  
sudo update-alternatives --install /usr/lib/javac javac /usr/lib/jvm/jdk1.x.x_xxx/bin/javac 300 


或者直接重新配置下,注意使用source /etc/profile刷新下环境变量。

sudo update-alternatives --config java

刚刚在virtualbox下安装了个lubuntu14.04,在安装virtualbox增强插件时报错。要求查看/var/log/下的错误日志,于是cd到目录下查看。

看到报错主要提示找不到gcc、make、Linux-header、Perl,于是乎,直接安装三个软件。

安装命令如下:

sudo apt-get install gcc make perl

然后运行安装插件命令,OK!问题解决,reboot&&enjoy!!!

上一章完成了FPS的命令行版本的查看工具,这一章节开始学习绘制FPS的曲线。

在编写之前,谷歌了一圈,发现有一个叫mathplot的插件不错。开始读文档开战,插件官网地址:http://matplotlib.org/,看完demo,目标是能动态显示曲线。

废话少说,贴代码:

#coding:utf-8
import os,time
import matplotlib.pyplot as plt

def checkadb():
	return os.path.exists('adb')

def checkdevices():
	rt = os.popen('adb devices')
	t = rt.readline()
	rt.close()
	return t

def getframe():
	cmd = "adb shell \"service call SurfaceFlinger 1013|busybox cut -d \( -f 2|busybox cut -d \\' -f 0 \""
	r = os.popen(cmd)
	text = r.read()
	r.close()
	return text

def getfps():
	starttime = round(time.time()*1000)
	startframe = int(getframe(), 16)
	time.sleep(0.001)
	endtime = round(time.time()*1000)
	endframe = int(getframe(),16)
	fps = (endframe - startframe)*1000/(endtime - starttime)
	return fps

def draw():
	plt.ion()
	plt.xlabel("Time(s)")
	plt.ylabel("FPS")
	plt.title("FPS Test Tool For root android device v1.0 \n By Wanyor")
	plt.xlim(0,60)  #首先得设置一个x轴的区间 这个是必须的
	plt.ylim(0,100) # y轴区间 
	m = []
	x=0
	while True:
		x=x+1
		if x>60:
			plt.xlim(x-59,x)
		m.append(getfps())  #存入list里面
		plt.plot(m,label="$fps$",color="red",linewidth=1) #将list传入plot画图
		plt.pause(0.0001) # 这个为停顿0.01s,能得到产生实时的

def usage():
	print 'Print fps realtime for a rooted android device.'
	print ''
	print 'Author: wangyong11@qiku.com 2016-6-15 17:38:43\n'	
	print 'You can stop it use ctrl+c \n'


def main():
	#if checkadb():
	usage()
	try:
		draw()
	except Exception, e:
		raise e
	finally:
		print "Buddy, android devices must root!!!"
	'''
	else:
		print 'Please install adb toolkit!'
	'''

if __name__ == '__main__':
	main()

前提:
最近做APP测试需要测FPS来评估流畅度,检查应用是否有卡顿。

开始干活:
0x00.首先谷歌一圈看看FPS原理,找到TesterHome上面有介绍FPS测数据的,还有一个就是腾讯开源的GT随身调,git clone下来源代码学习一番。GT源码地址:Github
0x01.开始看源码,但是它这个实现方式需要root权限才能读取相关数据。
参考Q博士的文章:http://blog.csdn.net/itfootball/article/details/43084527
大概的原理是:
1.adb shell dumpsys SurfaceFlinger --latency命令产生fps数据.
2.通过service call SurfaceFlinger 1013 来得到当前帧的索引以及时间戳,设置为A = {indexA,timeA}.
3.公式:
设上一次的数据为B = {indexB,timeB}
FPS = (indexA-indexB)/(timeA-timeB)
0x02.开工,拿自己稍微熟一些的Python开始coding。
以下是Python写的获取FPS的demo,代码写的很差。

    #coding:utf-8
    import os,time

    def checkadb():
        return os.path.exists('adb')

    def checkdevices():
        rt = os.popen('adb devices')
        t = rt.readline()
        rt.close()
        return t

    def getframe():
        cmd = "adb shell \"service call SurfaceFlinger 1013|busybox cut -d \( -f 2|busybox cut -d \\' -f 0 \""
        r = os.popen(cmd)
        text = r.read()
        r.close()
        return text

    def getfps():
        starttime = round(time.time()*1000)
        startframe = int(getframe(), 16)
        time.sleep(0.001)
        endtime = round(time.time()*1000)
        endframe = int(getframe(),16)
        fps = (endframe - startframe)*1000/(endtime - starttime)
        return fps

    def usage():
        print 'Print fps realtime for a rooted android phone.'
        print ''
        print 'Author: wangyong11@qiku.com 2016-6-15 17:38:43\n'    
        print 'You can stop it use ctrl+c \n'


    def main():
        usage()
        try:
            while 1:
                print getfps()
        except:
            print "Stop by yourself!"
        finally:
            print "Buddy, android devices must root!!!"        

    if __name__ == '__main__':
        main()

大概讲解下:通过上述的命令直接获取单位时间的帧索引差值,然后除以时间,即为FPS。
ps:以上的demo只能实时查看fps,不够直观,下一节完善下,做成实时滚动的曲线图。

导语:

之前学单片机的时候手上有块stm32f103c8t6的核心小板子,恰好这几天看了microPython,心中汹涌澎湃,就想着能移植到小板子上去。

准备:

STM32F103C8T6核心板、J-link调试器、USB电源线

开战:

参考:http://bbs.elecfans.com/jishu_581420_1_1.html
首先安装编译器GNU Tools for ARM Embedded Processors(arm-gcc-none-eabi),下载地址:[https://launchpad.net/gcc-arm-embedded][1]。
下载ST的DfuSe工具:下载地址:[http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF257916][2]
从github下载MicroPython源码,地址:[https://github.com/micropython/micropython][3]
进入源码的stmhal\boards\ 目录,新建一个目录stm32f103c8t6,复制STM32F4DISC目录下的文件到刚刚新建的目录

学了Python有一段时间了,于是开始琢磨着写点实用东西。目前最蛋疼的就是管理我的vps,刚好官方提供了简单的客户端API
API提供几个基本管理功能,重启,开机,关机,服务器状态,服务器信息,使用post或者get请求就可以获取到dom型返回值,需携带key:API Key: XXXXX-XXXXX-XXXXX和API Hash: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。

移动测试顾名思义就是测试移动端的系统获取应用,包含应用测试,集成测试等。

QA助手,一款安卓测试辅助小工具,目前还在开发阶段。

下载地址:链接 密码: 5e9r