mirror of https://github.com/apache/jmeter.git
Bug 59896 - Report / Dashboard : Add a menu entry to generate a report on demand from a CSV file
Contributed by UbikLoadPack This closes #453 Bugzilla Id: 59896 git-svn-id: https://svn.apache.org/repos/asf/jmeter/trunk@1854942 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
254d4750a2
commit
cb0f115fda
|
|
@ -1315,6 +1315,8 @@ jmeter.reportgenerator.apdex_satisfied_threshold=500
|
|||
# Change this parameter if you want to override the APDEX tolerance threshold.
|
||||
jmeter.reportgenerator.apdex_tolerated_threshold=1500
|
||||
|
||||
# Timeout in milliseconds for Report generation when using Tools > Generate HTML report
|
||||
#generate_report_ui.generation_timeout=120000
|
||||
#---------------------------------------------------------------------------
|
||||
# Naming Policy configuration
|
||||
#---------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -0,0 +1,47 @@
|
|||
{
|
||||
"JR-KO" : {
|
||||
"transaction" : "JR-KO",
|
||||
"sampleCount" : 3,
|
||||
"errorCount" : 3,
|
||||
"errorPct" : 100.0,
|
||||
"meanResTime" : 199.66666666666666,
|
||||
"minResTime" : 100.0,
|
||||
"maxResTime" : 329.0,
|
||||
"pct1ResTime" : 329.0,
|
||||
"pct2ResTime" : 329.0,
|
||||
"pct3ResTime" : 329.0,
|
||||
"throughput" : 0.07922465471254654,
|
||||
"receivedKBytesPerSec" : 0.0015473565373544248,
|
||||
"sentKBytesPerSec" : 6.1894261494177E-4
|
||||
},
|
||||
"Total" : {
|
||||
"transaction" : "Total",
|
||||
"sampleCount" : 255,
|
||||
"errorCount" : 3,
|
||||
"errorPct" : 1.1764706,
|
||||
"meanResTime" : 235.47450980392148,
|
||||
"minResTime" : 100.0,
|
||||
"maxResTime" : 353.0,
|
||||
"pct1ResTime" : 337.0,
|
||||
"pct2ResTime" : 339.2,
|
||||
"pct3ResTime" : 353.0,
|
||||
"throughput" : 4.2369361136495804,
|
||||
"receivedKBytesPerSec" : 0.07457474869153444,
|
||||
"sentKBytesPerSec" : 0.03310106338788735
|
||||
},
|
||||
"JR-OK" : {
|
||||
"transaction" : "JR-OK",
|
||||
"sampleCount" : 252,
|
||||
"errorCount" : 0,
|
||||
"errorPct" : 0.0,
|
||||
"meanResTime" : 235.90079365079367,
|
||||
"minResTime" : 101.0,
|
||||
"maxResTime" : 353.0,
|
||||
"pct1ResTime" : 337.0,
|
||||
"pct2ResTime" : 339.35,
|
||||
"pct3ResTime" : 353.0,
|
||||
"throughput" : 4.187089806430174,
|
||||
"receivedKBytesPerSec" : 0.0736011880036554,
|
||||
"sentKBytesPerSec" : 0.03271163911273573
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
timeStamp,elapsed,label,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect
|
||||
1549967385359,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385360,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385361,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385361,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385361,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385361,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385361,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385361,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385361,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385735,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385735,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385735,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385736,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385736,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385736,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385736,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385736,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385736,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385736,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385736,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385736,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385736,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
1549967385737,0,Requête HTTP,Groupe d'unités 1-1,text,false,,1110,0,1,1,http:/,0,0,0
|
||||
|
|
|
@ -0,0 +1,256 @@
|
|||
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect
|
||||
1551783627191,351,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783627543,192,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783627735,131,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783627866,261,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783628128,266,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783628395,279,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783628674,304,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783628979,353,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783629333,196,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783629530,139,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783629670,278,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783629949,303,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783630253,351,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783630605,194,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783630799,134,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783630934,268,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783631202,282,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783631485,308,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783631794,108,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783631903,217,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783632120,180,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783632301,107,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783632408,213,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783632622,171,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783632794,342,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783633137,176,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783633313,353,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783633666,196,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783633863,137,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783634001,275,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783634276,296,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783634573,336,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783634910,164,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783635075,328,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783635404,148,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783635552,297,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783635850,338,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783636189,168,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783636357,337,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783636695,164,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783636859,329,JR-KO,400,Bad request,Thread Group 1-1,text,false,,20,8,1,1,null,0,0,0
|
||||
1551783637189,147,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783637337,296,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783637634,339,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783637974,168,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783638142,337,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783638480,164,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783638644,329,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783638974,148,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783639122,297,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783639420,338,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783639759,168,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783639927,337,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783640264,164,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783640429,329,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783640758,148,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783640907,295,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783641203,336,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783641540,164,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783641705,328,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783642034,148,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783642182,297,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783642480,339,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783642819,169,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783642989,338,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783643327,166,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783643493,333,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783643827,156,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783643983,313,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783644297,116,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783644413,233,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783644647,211,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783644858,168,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783645027,336,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783645363,163,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783645527,325,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783645853,142,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783645995,285,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783646280,315,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783646596,120,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783646717,241,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783646958,227,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783647186,200,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783647386,146,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783647533,292,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783647826,331,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783648157,152,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783648310,304,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783648615,353,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783648968,199,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783649167,142,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783649310,284,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783649594,314,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783649909,118,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783650027,238,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783650265,220,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783650486,185,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783650671,116,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783650788,232,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783651021,210,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783651231,166,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783651398,332,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783651730,155,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783651886,309,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783652196,110,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783652307,221,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783652528,187,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783652715,121,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783652836,241,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783653078,227,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783653306,200,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783653506,146,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783653653,292,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783653945,330,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783654275,150,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783654425,300,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783654726,344,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783655071,180,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783655251,106,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783655358,212,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783655571,170,JR-KO,400,Bad request,Thread Group 1-1,text,false,,20,8,1,1,null,0,0,0
|
||||
1551783655741,340,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783656081,171,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783656253,342,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783656595,174,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783656770,348,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783657118,189,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783657307,123,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783657430,245,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783657675,235,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783657911,215,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783658126,176,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783658303,352,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783658656,195,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783658852,136,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783658989,272,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783659262,291,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783659553,327,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783659880,145,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783660025,290,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783660316,324,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783660641,140,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783660782,281,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783661063,307,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783661370,105,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783661476,210,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783661687,166,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783661853,333,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783662186,157,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783662343,313,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783662657,116,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783662774,232,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783663007,211,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783663219,168,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783663387,337,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783663725,164,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783663889,329,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783664218,149,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783664367,297,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783664664,339,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783665004,168,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783665172,337,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783665510,164,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783665675,328,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783666004,148,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783666152,297,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783666450,339,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783666789,168,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783666958,336,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783667295,164,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783667460,328,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783667789,148,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783667937,297,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783668234,339,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783668574,168,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783668742,337,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783669079,164,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783669244,328,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783669573,147,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783669720,295,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783670015,335,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783670351,162,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783670513,324,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783670837,137,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783670975,274,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783671249,294,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783671544,333,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783671877,157,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783672035,314,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783672349,118,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783672468,237,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783672705,220,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783672926,185,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783673111,116,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783673228,232,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783673460,210,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783673671,165,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783673836,331,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783674167,153,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783674320,305,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783674626,100,JR-KO,400,Bad request,Thread Group 1-1,text,false,,20,8,1,1,null,0,0,0
|
||||
1551783674727,201,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783674928,149,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783675077,297,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783675374,339,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783675714,168,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783675882,337,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783676219,164,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783676384,327,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783676712,146,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783676859,292,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783677152,331,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783677484,153,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783677638,306,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783677945,104,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783678050,208,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783678259,163,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783678422,327,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783678750,144,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783678894,289,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783679183,323,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783679507,135,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783679643,272,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783679915,290,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783680205,325,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783680530,141,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783680671,281,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783680952,307,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783681260,104,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783681365,208,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783681574,163,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783681738,326,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783682065,144,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783682209,289,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783682499,323,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783682822,137,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783682960,274,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783683234,293,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783683527,332,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783683859,155,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783684014,309,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783684323,108,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783684432,216,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783684648,178,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783684827,101,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783684928,203,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783685132,151,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783685283,303,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783685587,350,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783685938,192,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783686130,131,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783686261,261,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783686523,267,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783686790,280,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
1551783687071,305,JR-OK,200,Good request,Thread Group 1-1,text,true,,18,8,1,1,null,0,0,0
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You 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.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.apache.jmeter.gui;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.swing.JMenu;
|
||||
import javax.swing.JMenuItem;
|
||||
import javax.swing.MenuElement;
|
||||
|
||||
import org.apache.jmeter.exceptions.IllegalUserActionException;
|
||||
import org.apache.jmeter.gui.action.AbstractAction;
|
||||
import org.apache.jmeter.gui.action.ActionNames;
|
||||
import org.apache.jmeter.gui.action.ActionRouter;
|
||||
import org.apache.jmeter.gui.plugin.MenuCreator;
|
||||
import org.apache.jmeter.util.JMeterUtils;
|
||||
|
||||
public class HtmlReportAction extends AbstractAction implements MenuCreator {
|
||||
private static Set<String> commands = new HashSet<>();
|
||||
private HtmlReportUI htmlReportPanel;
|
||||
|
||||
static {
|
||||
commands.add(ActionNames.HTML_REPORT);
|
||||
}
|
||||
|
||||
public HtmlReportAction() {
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doAction(ActionEvent e) throws IllegalUserActionException {
|
||||
htmlReportPanel = new HtmlReportUI();
|
||||
htmlReportPanel.showInputDialog(getParentFrame(e));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getActionNames() {
|
||||
return commands;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JMenuItem[] getMenuItemsAtLocation(MENU_LOCATION location) {
|
||||
if (location != MENU_LOCATION.TOOLS) {
|
||||
return new JMenuItem[0];
|
||||
}
|
||||
|
||||
JMenuItem menuItem = new JMenuItem(JMeterUtils.getResString("generate_report_ui.html_report_menu"), KeyEvent.VK_UNDEFINED);
|
||||
menuItem.setName(ActionNames.HTML_REPORT);
|
||||
menuItem.setActionCommand(ActionNames.HTML_REPORT);
|
||||
menuItem.setAccelerator(null);
|
||||
menuItem.addActionListener(ActionRouter.getInstance());
|
||||
return new JMenuItem[] { menuItem };
|
||||
}
|
||||
|
||||
@Override
|
||||
public JMenu[] getTopLevelMenus() {
|
||||
return new JMenu[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean localeChanged(MenuElement menu) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void localeChanged() {
|
||||
// NOOP
|
||||
}
|
||||
|
||||
public HtmlReportUI getHtmlReportPanel() {
|
||||
return htmlReportPanel;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,252 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You 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.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.apache.jmeter.gui;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.GridLayout;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.SwingWorker;
|
||||
|
||||
import org.apache.jmeter.gui.action.ActionNames;
|
||||
import org.apache.jmeter.gui.action.HtmlReportGenerator;
|
||||
import org.apache.jmeter.gui.util.EscapeDialog;
|
||||
import org.apache.jmeter.gui.util.FileDialoger;
|
||||
import org.apache.jmeter.gui.util.JSyntaxTextArea;
|
||||
import org.apache.jmeter.util.JMeterUtils;
|
||||
import org.apache.jorphan.gui.ComponentUtil;
|
||||
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class HtmlReportUI implements ActionListener {
|
||||
private static Set<String> commands = new HashSet<>();
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(HtmlReportUI.class);
|
||||
|
||||
private static final String CREATE_REQUEST = "CREATE_REQUEST";
|
||||
private static final String BROWSE_CSV = "BROWSE_CSV";
|
||||
private static final String BROWSE_USER_PROPERTIES = "BROWSE_USER_PROPERTIES";
|
||||
private static final String BROWSE_OUTPUT = "BROWSE_OUTPUT";
|
||||
|
||||
private EscapeDialog messageDialog;
|
||||
|
||||
private JTextField csvFilePathTextField;
|
||||
private JTextField userPropertiesFilePathTextField;
|
||||
private JTextField outputDirectoryPathTextField;
|
||||
private JButton reportLaunchButton;
|
||||
private JSyntaxTextArea reportArea;
|
||||
private JButton csvFileButton;
|
||||
private JButton outputDirectoryButton;
|
||||
private JButton userPropertiesFileButton;
|
||||
|
||||
static {
|
||||
commands.add(ActionNames.HTML_REPORT);
|
||||
}
|
||||
|
||||
public HtmlReportUI() {
|
||||
super();
|
||||
}
|
||||
|
||||
public void showInputDialog(JFrame parent) {
|
||||
setupInputDialog(parent);
|
||||
launchInputDialog();
|
||||
}
|
||||
|
||||
private void launchInputDialog() {
|
||||
messageDialog.pack();
|
||||
ComponentUtil.centerComponentInWindow(messageDialog);
|
||||
messageDialog.setVisible(true);
|
||||
}
|
||||
|
||||
public void setupInputDialog(JFrame parent) {
|
||||
messageDialog = new EscapeDialog(parent, JMeterUtils.getResString("generate_report_ui.html_report_menu"), false);
|
||||
setupContentPane();
|
||||
}
|
||||
|
||||
private void setupContentPane() {
|
||||
Container contentPane = messageDialog.getContentPane();
|
||||
contentPane.setLayout(new BorderLayout());
|
||||
|
||||
contentPane.add(setupFileChooserPanel(), BorderLayout.NORTH);
|
||||
|
||||
reportArea = JSyntaxTextArea.getInstance(10, 60, true);
|
||||
reportArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_NONE);
|
||||
reportArea.setEditable(false);
|
||||
contentPane.add(reportArea, BorderLayout.CENTER);
|
||||
|
||||
contentPane.add(setupButtonPanel(), BorderLayout.SOUTH);
|
||||
}
|
||||
|
||||
private JPanel setupFileChooserPanel() {
|
||||
JPanel fileChooserPanel = new JPanel(new GridLayout(3, 3));
|
||||
fileChooserPanel.add(new JLabel(JMeterUtils.getResString("generate_report_ui.csv_file")));
|
||||
|
||||
csvFilePathTextField = new JTextField();
|
||||
fileChooserPanel.add(csvFilePathTextField);
|
||||
|
||||
this.csvFileButton = new JButton(JMeterUtils.getResString("browse"));
|
||||
csvFileButton.setActionCommand(BROWSE_CSV);
|
||||
csvFileButton.addActionListener(this);
|
||||
fileChooserPanel.add(csvFileButton);
|
||||
|
||||
fileChooserPanel.add(new JLabel(JMeterUtils.getResString("generate_report_ui.user_properties_file")));
|
||||
|
||||
userPropertiesFilePathTextField = new JTextField();
|
||||
fileChooserPanel.add(userPropertiesFilePathTextField);
|
||||
|
||||
this.userPropertiesFileButton = new JButton(JMeterUtils.getResString("browse"));
|
||||
userPropertiesFileButton.setActionCommand(BROWSE_USER_PROPERTIES);
|
||||
userPropertiesFileButton.addActionListener(this);
|
||||
fileChooserPanel.add(userPropertiesFileButton);
|
||||
|
||||
fileChooserPanel.add(new JLabel(JMeterUtils.getResString("generate_report_ui.output_directory")));
|
||||
|
||||
outputDirectoryPathTextField = new JTextField();
|
||||
fileChooserPanel.add(outputDirectoryPathTextField);
|
||||
|
||||
this.outputDirectoryButton = new JButton(JMeterUtils.getResString("browse"));
|
||||
outputDirectoryButton.setActionCommand(BROWSE_OUTPUT);
|
||||
outputDirectoryButton.addActionListener(this);
|
||||
fileChooserPanel.add(outputDirectoryButton);
|
||||
return fileChooserPanel;
|
||||
}
|
||||
|
||||
private JPanel setupButtonPanel() {
|
||||
JPanel buttonPanel = new JPanel(new GridLayout(1, 1));
|
||||
|
||||
reportLaunchButton = new JButton(JMeterUtils.getResString("generate_report_ui.html_report_request"));
|
||||
reportLaunchButton.setActionCommand(CREATE_REQUEST);
|
||||
reportLaunchButton.addActionListener(this);
|
||||
buttonPanel.add(reportLaunchButton);
|
||||
return buttonPanel;
|
||||
}
|
||||
|
||||
private class ReportGenerationWorker extends SwingWorker<List<String>, String> {
|
||||
private JButton reportLaunchButton;
|
||||
|
||||
public ReportGenerationWorker(JButton reportLaunchButton) {
|
||||
this.reportLaunchButton = reportLaunchButton;
|
||||
}
|
||||
@Override
|
||||
protected List<String> doInBackground() throws Exception {
|
||||
HtmlReportGenerator htmlReportAction = new HtmlReportGenerator(csvFilePathTextField.getText(),
|
||||
userPropertiesFilePathTextField.getText(), outputDirectoryPathTextField.getText());
|
||||
SwingUtilities.invokeAndWait(() -> reportLaunchButton.setEnabled(false));
|
||||
return htmlReportAction.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void done() {
|
||||
try {
|
||||
reportLaunchButton.setEnabled(true);
|
||||
reportToUser(get());
|
||||
} catch (InterruptedException | ExecutionException exception) {
|
||||
if (LOGGER.isErrorEnabled()) {
|
||||
LOGGER.error("Error during html report generation: {}", exception.getMessage(), exception);
|
||||
}
|
||||
reportToUser(Arrays.asList(exception.getMessage()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void addTextToReport(String errorMessage) {
|
||||
reportArea.setText(reportArea.getText() + errorMessage + "\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
switch (e.getActionCommand()) {
|
||||
case CREATE_REQUEST:
|
||||
try {
|
||||
reportArea.setText(JMeterUtils.getResString("generate_report_ui.html_report_processing") + "\n");
|
||||
reportLaunchButton.setForeground(Color.orange);
|
||||
new ReportGenerationWorker(reportLaunchButton).execute();
|
||||
} catch (Exception exception) {
|
||||
if (LOGGER.isErrorEnabled()) {
|
||||
LOGGER.error("Error during html report generation: {}", exception.getMessage(), exception);
|
||||
}
|
||||
}
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("CSV file path {}\nuser.properties file path: {}\nOutput directory file path: {}",
|
||||
csvFilePathTextField.getText(), userPropertiesFilePathTextField.getText(),
|
||||
outputDirectoryPathTextField.getText());
|
||||
}
|
||||
break;
|
||||
case BROWSE_USER_PROPERTIES:
|
||||
userPropertiesFilePathTextField.setText(showFileChooser(userPropertiesFileButton.getParent(),
|
||||
userPropertiesFilePathTextField, false, new String[] { ".properties" }));
|
||||
break;
|
||||
case BROWSE_CSV:
|
||||
csvFilePathTextField.setText(showFileChooser(csvFileButton.getParent(), csvFilePathTextField, false,
|
||||
new String[] { ".jtl", ".csv" }));
|
||||
break;
|
||||
case BROWSE_OUTPUT:
|
||||
outputDirectoryPathTextField.setText(
|
||||
showFileChooser(outputDirectoryButton.getParent(), outputDirectoryPathTextField, true, null));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void reportToUser(List<String> runErrors) {
|
||||
if (runErrors.isEmpty()) {
|
||||
addTextToReport(JMeterUtils.getResString(HtmlReportGenerator.HTML_REPORT_SUCCESS));
|
||||
reportLaunchButton.setForeground(Color.green);
|
||||
} else {
|
||||
addTextToReport(String.join("\n", runErrors));
|
||||
reportLaunchButton.setForeground(Color.red);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a file chooser to the user
|
||||
*
|
||||
* @param locationTextField
|
||||
* the textField that will receive the path
|
||||
* @param onlyDirectory
|
||||
* whether or not the file chooser will only display directories
|
||||
* @param extensions File extensions to filter
|
||||
* @return the path the user selected or, if the user cancelled the file
|
||||
* chooser, the previous path
|
||||
*/
|
||||
private String showFileChooser(Component component, JTextField locationTextField, boolean onlyDirectory, String[] extensions) {
|
||||
JFileChooser fileChooser = FileDialoger.promptToOpenFile(component, extensions, System.getProperty("user.home"), onlyDirectory);
|
||||
if (fileChooser == null) {
|
||||
return locationTextField.getText();
|
||||
}
|
||||
return fileChooser.getSelectedFile().getPath();
|
||||
}
|
||||
}
|
||||
|
|
@ -60,6 +60,7 @@ public final class ActionNames {
|
|||
public static final String FUNCTIONS = "functions"; // $NON-NLS-1$
|
||||
public static final String HELP = "help"; // $NON-NLS-1$
|
||||
public static final String HEAP_DUMP = "heap_dump"; // $NON-NLS-1$
|
||||
public static final String HTML_REPORT = "html_report";
|
||||
public static final String LAF_PREFIX = "laf:"; // Look and Feel prefix
|
||||
public static final String LINK_BUG_TRACKER = "link_bug_tracker:"; // URI of bug tracker
|
||||
public static final String LINK_COMP_REF = "link_component_reference:"; // URI of component reference
|
||||
|
|
|
|||
|
|
@ -0,0 +1,186 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You 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.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.apache.jmeter.gui.action;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.jmeter.util.JMeterUtils;
|
||||
import org.apache.jorphan.exec.SystemCommand;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class HtmlReportGenerator {
|
||||
|
||||
public static final String HTML_REPORT_SUCCESS = "generate_report_ui.html_report_success";
|
||||
public static final String ERROR_GENERATING = "generate_report_ui.html_report_error";
|
||||
public static final String NO_FILE = "generate_report_ui.no_such_file";
|
||||
public static final String NO_DIRECTORY = "generate_report_ui.no_such_directory";
|
||||
public static final String NOT_EMPTY_DIRECTORY = "generate_report_ui.directory_not_empty";
|
||||
public static final String CANNOT_CREATE_DIRECTORY = "generate_report_ui.cannot_create_directory";
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(HtmlReportGenerator.class);
|
||||
private static final long COMMAND_TIMEOUT = JMeterUtils.getPropDefault("generate_report_ui.generation_timeout", 120000L);
|
||||
|
||||
private String csvFilePath;
|
||||
private String userPropertiesFilePath;
|
||||
private String outputDirectoryPath;
|
||||
|
||||
public HtmlReportGenerator(String csvFilePath, String userPropertiesFilePath, String outputDirectoryPath) {
|
||||
this.csvFilePath = csvFilePath;
|
||||
this.userPropertiesFilePath = userPropertiesFilePath;
|
||||
if (outputDirectoryPath == null) {
|
||||
this.outputDirectoryPath = JMeterUtils.getJMeterBinDir() + "/report-output/";
|
||||
} else {
|
||||
this.outputDirectoryPath = outputDirectoryPath;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Prepare and Run the HTML report generation command
|
||||
*/
|
||||
public List<String> run() {
|
||||
List<String> errorMessageList = new ArrayList<>();
|
||||
errorMessageList.addAll(checkArguments());
|
||||
if (!errorMessageList.isEmpty()) {
|
||||
return errorMessageList;
|
||||
}
|
||||
|
||||
ByteArrayOutputStream commandExecutionOutput = new ByteArrayOutputStream();
|
||||
int resultCode = -1;
|
||||
List<String> generationCommand = createGenerationCommand();
|
||||
try {
|
||||
SystemCommand sc = new SystemCommand(new File(JMeterUtils.getJMeterBinDir()), COMMAND_TIMEOUT, 100, null, null,
|
||||
commandExecutionOutput, null);
|
||||
LOGGER.debug("Running report generation");
|
||||
resultCode = sc.run(generationCommand);
|
||||
if (resultCode != 0) {
|
||||
errorMessageList.add(commandExecutionOutput.toString());
|
||||
LOGGER.info("The HTML report generation failed and returned: {}", commandExecutionOutput);
|
||||
return errorMessageList;
|
||||
}
|
||||
} catch (InterruptedException | IOException e) {
|
||||
errorMessageList.add(commandExecutionOutput.toString());
|
||||
if (LOGGER.isErrorEnabled()) {
|
||||
LOGGER.error("Error during HTML report generation: {}", e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
LOGGER.debug("SystemCommand ran: {} returned: {}", generationCommand, resultCode);
|
||||
return errorMessageList;
|
||||
}
|
||||
|
||||
/**
|
||||
* create the command for html report generation with all the directories /
|
||||
* file
|
||||
*
|
||||
* @return the list of arguments for SystemCommand execution
|
||||
*/
|
||||
private List<String> createGenerationCommand() {
|
||||
String jmeterBinDir = JMeterUtils.getJMeterBinDir();
|
||||
List<String> arguments = new ArrayList<>();
|
||||
String java = System.getProperty("java.home") + "/bin/java";
|
||||
arguments.add(java);
|
||||
arguments.add("-jar");
|
||||
arguments.add(jmeterBinDir + "/ApacheJMeter.jar");
|
||||
arguments.add("-p");
|
||||
arguments.add(jmeterBinDir + "/jmeter.properties");
|
||||
arguments.add("-q");
|
||||
arguments.add(userPropertiesFilePath);
|
||||
arguments.add("-g");
|
||||
arguments.add(csvFilePath);
|
||||
arguments.add("-j");
|
||||
arguments.add(jmeterBinDir + "/jmeter_html_report.log");
|
||||
arguments.add("-o");
|
||||
arguments.add(outputDirectoryPath);
|
||||
return arguments;
|
||||
}
|
||||
|
||||
/**
|
||||
* test that all arguments are correct and send a message to the user if not
|
||||
*
|
||||
* @return whether or not the files are correct
|
||||
*/
|
||||
private List<String> checkArguments() {
|
||||
List<String> errors = new ArrayList<>();
|
||||
|
||||
String csvError = checkFile(new File(csvFilePath));
|
||||
if (csvError != null) {
|
||||
errors.add(JMeterUtils.getResString("generate_report_ui.csv_file") + csvError);
|
||||
}
|
||||
|
||||
String userPropertiesError = checkFile(new File(userPropertiesFilePath));
|
||||
if (userPropertiesError != null) {
|
||||
errors.add(JMeterUtils.getResString("generate_report_ui.user_properties_file") + userPropertiesError);
|
||||
}
|
||||
|
||||
String outputError = checkDirectory(new File(outputDirectoryPath));
|
||||
if (outputError != null) {
|
||||
errors.add(JMeterUtils.getResString("generate_report_ui.output_directory") + outputError);
|
||||
}
|
||||
return errors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a file is correct for report generation
|
||||
*
|
||||
* @param fileToCheck
|
||||
* the directory to check
|
||||
* @return the error message or null if the file is ok
|
||||
*/
|
||||
private String checkFile(File fileToCheck) {
|
||||
if (fileToCheck.exists() && fileToCheck.canRead() && fileToCheck.isFile()) {
|
||||
return null;
|
||||
} else {
|
||||
return MessageFormat.format(JMeterUtils.getResString(NO_FILE), fileToCheck);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a directory is fine for report generation
|
||||
*
|
||||
* @param directoryToCheck
|
||||
* the directory to check
|
||||
* @return the error message or an empty string if the directory is fine
|
||||
*/
|
||||
private String checkDirectory(File directoryToCheck) {
|
||||
if (directoryToCheck.exists()) {
|
||||
String[] files = directoryToCheck.list();
|
||||
if (files != null && files.length > 0) {
|
||||
return MessageFormat.format(JMeterUtils.getResString(NOT_EMPTY_DIRECTORY), directoryToCheck);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
File parentDirectory = directoryToCheck.getParentFile();
|
||||
if(parentDirectory != null && parentDirectory.exists() && parentDirectory.canWrite()) {
|
||||
if(directoryToCheck.mkdir()) {
|
||||
return null;
|
||||
} else {
|
||||
return MessageFormat.format(JMeterUtils.getResString(CANNOT_CREATE_DIRECTORY), directoryToCheck);
|
||||
}
|
||||
} else {
|
||||
return MessageFormat.format(JMeterUtils.getResString(CANNOT_CREATE_DIRECTORY), directoryToCheck);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
package org.apache.jmeter.gui.util;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.io.File;
|
||||
|
||||
import javax.swing.JFileChooser;
|
||||
|
|
@ -151,7 +152,29 @@ public final class FileDialoger {
|
|||
* @return the JFileChooser that interacted with the user, after they are
|
||||
* finished using it - null if no file was chosen
|
||||
*/
|
||||
public static JFileChooser promptToOpenFile(String[] exts, String existingFileName, boolean onlyDirectories) {
|
||||
public static JFileChooser promptToOpenFile(String[] exts, String existingFileName, boolean onlyDirectories) {
|
||||
return promptToOpenFile(GuiPackage.getInstance().getMainFrame(), exts, existingFileName, onlyDirectories);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prompts the user to choose a file or a directory from their filesystems for our own
|
||||
* devious uses. This method maintains the last directory the user visited
|
||||
* before dismissing the dialog. This does NOT imply they actually chose a
|
||||
* file from that directory, only that they closed the dialog there. It is
|
||||
* the caller's responsibility to check to see if the selected file is
|
||||
* non-null.
|
||||
* @param parentComponent Component parent of current element
|
||||
* @param exts The list of allowed file extensions. If empty, any
|
||||
* file extension is allowed
|
||||
* @param existingFileName The name of a file with path. If the filename points
|
||||
* to an existing file, the directory in which it lies, will be used
|
||||
* as the starting point for the returned JFileChooser.
|
||||
* @param onlyDirectories If true, only directories are displayed in the FileChooser
|
||||
*
|
||||
* @return the JFileChooser that interacted with the user, after they are
|
||||
* finished using it - null if no file was chosen
|
||||
*/
|
||||
public static JFileChooser promptToOpenFile(Component parentComponent, String[] exts, String existingFileName, boolean onlyDirectories) {
|
||||
if (onlyDirectories) {
|
||||
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
|
||||
} else {
|
||||
|
|
@ -181,7 +204,7 @@ public final class FileDialoger {
|
|||
lastJFCDirectory = System.getProperty("user.dir", ""); //$NON-NLS-1$//$NON-NLS-2$
|
||||
}
|
||||
jfc.setCurrentDirectory(new File(lastJFCDirectory));
|
||||
int retVal = jfc.showOpenDialog(GuiPackage.getInstance().getMainFrame());
|
||||
int retVal = jfc.showOpenDialog(parentComponent);
|
||||
lastJFCDirectory = jfc.getCurrentDirectory().getAbsolutePath();
|
||||
|
||||
if (retVal == JFileChooser.APPROVE_OPTION) {
|
||||
|
|
|
|||
|
|
@ -395,6 +395,21 @@ gaussian_timer_range=Deviation (in milliseconds)\:
|
|||
gaussian_timer_title=Gaussian Random Timer
|
||||
generate=Generate & Copy to clipboard
|
||||
generator=Name of Generator class
|
||||
generate_report_ui.directory_not_empty=The directory {0} isn't empty
|
||||
generate_report_ui.no_such_directory=The specified directory {0} doesn't exist
|
||||
generate_report_ui.cannot_create_directory=Cannot create output folder {0}
|
||||
generate_report_ui.user_properties_file=user.properties file \:
|
||||
generate_report_ui.csv_file=Results file (csv or jtl) \:
|
||||
generate_report_ui.html_report=HTML report
|
||||
generate_report_ui.html_report_error=Error generating report
|
||||
generate_report_ui.html_report_file_not_found=File not found at \: {0}
|
||||
generate_report_ui.html_report_menu=Generate HTML report
|
||||
generate_report_ui.html_report_processing=Generating report
|
||||
generate_report_ui.html_report_request=Generate report
|
||||
generate_report_ui.html_report_success=Report created !
|
||||
generate_report_ui.html_report_unknown_error=Error \: {0}
|
||||
generate_report_ui.no_such_file=The specified file {0} doesn't exist
|
||||
generate_report_ui.output_directory=Output directory \:
|
||||
generator_cnf_msg=Could not find the generator class. Please make sure you place your jar file in the /lib directory.
|
||||
generator_illegal_msg=Could not access the generator class due to IllegalAccessException.
|
||||
generator_instantiate_msg=Could not create an instance of the generator parser. Please make sure the generator implements Generator interface.
|
||||
|
|
|
|||
|
|
@ -389,6 +389,21 @@ gaussian_timer_range=Déviation (en millisecondes) \:
|
|||
gaussian_timer_title=Compteur de temps aléatoire gaussien
|
||||
generate=Générer et copier dans le presse-papiers
|
||||
generator=Nom de la classe génératrice
|
||||
generate_report_ui.directory_not_empty=Le répertoire {0} n'est pas vide
|
||||
generate_report_ui.no_such_directory=Le répertoire spécifié {0} n'existe pas
|
||||
generate_report_ui.cannot_create_directory=Création du répertoire {0} impossible
|
||||
generate_report_ui.user_properties_file=Fichier user.properties \:
|
||||
generate_report_ui.csv_file=Fichier de résultats (csv ou jtl) \:
|
||||
generate_report_ui.html_report=Rapport HTML
|
||||
generate_report_ui.html_report_error=Erreur lors de la génération du rapport
|
||||
generate_report_ui.html_report_file_not_found=Le fichier \: {0} n'' a pas été trouvé
|
||||
generate_report_ui.html_report_menu=Générer le rapport HTML
|
||||
generate_report_ui.html_report_processing=Génération du rapport en cours
|
||||
generate_report_ui.html_report_request=Générer le rapport
|
||||
generate_report_ui.html_report_success=Rapport créé !
|
||||
generate_report_ui.html_report_unknown_error=Erreur \: {0}
|
||||
generate_report_ui.no_such_file=Le fichier spécifié {0} n'existe pas
|
||||
generate_report_ui.output_directory=Répertoire de sortie \ :
|
||||
generator_cnf_msg=N'a pas pû trouver la classe génératrice. Assurez-vous que vous avez placé votre fichier jar dans le répertoire /lib
|
||||
generator_illegal_msg=N'a pas pû accéder à la classes génératrice à cause d'une IllegalAccessException.
|
||||
generator_instantiate_msg=N'a pas pû créer une instance du parseur générateur. Assurez-vous que le générateur implémente l'interface Generator.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You 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.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.apache.jmeter.gui;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
|
||||
import org.apache.jmeter.gui.tree.JMeterCellRenderer
|
||||
import org.apache.jmeter.gui.tree.JMeterTreeListener
|
||||
import org.apache.jmeter.gui.tree.JMeterTreeModel
|
||||
import org.apache.jmeter.junit.spock.JMeterSpec
|
||||
|
||||
import spock.lang.IgnoreIf
|
||||
|
||||
@IgnoreIf({ JMeterSpec.isHeadless() })
|
||||
class HtmlReportGUISpec extends JMeterSpec{
|
||||
|
||||
def "test HtmlReportUI initialization"(){
|
||||
given:
|
||||
def HtmlReportUI htmlReportPanel = new HtmlReportUI();
|
||||
def JMeterTreeModel treeModel = new JMeterTreeModel();
|
||||
def JMeterTreeListener treeListener = new JMeterTreeListener(treeModel);
|
||||
GuiPackage.initInstance(treeListener, treeModel);
|
||||
GuiPackage.getInstance().setMainFrame(new MainFrame(treeModel, treeListener));
|
||||
when:
|
||||
htmlReportPanel.showInputDialog(GuiPackage.getInstance().getMainFrame())
|
||||
htmlReportPanel.messageDialog.setVisible(false)
|
||||
then:
|
||||
"" == htmlReportPanel.csvFilePathTextField.getText()
|
||||
"" == htmlReportPanel.userPropertiesFilePathTextField.getText()
|
||||
"" == htmlReportPanel.outputDirectoryPathTextField.getText()
|
||||
"" == htmlReportPanel.reportArea.getText()
|
||||
1 == htmlReportPanel.messageDialog.getComponents().length;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,128 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You 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.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.apache.jmeter.gui.action
|
||||
|
||||
import spock.lang.IgnoreIf
|
||||
import spock.lang.Unroll
|
||||
|
||||
import java.text.MessageFormat
|
||||
|
||||
import org.apache.commons.io.FileUtils
|
||||
import org.apache.jmeter.junit.spock.JMeterSpec
|
||||
import org.apache.jmeter.util.JMeterUtils
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonMerge
|
||||
import com.fasterxml.jackson.databind.JsonNode
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
|
||||
class HtmlReportGeneratorSpec extends JMeterSpec{
|
||||
|
||||
def "check if generation from csv: '#csvPath' with properties: '#userPropertiesPath' in folder: '#outputDirectoryPath' contains the expected error"(){
|
||||
when:
|
||||
HtmlReportGenerator htmlReportGenerator = new HtmlReportGenerator(csvPath, userPropertiesPath, outputDirectoryPath)
|
||||
List<String> resultList = htmlReportGenerator.checkArguments()
|
||||
then:
|
||||
resultList.equals(expected)
|
||||
where:
|
||||
csvPath | userPropertiesPath | outputDirectoryPath | expected
|
||||
JMeterUtils.getJMeterBinDir()+"/testfiles/HTMLReportTestFile.csv" | JMeterUtils.getJMeterBinDir()+"/user.properties" | JMeterUtils.getJMeterBinDir()+"/testfiles/testReport" | []
|
||||
JMeterUtils.getJMeterBinDir()+"/testfiles/HTMLReportTestFile.csv" | JMeterUtils.getJMeterBinDir()+"/user.properties" | JMeterUtils.getJMeterBinDir()+"/testfiles" | [
|
||||
JMeterUtils.getResString("generate_report_ui.output_directory") + MessageFormat.format(JMeterUtils.getResString(HtmlReportGenerator.NOT_EMPTY_DIRECTORY), outputDirectoryPath)
|
||||
]
|
||||
JMeterUtils.getJMeterBinDir()+"/testfiles/HTMLReportTestFileMissing.csv" | JMeterUtils.getJMeterBinDir()+"/user.properties" | JMeterUtils.getJMeterBinDir()+"/testfiles/testReport" | [
|
||||
JMeterUtils.getResString("generate_report_ui.csv_file") + MessageFormat.format(JMeterUtils.getResString(HtmlReportGenerator.NO_FILE), csvPath)
|
||||
]
|
||||
"" | "" | "" | [
|
||||
JMeterUtils.getResString("generate_report_ui.csv_file") + MessageFormat.format(JMeterUtils.getResString(HtmlReportGenerator.NO_FILE), csvPath),
|
||||
JMeterUtils.getResString("generate_report_ui.user_properties_file") + MessageFormat.format(JMeterUtils.getResString(HtmlReportGenerator.NO_FILE), userPropertiesPath),
|
||||
JMeterUtils.getResString("generate_report_ui.output_directory") + MessageFormat.format(JMeterUtils.getResString(HtmlReportGenerator.CANNOT_CREATE_DIRECTORY), outputDirectoryPath)
|
||||
]
|
||||
JMeterUtils.getJMeterBinDir()+"/testfiles/HTMLReportTestFile.csv" | JMeterUtils.getJMeterBinDir()+"/user.properties" | JMeterUtils.getJMeterBinDir()+"/testfiles/testReport/oneLevel/twolevel" | [
|
||||
JMeterUtils.getResString("generate_report_ui.output_directory") + MessageFormat.format(JMeterUtils.getResString(HtmlReportGenerator.CANNOT_CREATE_DIRECTORY), outputDirectoryPath)
|
||||
]
|
||||
}
|
||||
|
||||
def "check that report generation succeeds and statistic are generated"(){
|
||||
setup:
|
||||
File testDirectory = new File(JMeterUtils.getJMeterBinDir(), "/testfiles/testReport")
|
||||
if(testDirectory.exists()) {
|
||||
if (testDirectory.list().length>0) {
|
||||
FileUtils.cleanDirectory(testDirectory)
|
||||
}
|
||||
} else {
|
||||
testDirectory.mkdir()
|
||||
}
|
||||
ObjectMapper mapper = new ObjectMapper()
|
||||
File expected = new File(JMeterUtils.getJMeterBinDir(),"/testfiles/HTMLReportExpect.json")
|
||||
JsonNode expectedRoot = null;
|
||||
expected.withReader { jsonFileReader ->
|
||||
expectedRoot = mapper.readTree(jsonFileReader)
|
||||
}
|
||||
when:
|
||||
HtmlReportGenerator htmlReportGenerator = new HtmlReportGenerator(
|
||||
JMeterUtils.getJMeterBinDir() + "/testfiles/HTMLReportTestFile.csv",
|
||||
JMeterUtils.getJMeterBinDir() + "/user.properties",
|
||||
JMeterUtils.getJMeterBinDir() + "/testfiles/testReport")
|
||||
List<String> resultList = htmlReportGenerator.run()
|
||||
File statistics = new File(JMeterUtils.getJMeterBinDir(), "/testfiles/testReport/statistics.json")
|
||||
JsonNode actualRoot = null;
|
||||
if (statistics.exists()) {
|
||||
statistics.withReader { jsonFileReader ->
|
||||
actualRoot = mapper.readTree(jsonFileReader)
|
||||
}
|
||||
}
|
||||
then:
|
||||
resultList.isEmpty()
|
||||
statistics.exists()
|
||||
expectedRoot == actualRoot
|
||||
cleanup:
|
||||
if(testDirectory.exists()) {
|
||||
if (testDirectory.list().length>0) {
|
||||
FileUtils.cleanDirectory(testDirectory)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def "check that report generation fails when format does not match and error is reported"(){
|
||||
setup:
|
||||
File testDirectory = new File(JMeterUtils.getJMeterBinDir(),"/testfiles/testReportThatShouldBeEmpty")
|
||||
if(testDirectory.exists()) {
|
||||
if (testDirectory.list().length>0) {
|
||||
FileUtils.cleanDirectory(testDirectory)
|
||||
}
|
||||
} else {
|
||||
testDirectory.mkdir()
|
||||
}
|
||||
when:
|
||||
HtmlReportGenerator htmlReportGenerator = new HtmlReportGenerator(
|
||||
JMeterUtils.getJMeterBinDir() + "/testfiles/HTMLReportFalseTestFile.csv",
|
||||
JMeterUtils.getJMeterBinDir() + "/user.properties",
|
||||
JMeterUtils.getJMeterBinDir() + "/testfiles/testReport")
|
||||
List<String> resultList = htmlReportGenerator.run()
|
||||
then:
|
||||
testDirectory.list().length == 0
|
||||
resultList.get(0).contains("An error occurred: Error while processing samples:Consumer failed with message")
|
||||
cleanup:
|
||||
if(testDirectory.exists()) {
|
||||
if (testDirectory.list().length>0) {
|
||||
FileUtils.cleanDirectory(testDirectory)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -107,6 +107,7 @@ Summary
|
|||
|
||||
<h3>Report / Dashboard</h3>
|
||||
<ul>
|
||||
<li><bug>59896</bug> Report / Dashboard : Add a menu entry to generate a report on demand from a CSV file. Contributed by Ubik Load Pack (support at ubikloadpack.com)</li>
|
||||
</ul>
|
||||
|
||||
<h3>General</h3>
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
|
|
@ -7,6 +7,7 @@
|
|||
<!DOCTYPE document[
|
||||
<!ENTITY sect-num '14'>
|
||||
<!ENTITY hellip "…" >
|
||||
<!ENTITY rarr "→" >
|
||||
]>
|
||||
|
||||
<document prev="remote-test.html" next="realtime-results.html" id="$Id$">
|
||||
|
|
@ -586,6 +587,22 @@ jmeter.reportgenerator.exporter.html.filters_only_sample_series=true
|
|||
</subsection>
|
||||
</subsection>
|
||||
|
||||
<subsection name="§-num;.3.3 Generation using GUI Tools menu" anchor="report_gui">
|
||||
<p>
|
||||
You can generate the HTML report using menu item <code>Tools → Generate HTML report</code>:
|
||||
<figure image="html_report_menu.png">Figure §-num;.1. HTML Report Dialog Menu</figure>
|
||||
</p>
|
||||
<p>For each parameters see the following table :</p>
|
||||
<properties>
|
||||
<property name="Results file (csv or jtl)" required="Yes">The CSV output of a tes run</property>
|
||||
<property name="user.properties file" required="Yes">The user.properties file used to run the load test</property>
|
||||
<property name="Output directory" required="No">The directory where you want the report to be created(must be empty)</property>
|
||||
</properties>
|
||||
<p>If no output directory is defined, the controller will use <code>${JMETER_HOME}/bin/report-output</code>.</p>
|
||||
<p>You then only have to click on the <code>Generate report</code> button and wait for an information dialog to appear
|
||||
<note>If report generation takes more than two minutes, adjust the property <code>generate_report_ui.generation_timeout</code></note></p>
|
||||
</subsection>
|
||||
|
||||
<subsection name="§-num;.4 Default graphs" anchor="default_graphs">
|
||||
<note>Due to limitations of this early version, each default graph
|
||||
must be declared in JMeter properties. Otherwise, the graph
|
||||
|
|
|
|||
|
|
@ -1771,6 +1771,10 @@ JMETER-SERVER</source>
|
|||
End date of report using date_format property.<br/>
|
||||
Defaults to: nothing
|
||||
</property>
|
||||
<property name="generate_report_ui.generation_timeout">
|
||||
Timeout in milliseconds for Report generation when using Tools > Generate HTML report.<br/>
|
||||
Defaults to: 120000
|
||||
</property>
|
||||
</properties>
|
||||
</section>
|
||||
<section name="§-num;.38 Additional property files to load" anchor="properties">
|
||||
|
|
|
|||
Loading…
Reference in New Issue