Browse Source

Stabile und schnellere Maskenausführung #6

qa_0.6_Release
Daniel Quathamer 1 year ago
parent
commit
68e05ad7f0
  1. 1
      src-modules/module/qa/conf/includes.txt
  2. 15
      src-modules/module/qa/conf/qa.xml
  3. 9
      src-modules/module/qa/datentabellen/qa_mask_execution_result_purge.sql
  4. 11
      src-modules/module/qa/datentabellen/vacuum_pg.sql
  5. 2
      src-modules/module/qa/masken/37020_maskeninfo.unl
  6. 6
      src-modules/module/qa/masken/37040_maskeninfo.unl
  7. 27
      src-modules/module/qa/qa_mask_execution_loop.x
  8. 5
      src-modules/module/qa/qa_update.x
  9. 15
      src-modules/module/qa/upgrade/qa_upgrade_man.sql
  10. 214
      src/de/superx/qa/bin/QaTestcaseExecutor.java
  11. 20
      superx/WEB-INF/conf/edustore/db/bin/qa_mask_execution.x
  12. BIN
      superx/WEB-INF/lib/superx-qa.jar
  13. 197
      superx/xml/tabelle_html_qa.xsl

1
src-modules/module/qa/conf/includes.txt

@ -3,3 +3,4 @@ WEB-INF/conf/edustore/db/bin/SQL_ENV_qa.sam
WEB-INF/conf/edustore/db/bin/qa_mask_execution.x WEB-INF/conf/edustore/db/bin/qa_mask_execution.x
WEB-INF/conf/edustore/db/bin/qa_tc_execution_mail.x WEB-INF/conf/edustore/db/bin/qa_tc_execution_mail.x
WEB-INF/lib/superx-qa.jar WEB-INF/lib/superx-qa.jar
xml/tabelle_html_qa.xsl

15
src-modules/module/qa/conf/qa.xml

@ -213,11 +213,11 @@ notnull="true">
<column name="result_log" type="TEXT" size="" default="" description="Logdatei Ausführung" notnull="false"> <column name="result_log" type="TEXT" size="" default="" description="Logdatei Ausführung" notnull="false">
<comment></comment> <comment></comment>
</column> </column>
<column name="result_stream" type="TEXT" size="255" default="" notnull="false" description="Ausgabe"> <column name="result_xml" type="TEXT" size="255" default="" notnull="false" description="Ausgabe (XML)">
<comment>CSV oder XML</comment> <comment>XML</comment>
</column> </column>
<column name="result_stream_contenttype" type="VARCHAR" size="255" default="" notnull="false" description="Ausgabeformat"> <column name="result_html" type="TEXT" size="255" default="" notnull="false" description="Ausgabe (HTML)">
<comment>HTML, Text, CSV oder XML</comment> <comment>HTML</comment>
</column> </column>
<!-- <!--
<column name="result_value" type="VARCHAR" size="255" default="" description="Rückgabewert" notnull="false"> <column name="result_value" type="VARCHAR" size="255" default="" description="Rückgabewert" notnull="false">
@ -985,7 +985,11 @@ format="%s">
database=""/> database=""/>
<nativeaction sql="" scriptfile="$QA_PFAD/datentabellen/qa_dbtest_ausfuehren.sql" <nativeaction sql="" scriptfile="$QA_PFAD/datentabellen/qa_dbtest_ausfuehren.sql"
database=""/> database=""/>
<nativeaction sql="update systeminfo set datum=today() where tid in (260)" scriptfile="" database=""/> <nativeaction sql="update systeminfo set datum=today() where tid in (260);" scriptfile="" database=""/>
</action>
<action error="stop">
<nativeaction sql="" scriptfile="$QA_PFAD/datentabellen/vacuum_pg.sql"
database="POSTGRES"/>
</action> </action>
</etl-step> </etl-step>
</etl> </etl>
@ -1006,6 +1010,7 @@ format="%s">
<action error="stop"> <action error="stop">
<nativeaction sql="" scriptfile="$QA_PFAD/schluesseltabellen/sx_jobs_fuellen.sql" database=""/> <nativeaction sql="" scriptfile="$QA_PFAD/schluesseltabellen/sx_jobs_fuellen.sql" database=""/>
<nativeaction sql="" scriptfile="$QA_PFAD/schluesseltabellen/sachgebiete_fuellen.sql" database=""/> <nativeaction sql="" scriptfile="$QA_PFAD/schluesseltabellen/sachgebiete_fuellen.sql" database=""/>
<nativeaction sql="" scriptfile="$QA_PFAD/upgrade/qa_upgrade_man.sql" database=""/>
</action> </action>
</upgrade-step> </upgrade-step>

9
src-modules/module/qa/datentabellen/qa_mask_execution_result_purge.sql

@ -1,7 +1,8 @@
--Speicherplatz sparen bei Erfolg: --Speicherplatz sparen: leeren der TEXT Spalten nach 6 Monaten:
update qa_mask_execution_result set result_stream=null, update qa_mask_execution_result set result_log=null,
result_stream_contenttype=null result_xml=null,
where result_code=0; result_html=null
where date(execution_start) < today()-180;

11
src-modules/module/qa/datentabellen/vacuum_pg.sql

@ -0,0 +1,11 @@
select * from xdummy;
--bei Postgres in HIS1 laufen alle Scripte in Transaktionen, daher muss man
--für vacuum erst committen
commit;
vacuum qa_mask_execution_result;
vacuum qa_mask_execution_assert_result;

2
src-modules/module/qa/masken/37020_maskeninfo.unl

@ -363,4 +363,4 @@ Column CID=1 heading_text="Bearbeiten" center_heading\
row_selectable col_selectable heading_platform readonly\ row_selectable col_selectable heading_platform readonly\
width=5 text_size=200\ width=5 text_size=200\
</#if>\ </#if>\
@@@^^^Protokoll der Masken-Ausführung ausgeben^drop table tmp_testcase;^^1^440^360^0^1^^ @@@^^^Protokoll der Testfall-Ausführung ausgeben^drop table tmp_testcase;^^1^440^360^0^1^^

6
src-modules/module/qa/masken/37040_maskeninfo.unl

@ -64,7 +64,8 @@ result_log,\
result_value_min,\ result_value_min,\
result_value_max,\ result_value_max,\
result_value,\ result_value,\
result_status_str\ result_status_str,\
'../edit/qa/qa_show_mask_execution_result.jsp|tid=' || tid as nextedit\
from tmp_qa_mask_execution\ from tmp_qa_mask_execution\
order by 1,2,3;^XIL List\ order by 1,2,3;^XIL List\
drop_and_delete movable_columns sizable_columns horizontal_scrolling\ drop_and_delete movable_columns sizable_columns horizontal_scrolling\
@ -94,4 +95,7 @@ Column CID=1 heading_text="Wert" center_heading\
Column CID=1 heading_text="Ausführungsstatus" center_heading\ Column CID=1 heading_text="Ausführungsstatus" center_heading\
row_selectable col_selectable heading_platform readonly\ row_selectable col_selectable heading_platform readonly\
width=15 text_size=200\ width=15 text_size=200\
Column CID=1 heading_text="Ergebnis-HTML" center_heading\
row_selectable col_selectable heading_platform readonly\
width=15 text_size=200\
@@@^^^Detailausgabe des Protokolls einer Maskenausführung^drop table tmp_qa_mask_execution;^^1^440^360^0^1^^ @@@^^^Detailausgabe des Protokolls einer Maskenausführung^drop table tmp_qa_mask_execution;^^1^440^360^0^1^^

27
src-modules/module/qa/qa_mask_execution_loop.x

@ -0,0 +1,27 @@
#!/bin/bash
function exitAfterError
{
echo "Testfall Error"
date
}
trap exitAfterError ERR
TC_ALL=`psql --dbname=$DBNAME --tuples-only -c "select uniquename from qa_mask_execution where is_active=1 order by 1"`
cd $WEBAPP/WEB-INF
for TC in ${TC_ALL} ; do
echo -e "-- Start Testfall $TC `date`"
echo -e "######################################\n\n"
qa_mask_execution.x "-tc:$TC"
echo -e "-- Ende Testfall $TC `date`"
echo -e "######################################\n\n"
done

5
src-modules/module/qa/qa_update.x

@ -37,10 +37,9 @@ fi
date +'%d.%m.%Y' > $QA_LOAD_PFAD/superx.datum date +'%d.%m.%Y' > $QA_LOAD_PFAD/superx.datum
echo "qa-Update startet" >$QA_ERRORDAT echo "qa-Update startet" >$QA_ERRORDAT
cd $QA_PFAD
qa_mask_execution_loop.x > $QA_PFAD/L_QA_update_Masken$MANDANTID.log 2>&1
cd $WEBAPP/WEB-INF
qa_mask_execution.x > $QA_PFAD/L_QA_update_Masken$MANDANTID.log 2>&1
runAndCheck.x $QA_PFAD "module_etl.x qa $QA_PFAD $QA_LOAD_PFAD" EXIT_ON_ERROR SEND_ERRORMAIL SEND_LOGMAIL "QA update$MANDANTID" runAndCheck.x $QA_PFAD "module_etl.x qa $QA_PFAD $QA_LOAD_PFAD" EXIT_ON_ERROR SEND_ERRORMAIL SEND_LOGMAIL "QA update$MANDANTID"
cat $QA_PFAD/L_QA_update_Masken$MANDANTID.log >>$QA_PFAD/L_QA_update$MANDANTID.log cat $QA_PFAD/L_QA_update_Masken$MANDANTID.log >>$QA_PFAD/L_QA_update$MANDANTID.log
echo "---------------------------Beginn Prüfroutine-----------------------------------" >>$QA_ERRORDAT echo "---------------------------Beginn Prüfroutine-----------------------------------" >>$QA_ERRORDAT

15
src-modules/module/qa/upgrade/qa_upgrade_man.sql

@ -0,0 +1,15 @@
--mit Version 0.6 werden Erwartungen in den Protokolltabellen mitgespeichert. So wird verhindert dass ein altes Testfall-Ergebnis durch eine Änderung der Erwartung verfälscht wird.
update qa_mask_execution_assert_result set assert_result_value_min=(select A.result_value_min
from qa_mask_execution_assert A where A.tid=qa_mask_execution_assert_result.mask_execution_assert_id)
where assert_result_value_min is null;
update qa_mask_execution_assert_result set assert_result_value_max=(select A.result_value_max
from qa_mask_execution_assert A where A.tid=qa_mask_execution_assert_result.mask_execution_assert_id)
where assert_result_value_max is null;
--Obsolete Maske:
delete from themenbaum where maskeninfo_id=37100;

214
src/de/superx/qa/bin/QaTestcaseExecutor.java

@ -7,17 +7,40 @@
*/ */
package de.superx.qa.bin; package de.superx.qa.bin;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringReader; import java.io.StringReader;
import java.io.StringWriter;
import java.net.URISyntaxException;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Properties; import java.util.Properties;
import java.util.StringTokenizer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactoryConfigurationError;
import org.apache.log4j.Appender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.LoggerFactory;
import org.jaxen.JaxenException; import org.jaxen.JaxenException;
import org.jaxen.XPath; import org.jaxen.XPath;
@ -30,8 +53,11 @@ import org.jdom.input.SAXBuilder;
import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockServletConfig; import org.springframework.mock.web.MockServletConfig;
import org.w3c.dom.NodeList;
import de.memtext.baseobjects.coll.NamedIdObjectList; import de.memtext.baseobjects.coll.NamedIdObjectList;
import de.memtext.util.LogUtils;
import de.superx.bin.Dosql;
import de.superx.bin.SxConnection; import de.superx.bin.SxConnection;
import de.superx.common.FieldContainer; import de.superx.common.FieldContainer;
import de.superx.common.Maske; import de.superx.common.Maske;
@ -52,7 +78,7 @@ import net.sf.saxon.sxpath.XPathExpression;
public class QaTestcaseExecutor { public class QaTestcaseExecutor {
private static String tcUniquename; private static String tcUniquename;
private static String systeminfoId; private static int systeminfoId;
private static String fieldSelCmdLine; private static String fieldSelCmdLine;
private static int maskExecutionId; private static int maskExecutionId;
private static String maskeninfoId; private static String maskeninfoId;
@ -64,19 +90,35 @@ public class QaTestcaseExecutor {
private static FieldContainer myFieldContainer; private static FieldContainer myFieldContainer;
private static Hashtable<String, String> maskFields ; private static Hashtable<String, String> maskFields ;
private static String resultXml; private static String resultXml;
private static String resultHtml;
private static String resultLog; private static String resultLog;
private static String pathToDbProperties; private static String pathToDbProperties;
private static Connection myConnection; private static Connection myConnection;
private static String logFile;
public QaTestcaseExecutor() { public QaTestcaseExecutor() {
this.maskFields = new Hashtable(); this.maskFields = new Hashtable();
initLogging();
resultHtml="";
} }
private void init() throws SQLException private void init() throws SQLException, IOException, SecurityException, URISyntaxException
{ {
/*File f = new File(logConf);
if (!f.exists()) {
throw new IOException("Datei nicht gefunden: " + logConf);
}
FileInputStream ins = new FileInputStream(logConf);
LogManager MyLogManager = java.util.logging.LogManager.getLogManager();
MyLogManager.readConfiguration(ins);
String level = MyLogManager.getProperty(".level");
logger.info("Using Loggging-Level " + level);
logger.info("Start Lauf");*/
//initLogging(true, Level.INFO);
//logger.info("START");
try { try {
myConnection = this.getConnection(pathToDbProperties); myConnection = this.getConnection(pathToDbProperties);
} catch (Exception e) { } catch (Exception e) {
@ -89,7 +131,7 @@ public class QaTestcaseExecutor {
//System.out.println("fieldSel:"+fieldSel); //System.out.println("fieldSel:"+fieldSel);
System.out.println("inited"); writeToLog("QaTestcaseExecutor inited");
} }
@ -110,39 +152,38 @@ public class QaTestcaseExecutor {
} }
public static void main(String[] args) { public static void main(String[] args) {
String usage="usage: java de.superx.qa.bin.QaTestcaseExecutor -dbproperties:$DB_PROPERTIES -tc:abc -systeminfo_id:9 -params:TID=16000 (optional) -outfile:Ausgabedatei (optional)" ; String usage="usage: java de.superx.qa.bin.QaTestcaseExecutor -userid:1(optional) -tc:abc(optional) -systeminfo_id:9(optional)" ;
GetOpts.setOpts(args); GetOpts.setOpts(args);
String isdrin = GetOpts.isAllRequiredOptionsPresent("-logger,-dbproperties");
if (isdrin != null) {
System.err.println(usage);
System.exit(1);
}
int returnCode=0; int returnCode=0;
int nrOfTestcases=0; int nrOfTestcases=0;
int nrOfSuccessfulTestcases=0; int nrOfSuccessfulTestcases=0;
pathToDbProperties = GetOpts.getValue("-dbproperties"); if (GetOpts.isPresent("-userid"))
String tcUniquename="" ; userId = Integer.valueOf(GetOpts.getValue("-userid"));
if (GetOpts.isPresent("-tc")) if (GetOpts.isPresent("-tc"))
tcUniquename= GetOpts.getValue("-tc"); tcUniquename= GetOpts.getValue("-tc");
String systeminfoId="";
if (GetOpts.isPresent("-systeminfo_id")) if (GetOpts.isPresent("-systeminfo_id"))
systeminfoId= GetOpts.getValue("-systeminfo_id"); systeminfoId= Integer.valueOf(GetOpts.getValue("-systeminfo_id"));
String loggerArg=GetOpts.getValue("-logger");
QaTestcaseExecutor myExec=new QaTestcaseExecutor(); //TODO:Mandantid QaTestcaseExecutor myExec=new QaTestcaseExecutor(); //TODO:Mandantid
try { try {
myExec.init(); myExec.init();
int[] myTestcases=getTestcases(tcUniquename,systeminfoId); int[] myTestcases=getTestcases();
nrOfTestcases=myTestcases.length; nrOfTestcases=myTestcases.length;
if(nrOfTestcases>0) if(nrOfTestcases>0)
{ {
writeToLog("nrOfTestcases: "+nrOfTestcases);
for (int tcNr = 0;tcNr < nrOfTestcases; tcNr++) for (int tcNr = 0;tcNr < nrOfTestcases; tcNr++)
{ {
returnCode=executeTestcase(myTestcases[tcNr]); returnCode=executeTestcase(myTestcases[tcNr]);
//reset static variables:
resultLog="";
resultXml="";
resultHtml="";
tcUniquename="" ;
if(returnCode==0) if(returnCode==0)
nrOfSuccessfulTestcases++; nrOfSuccessfulTestcases++;
} }
@ -163,7 +204,7 @@ public class QaTestcaseExecutor {
} }
private static int[] getTestcases(String tcUniquename,String systeminfoId) throws Exception private static int[] getTestcases() throws Exception
{ {
//TODO_ Umlaute erlauben: //TODO_ Umlaute erlauben:
//if(!SqlStringUtils.checkValidKeyEntry(tcUniquename) || !SqlStringUtils.checkValidKeyEntry(systeminfoId)) //if(!SqlStringUtils.checkValidKeyEntry(tcUniquename) || !SqlStringUtils.checkValidKeyEntry(systeminfoId))
@ -175,10 +216,12 @@ public class QaTestcaseExecutor {
+ "FROM qa_mask_execution E left outer join userinfo U\n" + "FROM qa_mask_execution E left outer join userinfo U\n"
+ " on (U.tid=E.userinfo_id)" + " on (U.tid=E.userinfo_id)"
+ "where E.is_active=1"; + "where E.is_active=1";
if(!tcUniquename.equals("")) if(tcUniquename!=null)
sql +=" and E.uniquename ='"+tcUniquename+"'"; sql +=" and E.uniquename ='"+tcUniquename+"'";
if(!systeminfoId.equals("")) if(systeminfoId>0)
sql +=" and E.systeminfo_id="+systeminfoId; sql +=" and E.systeminfo_id="+systeminfoId;
if(userId>0)
sql +=" and E.userinfo_id="+userId;
sql +=" order by 1;"; sql +=" order by 1;";
SuperX_el el = new SuperX_el(); SuperX_el el = new SuperX_el();
SxSqlHelper sh=new SxSqlHelper(); SxSqlHelper sh=new SxSqlHelper();
@ -211,6 +254,7 @@ public class QaTestcaseExecutor {
String fieldSel=""; String fieldSel="";
String felderinfoId=""; String felderinfoId="";
String felderinfoName=""; String felderinfoName="";
String tcName="";
String fieldValue=""; String fieldValue="";
String sql = "" String sql = ""
+ "SELECT \n" + "SELECT \n"
@ -221,7 +265,9 @@ public class QaTestcaseExecutor {
+ "S.felderinfo_id,\n" + "S.felderinfo_id,\n"
+ "trim(F.name) as felderinfo_name," + "trim(F.name) as felderinfo_name,"
+ "string_not_null(S.field_value) as field_value, \n" + "string_not_null(S.field_value) as field_value, \n"
+ "U.administration " + "U.administration, \n"
+ "E.name, \n"
+ "E.uniquename \n"
+ "FROM felderinfo F,qa_mask_field_sel S, qa_mask_execution E left outer join userinfo U\n" + "FROM felderinfo F,qa_mask_field_sel S, qa_mask_execution E left outer join userinfo U\n"
+ " on (U.tid=E.userinfo_id)" + " on (U.tid=E.userinfo_id)"
+ "where F.tid=S.felderinfo_id " + "where F.tid=S.felderinfo_id "
@ -248,19 +294,22 @@ public class QaTestcaseExecutor {
felderinfoName=row.get(5).toString().trim(); felderinfoName=row.get(5).toString().trim();
fieldValue=row.get(6).toString().trim(); fieldValue=row.get(6).toString().trim();
userAdmin=row.get(7).toString().trim(); userAdmin=row.get(7).toString().trim();
tcName=row.get(8).toString().trim();
tcUniquename=row.get(9).toString().trim();
maskFields.put(felderinfoName,fieldValue); maskFields.put(felderinfoName,fieldValue);
} }
System.out.println("Testcase "+ maskExecutionId+" initialized"); writeToLog("Testcase "+tcName + "(Schlüssel="+tcUniquename+" ID="+ maskExecutionId+") initialized");
returnCode=executeMask(); returnCode=executeMask();
endtime = new java.util.Date().getTime() ; endtime = new java.util.Date().getTime() ;
int maskExecutionResultId=saveExecutionResult(returnCode,resultLog); writeToLog("Mask "+maskeninfoId +" executed in "+(endtime-starttime)/1000+" sec. with return Code "+returnCode);
int maskExecutionResultId=saveExecutionResult(maskExecutionId,returnCode,resultLog);
if(returnCode ==0) if(returnCode ==0)
{ {
returnCode=checkAssertions(maskExecutionResultId); returnCode=checkAssertions(maskExecutionId,maskExecutionResultId);
} }
else else
throw new Exception("Testcase error in masc execution "+maskExecutionId); writeToLog("Testcase error in masc execution "+maskExecutionId);
return returnCode; return returnCode;
} }
private static int executeMask() private static int executeMask()
@ -288,11 +337,11 @@ public class QaTestcaseExecutor {
user = UserInitializer.initUser(mandantenID, userName, userId, userAdmin); user = UserInitializer.initUser(mandantenID, userName, userId, userAdmin);
} catch (Exception e) { } catch (Exception e) {
System.err.println("Fehler beim Aufbau der Connection: " + e.toString()); writeToLog("Fehler beim Aufbau der Connection: " + e.toString());
System.exit(1); return 1;
} }
Locale desiredLocale = new Locale(de.superx.util.SqlStringUtils.getEncoding()); Locale desiredLocale = new Locale(de.superx.util.SqlStringUtils.getEncoding());
SuperXManager.maxRows = 1000000; SuperXManager.maxRows = 10000;
Maske maske = null; Maske maske = null;
InputCheckRegistry.registerDefaultChecks(); InputCheckRegistry.registerDefaultChecks();
try { try {
@ -302,29 +351,40 @@ public class QaTestcaseExecutor {
myFieldContainer.addAll(fields);*/ myFieldContainer.addAll(fields);*/
maske.setFieldDefaults(user, mock, true); maske.setFieldDefaults(user, mock, true);
resultXml=getResultXml(mock, mockResponse, maske, user, desiredLocale); resultXml=getResultXml(mock, mockResponse, maske, user, desiredLocale);
System.out.println("resultXml Länge " + resultXml.length() + " für Maske " + maskeninfoId + " erzeugt"); if(resultXml==null)
{
writeToLog("resultXml für Maske " + maskeninfoId + " konnte nicht erzeugt werden");
}
else
{
writeToLog("resultXml Länge " + resultXml.length() + " für Maske " + maskeninfoId + " erzeugt");
transformResultXmltoHtml();
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
resultLog="Fehler beim Ausführen der Maske " + maskeninfoId + ": " + e.toString(); resultLog="Fehler beim Ausführen der Maske " + maskeninfoId + ": " + e.toString();
returnCode=1; returnCode=1;
} }
user=null;
return returnCode; return returnCode;
} }
private static int checkAssertions(int maskExecutionResultId) throws Exception private static int checkAssertions(int execId,int maskExecutionResultId) throws Exception
{ {
int resultCode=0; int resultCode=0;
int assertionId,assertionRownr,assertionColnr; int assertionId,assertionRownr,assertionColnr;
Double minVal,maxVal,foundVal=null; Double minVal,maxVal,foundVal=null;
String caption;
String sql = "select " String sql = "select "
+"tid," +"tid,"
+"rownr," +"rownr,"
+"colnr," +"colnr,"
+"result_value_min," +"result_value_min,"
+"result_value_max" +"result_value_max,"
+ "caption"
+" from qa_mask_execution_assert" +" from qa_mask_execution_assert"
+ " where is_active=1" + " where is_active=1"
+" and mask_execution_id="+maskExecutionId+";"; +" and mask_execution_id="+execId+";";
/*try { /*try {
@ -353,19 +413,22 @@ public class QaTestcaseExecutor {
assertionColnr=(Integer) row.get(2); assertionColnr=(Integer) row.get(2);
minVal=(Double) row.get(3); minVal=(Double) row.get(3);
maxVal=(Double) row.get(4); maxVal=(Double) row.get(4);
caption=(String) row.get(5).toString();
try { try {
foundVal=getValFromXml(assertionRownr,assertionColnr); foundVal=getValFromXml(assertionRownr,assertionColnr);
} catch (Exception e) { } catch (Exception e) {
System.err.println("Testfall ID " +maskExecutionId+" mit Maskennr. "+maskeninfoId+ " Assertion-ID "+assertionId+ " kein Ergebnis "); writeToLog("Testfall ID " +execId+" mit Maskennr. "+maskeninfoId+ " Assertion-ID "+assertionId+ " " + caption+ " kein Ergebnis:\n" +e.toString());
resultCode=1;
return resultCode;
} }
if(foundVal != null && foundVal >=minVal && foundVal<=maxVal) if(foundVal != null && foundVal >=minVal && foundVal<=maxVal)
{ {
System.out.println("Testfall ID " +maskExecutionId+" mit Maskennr. "+maskeninfoId+ " Assertion-ID "+assertionId+ " erfolgreich"); writeToLog("Testfall ID " +execId+" mit Maskennr. "+maskeninfoId+ " Assertion-ID "+assertionId+ " " + caption+ " und Wert "+ foundVal+" erfolgreich");
} }
else else
{ {
resultCode=1; resultCode=1;
System.out.println("Testfall ID " +maskExecutionId+" mit Maskennr. "+maskeninfoId+ " Assertion-ID "+assertionId+ " beendet mit Warnung/Fehler"); writeToLog("Testfall ID " +execId+" mit Maskennr. "+maskeninfoId+ " Assertion-ID "+assertionId+ " " + caption +" und Wert "+ foundVal+ " beendet mit Warnung/Fehler");
} }
saveAssertResult(assertionId,maskExecutionResultId,foundVal,resultCode,minVal,maxVal); saveAssertResult(assertionId,maskExecutionResultId,foundVal,resultCode,minVal,maxVal);
} }
@ -393,22 +456,22 @@ public class QaTestcaseExecutor {
boolean executed= st.execute(); boolean executed= st.execute();
} }
private static int saveExecutionResult(int maskExecutionResult,String log ) throws SQLException private static int saveExecutionResult(int execId, int maskExecutionResult,String log ) throws SQLException
{ {
int ret=0; int ret=0;
java.sql.Timestamp startTimeDate = new java.sql.Timestamp(starttime); java.sql.Timestamp startTimeDate = new java.sql.Timestamp(starttime);
java.sql.Timestamp endTimeDate = new java.sql.Timestamp(endtime); java.sql.Timestamp endTimeDate = new java.sql.Timestamp(endtime);
String sql="insert into qa_mask_execution_result(mask_execution_id, execution_start, execution_end, result_code,result_log,result_stream,result_stream_contenttype)"; String sql="insert into qa_mask_execution_result(mask_execution_id, execution_start, execution_end, result_code,result_log,result_xml,result_html)";
sql +="values(?,?,?,?,?,?,?);"; sql +="values(?,?,?,?,?,?,?);";
PreparedStatement st=myConnection.prepareStatement(sql); PreparedStatement st=myConnection.prepareStatement(sql);
st.setInt(1,maskExecutionId); st.setInt(1,execId);
st.setTimestamp(2, startTimeDate); st.setTimestamp(2, startTimeDate);
st.setTimestamp(3, endTimeDate); st.setTimestamp(3, endTimeDate);
st.setInt(4,maskExecutionResult); st.setInt(4,maskExecutionResult);
st.setString(5,log); st.setString(5,log);
//im Fehler/Warnungsfall Ergebnis speichern: //im Fehler/Warnungsfall Ergebnis speichern:
st.setString(6,resultXml); st.setString(6,resultXml);
st.setString(7,"text/xml"); st.setString(7,resultHtml);
boolean executed= st.execute(); boolean executed= st.execute();
//get generated tid: //get generated tid:
@ -465,6 +528,75 @@ public class QaTestcaseExecutor {
return currentXml_local; return currentXml_local;
} }
public void initLogging() {
File f;
try {
logFile=PathAndFileUtils.getWebinfPath()+File.separator+"logs"+File.separator+"superx_qa.log" ;
f = new File(logFile);
if(f.exists())
f.delete();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
writeToLog("Start");
}
private static void writeToLog(String msg)
{
FileWriter f;
try {
f = new FileWriter(logFile,true);
long jetzt= new java.util.Date().getTime() ;
Date date = new Date();
date.setTime(jetzt);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
f.write(format.format(date)+": " +msg+"\n");
f.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.err.println(msg);
}
}
private static void transformResultXmltoHtml()
{
String xslFile="";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream myStream = new PrintStream(baos);
try {
StringWriter myOutwriter= new StringWriter();
xslFile=PathAndFileUtils.getWebinfDirectory()+PathAndFileUtils.PATHSEP+".."+PathAndFileUtils.PATHSEP+"xml"+PathAndFileUtils.PATHSEP+"tabelle_html_qa.xsl";
File f=new File(xslFile);
//in development mode the XSL is not available:
if(!f.exists())
xslFile=PathAndFileUtils.getWebinfDirectory()+PathAndFileUtils.PATHSEP+".."+PathAndFileUtils.PATHSEP+"xml"+PathAndFileUtils.PATHSEP+"tabelle_html2.xsl";
javax.xml.transform.TransformerFactory tFactory = javax.xml.transform.TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null);
javax.xml.transform.Transformer transformer = tFactory.newTransformer(new javax.xml.transform.stream.StreamSource(xslFile));
StringReader s1 = new StringReader(resultXml);
transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, SqlStringUtils.getEncoding());
transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, "html");
/* TODO: hier Parameter einzelne Zeile übergeben:
* String paramname = param.substring(0, param.indexOf("="));
String paramvalue = param.substring(param.indexOf("=") + 1, param.length());
transformer.setParameter(paramname, paramvalue);
*/
transformer.transform(new javax.xml.transform.stream.StreamSource(s1), new javax.xml.transform.stream.StreamResult(myOutwriter));
resultHtml=myOutwriter.toString();
myOutwriter.close();
s1.close();
} catch (Exception e) {
writeToLog("resultXml konnte nicht zu HTML konvertiert werden:\n"+ e.toString());
resultLog+=("resultXml konnte nicht zu HTML konvertiert werden:\n"+ e.toString());
resultHtml="resultXml konnte nicht zu HTML konvertiert werden:" + resultXml;
}
}
} }

20
superx/WEB-INF/conf/edustore/db/bin/qa_mask_execution.x

@ -1,19 +1,15 @@
#!/bin/bash #!/bin/bash
TC_UNIQUENAME=$1
SYSTEMINFO=$2
ARG1="" if [ "$1" = "--help" ]
ARG2="" then echo "Aufruf: qa_mask_execution.x -tc:<Testfall-Schlüssel(optional)> -systeminfo_id:<Komponente(optioanl)> -userid:<Userid (optional)>"
echo " "
if [ "$TC_UNIQUENAME" != "" ] ; then echo "Aktion: qa_mask_execution.x führt aktive Testfälle aus"
ARG1="-tc:$TC_UNIQUENAME" echo "Das Script muss in $WEBAPP/WEB-INF ausgeführt werden"
fi echo "Logdatei: $WEBAPP/WEB-INF/logs/superx_qa.log"
if [ "$SYSTEMINFO" != "" ] ; then exit 0
ARG2="-systeminfo_id:$SYSTEMINFO"
fi fi
java -cp "$JDBC_CLASSPATH" $JAVA_OPTS de.superx.qa.bin.QaTestcaseExecutor "$@"
java -cp "$JDBC_CLASSPATH" $JAVA_OPTS de.superx.qa.bin.QaTestcaseExecutor -logger:$SUPERX_DIR/db/conf/logging.properties -dbproperties:$DB_PROPERTIES "$ARG1" "$ARG2"

BIN
superx/WEB-INF/lib/superx-qa.jar

Binary file not shown.

197
superx/xml/tabelle_html_qa.xsl

@ -0,0 +1,197 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="pageComponents_html.xsl" />
<!--In diesem Stylesheet können Sie individuelle templates unterbringen,
die in ihrer Präzedenz das normale Stylesheet
pageComponents_html.xsl überragt. -->
<xsl:import href="pageComponents_html_final.xsl" />
<xsl:import href="resultset_html.xsl" />
<xsl:import href="interLinks_html.xsl" />
<xsl:decimal-format name="German" grouping-separator="." NaN="" zero-digit ="0" decimal-separator="," />
<xml:output method="html" />
<xsl:template match="/">
<html>
<xsl:call-template name="head" >
<xsl:with-param name="title" select="concat('Ergebnis ',/ergebnisse/ergebnis/ergebniselement/maskenname)" />
</xsl:call-template>
<body onload="isReady=true">
<xsl:choose>
<!--MB -->
<xsl:when test="/ergebnisse/makro/@id !=''">
<h1><xsl:value-of select="/ergebnisse/makro/name" /></h1>
<p><input type="hidden" name="tid">
<xsl:attribute name="value"><xsl:value-of select="/ergebnisse/makro/@id" /></xsl:attribute>
</input>
</p></xsl:when>
<xsl:otherwise>
<p><input type="hidden" name="tid">
<xsl:attribute name="value"><xsl:value-of select="/ergebnisse/ergebnis/maskenname/@id" /></xsl:attribute>
</input></p>
</xsl:otherwise>
</xsl:choose>
<!--<xsl:call-template name="legende" />-->
<xsl:for-each select="ergebnisse/ergebnis/ergebniselement">
<xsl:choose>
<xsl:when test="@typ='image'">
<img>
<xsl:attribute name="src"><xsl:value-of select="@url" /></xsl:attribute>
</img>
<hr/>
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:when test="@typ='tabelle'">
<h2><xsl:value-of select="../maskenname" /></h2>
<!-- MB legende bei jeder Tabelle -->
<p class="legende">
<xsl:for-each select="../felder/feld">
<xsl:if test="value !=''">
<span class="feldname"><xsl:value-of select="@varname" /></span>:&#160;
<xsl:if test="string-length(wert/caption) &lt; 50">
<!-- MB 22.12.04 statt caption value_caption-->
<span class="feldwert"><xsl:value-of select="value_caption" /></span>
</xsl:if>
<!-- MB 22.12.04 statt caption value_caption-->
<xsl:if test="string-length(wert/caption) &gt; 49">
<span class="feldwert"><xsl:value-of select="substring(value_caption,0,50)" />...</span>
</xsl:if>
;
</xsl:if>
</xsl:for-each>
Stand: <xsl:value-of select="../stand" /></p>
<!-- MB fehlermeldung direkt vom Servlet
<xsl:if test="errmsg !=''"><p class="errmsg"><xsl:copy-of select="errmsg" /></p></xsl:if>
-->
<table class="ergtabelle" border="1">
<tr>
<xsl:for-each select="sqlerg/headers/header">
<xsl:call-template name="header">
<xsl:with-param name="derwert" select="wert" />
</xsl:call-template>
</xsl:for-each>
<!--<td></td>-->
</tr>
<xsl:for-each select="sqlerg/row">
<tr>
<xsl:for-each select="col">
<td class="ergfeld">
<xsl:choose>
<!--<xsl:when test="@id='0'">
<xsl:attribute name="class">themenspalte</xsl:attribute>
</xsl:when>
<xsl:when test="@typ='1'"> String
<xsl:attribute name="class">string</xsl:attribute>
<xsl:value-of select="wert" />
</xsl:when>-->
<xsl:when test="@typ='2' or @typ='8' or @typ='3'"> <!-- DecimalFormat -->
<xsl:attribute name="class">decimal</xsl:attribute>
<!--<xsl:value-of select="wert" />-->
<xsl:choose>
<xsl:when test="wert != ''">
<xsl:value-of select="format-number(wert,'###.###.###.###.##0,00','German')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'&#160;'" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="@typ='4'"> <!-- Integer -->
<xsl:attribute name="class">integer</xsl:attribute>
<!--<xsl:value-of select="wert" />-->
<xsl:choose>
<xsl:when test="wert != ''">
<xsl:value-of select="format-number(wert,'###.###.###.###.###','German')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'&#160;'" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<!--Typ=1 ist string und wird defaultmäßig behandelt -->
<xsl:call-template name="field_type" />
<xsl:variable name="zs">
<xsl:call-template name="field_value">
</xsl:call-template>
</xsl:variable>
<xsl:variable name="zs3">
<xsl:call-template name="resultsetLink">
<xsl:with-param name="zs2" select="$zs" />
</xsl:call-template>
</xsl:variable>
<!--Ab hier können Benutzerspezifische Transformationen nach Feldnamen oder Typ beginnen
Bei leeren Zellen wird nbsp übergeben, weil
der IE die Zellen sonst ohne Rahmen darstellt.
Standardmmäßig wird der Feldinhalt nur noch kopiert.-->
<xsl:call-template name="get_val_or_nbsp">
<xsl:with-param name="zs4"><xsl:copy-of select="$zs3" /></xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</td>
</xsl:for-each>
<!--<td></td>-->
</tr>
</xsl:for-each>
</table>
</xsl:when>
<xsl:otherwise>
<xsl:text>
Nicht unterstützter Ergebnistyp </xsl:text><xsl:value-of select="@type" />
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="navigationsfuss" />
</xsl:for-each>
<!--<div id="inhalt" class="versteckt"><p><TEXTAREA NAME="content" ROWS="40" COLS="80" WRAP="off" READONLY="true">
<ergebnis><xsl:copy-of select="/ergebnis/*|@*|text()" /></ergebnis>
</TEXTAREA>
</p></div>
<script language="Javascript">
versteckeText("inhalt");
</script>-->
</body>
</html>
</xsl:template>
<xsl:template name="tabwert">
<xsl:choose>
<xsl:when test="wert/@type='numeric'"><xsl:value-of select="wert" />
<!--<xsl:value-of select="format-number(wert,'#.###.##0,00','de_DE')" />-->
</xsl:when>
<xsl:otherwise><xsl:value-of select="wert" /></xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="create_url">
<xsl:param name="stylesheet"/>
<xsl:text>/superx/servlet/SuperXmlTabelle?</xsl:text>
<xsl:if test="$stylesheet!=''"><xsl:text>stylesheet=</xsl:text><xsl:value-of select="$stylesheet" /><xsl:text>&amp;</xsl:text>
</xsl:if>
<xsl:text>UserID=</xsl:text><xsl:value-of select="/ergebnis/userid" /><xsl:text>&amp;tid=</xsl:text><xsl:value-of select="/ergebnisse/ergebnis/maskenname/@id" />
<xsl:for-each select="/ergebnis/tabelle/felder/feld">
<xsl:if test="wert/value !=''">
<xsl:text>&amp;</xsl:text><xsl:value-of select="wert/@varname" /><xsl:text>=</xsl:text><xsl:value-of select="wert/value" />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Loading…
Cancel
Save