现在的位置: 首页 > 综合 > 正文

LoadRunner对funambol性能测试

2017年12月26日 ⁄ 综合 ⁄ 共 11099字 ⁄ 字号 评论关闭

1、安装funambol(具体请参照https://www.forge.funambol.org/DomainHome.html

2、下载funambol的javademo的源码(https://core.forge.funambol.org/svn/core/trunk/funambol/clients/javademo)

3、下载funambol-client-sdk(http://funambol.com/opensource/download.php?file_id=funambol-client-sdk-9.0.0.zip&path=client-sdk/v9&_=d

4、在javademo的基础上写自己的测试类:

package com.funambol.syncclient.testcase;

import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

import com.funambol.syncclient.spdm.DMException;
import com.funambol.syncclient.spds.SyncException;
import com.funambol.syncclient.spds.SyncManager;
import com.funambol.syncclient.spds.event.SyncEvent;
import com.funambol.syncclient.spds.event.SyncItemEvent;
import com.funambol.syncclient.spds.event.SyncItemListener;
import com.funambol.syncclient.spds.event.SyncListener;
import com.funambol.syncclient.spds.event.SyncSourceEvent;
import com.funambol.syncclient.spds.event.SyncSourceListener;
import com.funambol.syncclient.spds.event.SyncStatusEvent;
import com.funambol.syncclient.spds.event.SyncStatusListener;
import com.funambol.syncclient.spds.event.SyncTransportEvent;
import com.funambol.syncclient.spds.event.SyncTransportListener;

public class UploadTest extends SyncInitialize implements SyncItemListener, SyncListener,
		SyncSourceListener, SyncStatusListener, SyncTransportListener {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		UploadTest test = new UploadTest();
		Options opt = new Options();
		opt.addOption("d", "directory", true, "root directory");

		CommandLineParser parser = new BasicParser();
		CommandLine cl = null;

		try {
			cl = parser.parse(opt, args);
			
			if (cl.hasOption("d") && cl.getOptionValue("d") != null) {

				test.sync(cl.getOptionValue("d"));
			}

		} catch (ParseException e) {
			// do nothing
		}
	}

	public void sync(String rootDirectory) {
		super.init(rootDirectory);
		long startTime = 0;
		long endTime = 0;
		startTime = System.nanoTime();

		try {
			SyncManager syncManager = SyncManager.getSyncManager("");

			syncManager.addSyncItemListener(this);
			syncManager.addSyncListener(this);
			syncManager.addSyncSourceListener(this);
			syncManager.addSyncStatusListener(this);
			syncManager.addSyncTransportListener(this);

			syncManager.sync();
			endTime = System.nanoTime();
			System.out.println("upload time=" + (endTime - startTime)
					/ (1000 * 1000));
		} catch (SyncException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (DMException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void sendDataBegin(SyncTransportEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void sendDataEnd(SyncTransportEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void receiveDataBegin(SyncTransportEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void dataReceived(SyncTransportEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void receiveDataEnd(SyncTransportEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void statusReceived(SyncStatusEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void statusToSend(SyncStatusEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void syncBegin(SyncSourceEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void syncEnd(SyncSourceEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void syncBegin(SyncEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void syncEnd(SyncEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void sendInitialization(SyncEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void sendModification(SyncEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void sendFinalization(SyncEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void syncError(SyncEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void itemAddedByServer(SyncItemEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void itemDeletedByServer(SyncItemEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void itemUpdatedByServer(SyncItemEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void itemAddedByClient(SyncItemEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void itemDeletedByClient(SyncItemEvent event) {
		// TODO Auto-generated method stub

	}

	@Override
	public void itemUpdatedByClient(SyncItemEvent event) {
		// TODO Auto-generated method stub

	}

}

5、将4中的类导出为可运行的jar包(sync.jar)

6、为sync.jar编写cmd或者sh脚本

7、使用Loadrunner录制cmd脚本:


8、在vuser_init部分添加计算syncml协议中的last和next标签的值的变量

int time_millitm;
int get_time;
int real_time;
int length;

char currentTime[14];
char currentDate[10];
char s_time_millitm[10]={0};
char s_get_time[60]={0};
char s_real_time[30]={0};

char last[60]={"0"};
vuser_init()
{
	return 0;
}

9、添加lrw_custom_body.h到脚本中,将同步联系人数据段复制到此文件中:

/*********************************************************
// This file contains the body sections 
// recorded for web_custom_request function.
**********************************************************/
const char * const body_variable_1 = "Body=<SyncML>\n    <SyncHdr>\n        <VerDTD>1.1</VerDTD>\n        <VerProto>SyncML/1.1</VerProto>\n        <SessionID>12345678</SessionID>\n        <MsgID>2</MsgID>\n        <Target><LocURI>null</LocURI></Target>\n        <Source><LocURI>123</LocURI></Source>\n    </SyncHdr>\n    <SyncBody>\n        <Status>\n            <CmdID>1</CmdID>\n            <MsgRef>1</MsgRef>\n            <CmdRef>0</CmdRef>\n            <Cmd>SyncHdr</Cmd>\n            <TargetRef>123</TargetRef>\n            <SourceRef"
		">null</SourceRef>\n            <Data>200</Data>\n        </Status>\n     <Status>\n<CmdID>2</CmdID>\n<MsgRef>1</MsgRef><CmdRef>1</CmdRef><Cmd>Alert</Cmd>\n<TargetRef>card</TargetRef>\n<SourceRef>card</SourceRef>\n<Data>200</Data>\n<Item>\n<Data>\n<Anchor xmlns=\"syncml:metinf\"><Next>1331709003765</Next></Anchor>\n</Data>\n</Item>\n</Status>\n<Sync>\n<CmdID>3</CmdID>\n<Target><LocURI>card</LocURI></Target>\n<Source><LocURI>card</LocURI></Source>\n<Replace>\n<CmdID>4</CmdID>\n<Meta>\n<Type xmlns=\""
		"syncml:metinf\">text/x-vcard</Type>\n</Meta>\n<Item>\n<Source><LocURI>21879230459545</LocURI></Source>\n<Data>BEGIN:VCARD\r\nVERSION:2.1\r\nN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:;=E8=92=8B=E6=9C=89=E4=B8=BA;;;\r\nFN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:=E8=92=8B=E6=9C=89=E4=B8=BA\r\nTEL;VOICE;HOME:13590949158\r\nREV:26630430T040034\r\nEND:VCARD\r\n</Data>\n</Item>\n<Item>\n<Source><LocURI>21879038489371</LocURI></Source>\n<Data>BEGIN:VCARD\r\nVERSION:2.1\r\nN;ENCODING=QUOTED-PRINTABLE;"
		"CHARSET=UTF-8:;=E8=92=8B=E6=9C=89=E4=B8=BA;;;\r\nFN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:=E8=92=8B=E6=9C=89=E4=B8=BA\r\nTEL;VOICE;HOME:13590949158\r\nREV:26630427T224102\r\nEND:VCARD\r\n</Data>\n</Item>\n<Item>\n<Source><LocURI>21879348891267</LocURI></Source>\n<Data>BEGIN:VCARD\r\nVERSION:2.1\r\nN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:;=E8=92=8B=E6=9C=89=E4=B8=BA;;;\r\nFN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:=E8=92=8B=E6=9C=89=E4=B8=BA\r\nTEL;VOICE;HOME:13590949158\r\nREV:26630501T125427"
		"\r\nEND:VCARD\r\n</Data>\n</Item>\n\n</Replace>\n</Sync><Final"
		"/>\n     </SyncBody>\n</SyncML>\n\n";

10、修改action部分:

Action()
{
    char s0[10]={"0"};
	char s00[10]={"00"};

	time_millitm=666;

	get_time=time(0);

	itoa(get_time,s_get_time,10);

	itoa(time_millitm,s_time_millitm,10);

	length=strlen(s_time_millitm);
	if(length<3)
	{
		if (length==1)
		{
			strcat(s00,s_time_millitm);
			strcat(s_get_time,s00);
		}

		if (length==2)
		{
			strcat(s0,s_time_millitm);
			strcat(s_get_time,s0);
		}
	}

	else
	{
		strcat(s_get_time,s_time_millitm);
	}
	lr_save_string(last,"param_last");
	lr_save_string(s_get_time,"param_s_get_time");
	web_reg_save_param("temp",
		"LB=jsessionid=",
		"RB=</RespURI>",
		"Ord=1",
		"Search=All",
		LAST);

	web_custom_request("ds", 
		"URL=http://127.0.0.1:8080/funambol/ds", 
		"Method=POST", 
		"Resource=0", 
		"RecContentType=application/vnd.syncml+xml", 
		"Referer=", 
		"Mode=HTML", 
		"EncType=application/vnd.syncml+xml; charset=UTF-8", 
		"Body=<SyncML>\n    <SyncHdr>\n        <VerDTD>1.1</VerDTD>\n        <VerProto>SyncML/1.1</VerProto>\n        <SessionID>12345678</SessionID>\n        <MsgID>1</MsgID>\n        <Target>\n            <LocURI>http://127.0.0.1:8080/funambol/ds</LocURI>\n        </Target>\n        <Source>\n            <LocURI>{device}</LocURI>\n        </Source>\n        <Cred>\n            <Meta>\n                <Type xmlns=\"syncml:metinf\">syncml:auth-basic</Type>\n            </Meta>\n            <Data"
		">{key}</Data>\n        </Cred>\n\t<Meta>\n            <MaxMsgSize>250000</MaxMsgSize>\n            <MaxObjSize>4000000</MaxObjSize>\n        </Meta>\n    </SyncHdr>\n    <SyncBody>\n    <Alert>\n<CmdID>1</CmdID>\n<Data>200</Data>\n<Item>\n<Target><LocURI>card</LocURI></Target>\n<Source><LocURI>card</LocURI></Source>\n<Meta>\n<Anchor xmlns=\"syncml:metinf\">\n<Last>{param_last}</Last>\n<Next>{param_s_get_time}</Next>\n</Anchor>\n</Meta>\n</Item>\n</Alert>\n\n        <Final/>\n    </SyncBody"
		">\n</SyncML>\n", 
		LAST);

	web_custom_request("ds;jsessionid={temp}", 
		"URL=http://127.0.0.1:8080/funambol/ds;jsessionid={temp}", 
		"Method=POST", 
		"Resource=0", 
		"RecContentType=application/vnd.syncml+xml", 
		"Referer=", 
		"Mode=HTML", 
		"EncType=application/vnd.syncml+xml; charset=UTF-8", 
		body_variable_1, 
		LAST);

	web_custom_request("ds;jsessionid={temp}", 
		"URL=http://127.0.0.1
:8080/funambol/ds;jsessionid={temp}", 
		"Method=POST", 
		"Resource=0", 
		"RecContentType=application/vnd.syncml+xml", 
		"Referer=", 
		"Mode=HTML", 
		"EncType=application/vnd.syncml+xml; charset=UTF-8", 
		"Body=<SyncML>\n    <SyncHdr>\n        <VerDTD>1.1</VerDTD>\n        <VerProto>SyncML/1.1</VerProto>\n        <SessionID>12345678</SessionID>\n        <MsgID>3</MsgID>\n        <Target><LocURI>http://127.0.0.1:8080/funambol/ds;jsessionid={temp}</LocURI></Target>\n    <Source><LocURI>{device}</LocURI></Source>\n    </SyncHdr>\n    <SyncBody>\n        <Status>\n            <CmdID>1</CmdID>\n            <MsgRef>2</MsgRef>\n            <CmdRef>0</CmdRef>\n            <Cmd"
		">SyncHdr</Cmd>\n            <TargetRef>http://127.0.0.1:8080/funambol/ds;jsessionid={temp}</TargetRef>\n            <SourceRef>{device}</SourceRef>\n            <Data>200</Data>\n        </Status>\n        <Alert>\n            <CmdID>2</CmdID>\n            <Data>222</Data>\n            <Item>\n                <Target><LocURI>http://127.0.0.1:8080/funambol/ds;jsessionid={temp}</LocURI></Target>\n                <Source><LocURI>{device}</LocURI><"
		"/Source>\n            </Item>\n        </Alert>\n    </SyncBody>\n</SyncML>\n\n", 
		LAST);

	web_custom_request("ds;jsessionid={temp}", 
		"URL=http://127.0.0.1:8080/funambol/ds;jsessionid={temp}", 
		"Method=POST", 
		"Resource=0", 
		"RecContentType=application/vnd.syncml+xml", 
		"Referer=", 
		"Mode=HTML", 
		"EncType=application/vnd.syncml+xml; charset=UTF-8", 
		"Body=<SyncML>\n    <SyncHdr>\n        <VerDTD>1.1</VerDTD>\n        <VerProto>SyncML/1.1</VerProto>\n        <SessionID>12345678</SessionID>\n        <MsgID>4</MsgID>\n        <Target><LocURI>null</LocURI></Target>\n        <Source><LocURI>{device}</LocURI></Source>\n    </SyncHdr>\n    <SyncBody>\n        <Status>\n            <CmdID>1</CmdID>\n            <MsgRef>1</MsgRef>\n            <CmdRef>0</CmdRef>\n            <Cmd>SyncHdr</Cmd>\n            <TargetRef>{device}</TargetRef>\n            <SourceRef"
		">null</SourceRef>\n            <Data>200</Data>\n        </Status>\n    \n    </SyncBody>\n</SyncML>\n\n", 
		LAST);

	web_custom_request("ds;jsessionid={temp}", 
		"URL=http://127.0.0.1:8080/funambol/ds;jsessionid={temp}", 
		"Method=POST", 
		"Resource=0", 
		"RecContentType=application/vnd.syncml+xml", 
		"Referer=", 
		"Mode=HTML", 
		"EncType=application/vnd.syncml+xml; charset=UTF-8", 
		"Body=<SyncML>\n    <SyncHdr>\n        <VerDTD>1.1</VerDTD>\n        <VerProto>SyncML/1.1</VerProto>\n        <SessionID>12345678</SessionID>\n        <MsgID>5</MsgID>\n        <Target><LocURI>null</LocURI></Target>\n        <Source><LocURI>{device}</LocURI></Source>\n    </SyncHdr>\n    <SyncBody>\n        <Status>\n            <CmdID>1</CmdID>\n            <MsgRef>1</MsgRef>\n            <CmdRef>0</CmdRef>\n            <Cmd>SyncHdr</Cmd>\n            <TargetRef>{device}</TargetRef>\n            <SourceRef"
		">null</SourceRef>\n            <Data>200</Data>\n        </Status>\n    <Final></Final>\n    </SyncBody>\n</SyncML>\n\n", 
		LAST);

	return 0;
}

11、action中几个变量的设置:


temp、param_last、param_s_get_time变量都通过以下方式添加:

12、此时一个可进行并发测试的脚本创建OK,可以使用Loadrunner对这个脚本进行各种性能指标的测试。

抱歉!评论已关闭.