天天看點

Java Web并發單元測試摘記(1)

  這裡總結幾種有效的配置單元測試方式:

  1、直接使用junit4元件,進行簡單單元測試,在setup()中初始化各種測試環境如下:

@override

protected void setup() throws exception {

super.setup();

string[] paths = { "classpath:applicationcontext.xml" };

applicationcontext ctx = new classpathxmlapplicationcontext(paths);

springcontextlistener.setapplicationcontext(ctx);

// ############模拟servlet容器啟動,手動更改配置檔案路徑

constant.current_project_path = "src/";

// ############直接容器中擷取bean

usermanager = (usermanager) ctx.getbean("usermanager");

userservice = (userservice) ctx.getbean("userservice");

}

  2、使用sprint-test.jar架構,支援事務可注解方式啟動的單元測試:

@runwith(springjunit4classrunner.class)

@contextconfiguration(locations = "classpath:applicationcontext.xml")

@transactionconfiguration(transactionmanager="transactionmanager",defaultrollback=false) //true将會復原所有操作,預設沒有該注解為復原

public class jbpmprocesstest2 extends  abstracttransactionaljunit4springcontexttests{

  以上都隻能暫時支援簡單功能的單元測試。但是要測試并發和壓力等。需要加入一個常用的架構,支援在單元測試中注入多線程和并發。

  具體參見:http://blog.csdn.net/zhangyaoming2004/article/details/7619489 下面附有jar包下載下傳 http://yunpan.cn/qutvay66vnu4t

 我們具體使用的功能不是很多,這些并發測試可以嵌入到上面兩種單元測試方式中:如下:

/**

*

*/

package com.dtsz.model.service.test;

import net.sourceforge.groboutils.junit.v1.testrunnable;

import com.dtsz.model.entity.report.common.invokesource;

import com.dtsz.model.service.excelreportlogicservice;

import com.dtsz.model.service.tasklogicservice;

import com.dtsz.model.util.excelreportutil;

import com.dtsz.view.vo.authenticator.uservo;

import com.dtsz.view.vo.webservice.excelreportresult;

* 模拟插件端資料上報的并發操作測試

* @author xiaoli

public class createmulltitaskreportgrobothread extends testrunnable {

tasklogicservice tasklogicservice;

excelreportlogicservice excelreportlogicservice;

private string reportmap;

private uservo user;

private invokesource invokesource;

private string bbq;

public createmulltitaskreportgrobothread(string reportmap, uservo user, invokesource invokesource,string bbq) {

super();

this.reportmap = reportmap;

this.user = user;

this.invokesource = invokesource;

this.bbq = bbq;

init();

public void init() {

tasklogicservice = (tasklogicservice)excelreportutil.getbean("tasklogicservice");

excelreportlogicservice = (excelreportlogicservice)excelreportutil.getbean("excelreportlogicservice");

/*

* (non-javadoc)

* @see net.sourceforge.groboutils.junit.v1.testrunnable#runtest()

public void runtest() throws throwable {

// todo auto-generated method stub

// ########################模拟目前任務該報表期任務上報

//儲存資料

excelreportresult result = tasklogicservice.reportdata(reportmap, user, invokesource);

excelreportlogicservice.savedata(result);

system.out.println("報表期為:"+this.bbq+"已上報");

  單元測試并發:

import java.sql.sqlexception;

import java.util.arraylist;

import java.util.hashmap;

import java.util.list;

import java.util.map;

import junit.framework.testcase;

import net.sourceforge.groboutils.junit.v1.multithreadedtestrunner;

import org.junit.test;

import org.springframework.context.applicationcontext;

import org.springframework.context.support.classpathxmlapplicationcontext;

import com.dtsz.model.entity.authenticator.user;

import com.dtsz.model.service.authenticator.usermanager;

import com.dtsz.model.service.authenticator.userservice;

import com.dtsz.model.service.exception.baseappexception;

import com.dtsz.model.util.beanutil2;

import com.dtsz.model.util.constant;

import com.dtsz.model.util.encryption;

import com.dtsz.view.util.springcontextlistener;

* 模拟資料上報,這裡的初始化資料根據插件端傳入資料組合來的,目前隻有根據報表期生成初始化資料

public class createmultitaskreporttest3 extends testcase {

private usermanager usermanager;

private userservice userservice;

protected void teardown() throws exception {

super.teardown();

@test

public void test(){

// ###########自動生成報表期串集合

list<string> bbqs = new arraylist<string>();

unittestutils.imitatecreatemultibbq(bbqs, 2, "2048", "5");

// 建立線程

testrunnable[] tr = new testrunnable[bbqs.size()];

int processcount = 0;

// ##########對這些資料進行填報

for (string bbq : bbqs) {

// 模拟上報資料

string reportmap = "{taskid:\"402880ee425a92f501425aa75ad50002\",bbq_:\""

+ bbq

+ "\""

+ ",bbhid:\"402855b942099b1b014209b1177e03f5\",approvalflag:2,reportflag:false,auditflag:false,sheetmap:"

+ "[{id:\"402880ee425a92f501425aa75ad60004\",sheettype:\"basic\",values:{}}]}";

// 模拟上報的user

uservo user = null;

try {

user = checkuser("xl1", "1");

} catch (baseappexception e) {

e.printstacktrace();

} // 模拟插件端checkuser

string sessioninfo = "{institutionname:\"南昌分行\",institutioncode:\"a01nc\",username:\"肖力1"

+ "1\",usercode:\"xl1\",rolecode:\"null\",bbhid:\"402855b942099b1b014209b1177e03f5\",bbhcode:\"b01b\",btype:\"basic\",taskid:\"402880ee425a92f501425a"

+ "a75ad50002\",bbhname:\"基層财務b\",bbq:\"" + bbq

+ "\",frequency:\"month\",sessiondimension:{}}";

userservice.updatesession(sessioninfo, user);

} catch (sqlexception e) {

} // 模拟插件端updatesession

// 初始化上報方式

invokesource invokesource = invokesource.wscall;

createmulltitaskreportgrobothread reportthread = new createmulltitaskreportgrobothread(reportmap,user, invokesource,bbq);

tr[processcount] = reportthread;

processcount++;

system.out.println("#######################################計時開始########################");

long starttime = system.currenttimemillis();

// 生成測試線程運作器

multithreadedtestrunner mttr = new multithreadedtestrunner(tr);

// 運作測試線程

mttr.runtestrunnables();

} catch (throwable e) {

system.out.println("#######################一共耗時:"

+ string.valueof((system.currenttimemillis() - starttime) / 1000) + "秒");

* xl1 1

* */

public uservo checkuser(string userid,

string password) throws baseappexception {

map<string, string> parammap = new hashmap<string, string>();

parammap.put("username", userid);

parammap.put("password", password);

list<user> users = usermanager.findbycodecache(userid);

list<user> needusers = new arraylist<user>();

if (users != null && users.size() > 0) {

for (user user : users) {

if (user.getstate() && user.getcode().equals(userid)

&& user.getpassword().equals(encryption.encryption(password))) {

needusers.add(user);

// 通過驗證

if (needusers != null && needusers.size() > 0) {

user user = needusers.get(0);

// 擷取使用者權限,并存放于session中

// uservo uservo = usermanager.getuserpermission(user.getid());

string ipaddress = "0.0.0.0";

uservo uservo = new uservo();

beanutil2.copyproperties(user, uservo);

uservo.setipaddress(ipaddress);

return uservo; // 通過驗證

} else {

return null;

  真實環境并發和壓力測試不僅僅是在多個線程同時啟動在測,還可能是增量式壓力測試。這些還是要封裝好和處理好。

最新内容請見作者的github頁:http://qaseven.github.io/