Author: mvitenkov
Date: 2009-07-17 04:33:11 -0400 (Fri, 17 Jul 2009)
New Revision: 14945
Added:
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/RegressionTestReporter.java
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/ReporterBean.java
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/SeleniumClass.java
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/XMLParser.java
Log:
Added:
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/RegressionTestReporter.java
===================================================================
---
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/RegressionTestReporter.java
(rev 0)
+++
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/RegressionTestReporter.java 2009-07-17
08:33:11 UTC (rev 14945)
@@ -0,0 +1,159 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+package org.richfaces.testng.util;
+
+import java.util.ArrayList;
+
+public class RegressionTestReporter {
+ private ArrayList<SeleniumClass> oldFailed;
+ private ArrayList<SeleniumClass> newPassed;
+ private ArrayList<SeleniumClass> newFailed;
+ private ArrayList<SeleniumClass> oldPassed;
+
+ public RegressionTestReporter() {
+ this.oldFailed = new ArrayList<SeleniumClass>();
+ this.newPassed = new ArrayList<SeleniumClass>();
+ this.newFailed = new ArrayList<SeleniumClass>();
+ this.oldPassed = new ArrayList<SeleniumClass>();
+ }
+
+ public void generateReport(){
+ XMLParser.parse();
+ fillOldFailedMethods();
+ fillNewPassedMethods();
+ fillNewFailedMethods();
+ fillOldPassedMethods();
+ }
+
+ private void fillOldFailedMethods(){
+ ArrayList<String> previousFailedMethods = new ArrayList<String>();
+ ArrayList<String> actualFailedMethods = new ArrayList<String>();
+ for(SeleniumClass sc1:XMLParser.testngResultsClassList){
+ for(SeleniumClass sc2:XMLParser.testngFailedClassList){
+ if(sc1.equals(sc2)){
+ previousFailedMethods.addAll(sc1.getMethods());
+ actualFailedMethods.addAll(sc2.getMethods());
+ previousFailedMethods.retainAll(actualFailedMethods);
+ if(previousFailedMethods.size() > 0){
+ SeleniumClass sc = new SeleniumClass(sc1.getName());
+ sc.getMethods().addAll(previousFailedMethods);
+ oldFailed.add(sc);
+ }
+ }
+ }
+ previousFailedMethods.clear();
+ actualFailedMethods.clear();
+ }
+ }
+ private void fillNewPassedMethods(){
+ ArrayList<String> previousFailedMethods = new ArrayList<String>();
+ ArrayList<String> actualPassedMethods = new ArrayList<String>();
+ for(SeleniumClass sc1:XMLParser.testngResultsClassList){
+ for(SeleniumClass sc2:XMLParser.passedClassList){
+ if(sc1.equals(sc2)){
+ previousFailedMethods.addAll(sc1.getMethods());
+ actualPassedMethods.addAll(sc2.getMethods());
+ previousFailedMethods.retainAll(actualPassedMethods);
+ if(previousFailedMethods.size() > 0){
+ SeleniumClass sc = new SeleniumClass(sc1.getName());
+ sc.getMethods().addAll(previousFailedMethods);
+ newPassed.add(sc);
+ }
+ }
+ }
+ previousFailedMethods.clear();
+ actualPassedMethods.clear();
+ }
+ }
+ private void fillNewFailedMethods(){
+ ArrayList<String> actualFailedMethods = new ArrayList<String>();
+ ArrayList<String> previousFailedMethods = new ArrayList<String>();
+ for(SeleniumClass sc1:XMLParser.testngFailedClassList){
+ for(SeleniumClass sc2:XMLParser.testngResultsClassList){
+ if(sc1.equals(sc2)){
+ actualFailedMethods.addAll(sc1.getMethods());
+ previousFailedMethods.addAll(sc2.getMethods());
+ actualFailedMethods.removeAll(previousFailedMethods);
+ if(actualFailedMethods.size() > 0){
+ SeleniumClass sc = new SeleniumClass(sc1.getName());
+ sc.getMethods().addAll(actualFailedMethods);
+ newFailed.add(sc);
+ }
+ }
+ }
+ actualFailedMethods.clear();
+ previousFailedMethods.clear();
+ }
+ }
+ private void fillOldPassedMethods(){
+ ArrayList<String> actualPassedMethods = new ArrayList<String>();
+ ArrayList<String> previousFailedMethods = new ArrayList<String>();
+ for(SeleniumClass sc1:XMLParser.passedClassList){
+ for(SeleniumClass sc2:XMLParser.testngResultsClassList){
+ if(sc1.equals(sc2)){
+ actualPassedMethods.addAll(sc1.getMethods());
+ previousFailedMethods.addAll(sc2.getMethods());
+ actualPassedMethods.removeAll(previousFailedMethods);
+ if(actualPassedMethods.size() > 0){
+ SeleniumClass sc = new SeleniumClass(sc1.getName());
+ sc.getMethods().addAll(actualPassedMethods);
+ oldPassed.add(sc);
+ }
+ }
+ }
+ actualPassedMethods.clear();
+ previousFailedMethods.clear();
+ }
+ }
+
+ public ArrayList<SeleniumClass> getOldFailed() {
+ return oldFailed;
+ }
+
+ public void setOldFailed(ArrayList<SeleniumClass> oldFailed) {
+ this.oldFailed = oldFailed;
+ }
+
+ public ArrayList<SeleniumClass> getNewPassed() {
+ return newPassed;
+ }
+
+ public void setNewPassed(ArrayList<SeleniumClass> newPassed) {
+ this.newPassed = newPassed;
+ }
+
+ public ArrayList<SeleniumClass> getNewFailed() {
+ return newFailed;
+ }
+
+ public void setNewFailed(ArrayList<SeleniumClass> newFailed) {
+ this.newFailed = newFailed;
+ }
+
+ public ArrayList<SeleniumClass> getOldPassed() {
+ return oldPassed;
+ }
+
+ public void setOldPassed(ArrayList<SeleniumClass> oldPassed) {
+ this.oldPassed = oldPassed;
+ }
+
+}
Added:
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/ReporterBean.java
===================================================================
---
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/ReporterBean.java
(rev 0)
+++
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/ReporterBean.java 2009-07-17
08:33:11 UTC (rev 14945)
@@ -0,0 +1,147 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+package org.richfaces.testng.util;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+
+public class ReporterBean {
+
+ public ReporterBean() {
+
+ }
+
+ public void drawReport() {
+ RegressionTestReporter rtr = new RegressionTestReporter();
+ rtr.generateReport();
+
+ try {
+ FileOutputStream fs = new FileOutputStream("RegressionReportByQA.html");
+ OutputStreamWriter out = new OutputStreamWriter(fs);
+ drawUpperPart(out);
+ drawNewFailedMethods(out, rtr);
+ drawNewPassedMethods(out, rtr);
+ drawOldFailedMethods(out, rtr);
+ drawOldPassedMethods(out, rtr);
+ drawDownerPart(out);
+ out.write("<h4>Note: stopSeleniumServer, startSeleniumServer, stopSelenium,
startSelenium shouldn't be tested(not richfaces methods)</h2>");
+ out.close();
+ } catch (IOException e) {
+ System.err.println(e);
+ }
+ }
+
+ public void drawUpperPart(OutputStreamWriter out) {
+ try {
+ out.write("<html>");
+ out.write("<head>");
+ out.write("<title>");
+ out.write("Richfaces regression report");
+ out.write("</title>");
+ out.write("</head>");
+ out.write("<body>");
+ out.write("<table border=\"1px\" style=\"border:1px solid
black; width:500px; align:center;\"");
+ } catch (IOException e) {
+ System.err.println(e);
+ }
+ }
+
+ public void drawDownerPart(OutputStreamWriter out) {
+ try {
+ out.write("</table>");
+ out.write("</body>");
+ out.write("</html>");
+ } catch (IOException e) {
+ System.err.println(e);
+ }
+ }
+
+ public void drawOldFailedMethods(OutputStreamWriter out,
+ RegressionTestReporter rtr) {
+ try {
+ out
+ .write("<tr><td><div
style=\"font-weight:bold;font-size:16px;\">Old Failed
methods:</div><td></tr>");
+ for (SeleniumClass sc : rtr.getOldFailed()) {
+ out.write("<tr><td
style=\"font-weight:bold;\">Class:" + sc.getName() +
"</td></tr>");
+ for (String method : sc.getMethods()) {
+ out.write("<tr><td style=\"color:grey;\">" + method
+ "</td></tr>");
+ }
+ }
+ } catch (IOException e) {
+ System.err.println(e);
+ }
+ }
+
+ public void drawNewPassedMethods(OutputStreamWriter out,
+ RegressionTestReporter rtr) {
+ try {
+ out
+ .write("<tr><td><div
style=\"font-weight:bold;font-size:16px;\">New Passed
methods:</div><td></tr>");
+ for (SeleniumClass sc : rtr.getNewPassed()) {
+ out.write("<tr><td
style=\"font-weight:bold;\">Class:" + sc.getName() +
"</td></tr>");
+ for (String method : sc.getMethods()) {
+ out.write("<tr><td style=\"color:green;\">" + method
+ "</td></tr>");
+ }
+ }
+ } catch (IOException e) {
+ System.err.println(e);
+ }
+ }
+
+ public void drawNewFailedMethods(OutputStreamWriter out,
+ RegressionTestReporter rtr) {
+ try {
+ out
+ .write("<tr><td><div
style=\"font-weight:bold;font-size:16px;\">New Failed(!)
methods:</div><td></tr>");
+ for (SeleniumClass sc : rtr.getNewFailed()) {
+ out.write("<tr><td
style=\"font-weight:bold;\">Class:" + sc.getName() +
"</td></tr>");
+ for (String method : sc.getMethods()) {
+ out.write("<tr><td style=\"color:red;\">" + method +
"</td></tr>");
+ }
+ }
+ } catch (IOException e) {
+ System.err.println(e);
+ }
+ }
+
+ public void drawOldPassedMethods(OutputStreamWriter out,
+ RegressionTestReporter rtr) {
+ try {
+ out
+ .write("<tr><td><div
style=\"font-weight:bold;font-size:16px;\">Old Passed
methods:</div><td></tr>");
+ for (SeleniumClass sc : rtr.getOldPassed()) {
+ out.write("<tr><td style=\"font:bold;\">Class:" +
sc.getName() + "</td></tr>");
+ for (String method : sc.getMethods()) {
+ out.write("<tr><td style=\"color:blue;\">" + method
+ "</td></tr>");
+ }
+ }
+ } catch (IOException e) {
+ System.err.println(e);
+ }
+ }
+
+ public static void main(String[] args) {
+ ReporterBean rb = new ReporterBean();
+ rb.drawReport();
+ }
+
+}
Added:
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/SeleniumClass.java
===================================================================
---
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/SeleniumClass.java
(rev 0)
+++
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/SeleniumClass.java 2009-07-17
08:33:11 UTC (rev 14945)
@@ -0,0 +1,63 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+package org.richfaces.testng.util;
+
+import java.util.ArrayList;
+
+public class SeleniumClass {
+
+ private String name;
+ private ArrayList<String> methods;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public ArrayList<String> getMethods() {
+ return methods;
+ }
+
+ public void setMethods(ArrayList<String> methods) {
+ this.methods = methods;
+ }
+
+ public SeleniumClass() {
+ this.methods = new ArrayList<String>();
+ }
+
+ public SeleniumClass(String name) {
+ this.name = name;
+ this.methods = new ArrayList<String>();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null)
+ return false;
+ if (!(obj instanceof SeleniumClass))
+ return false;
+ return ((SeleniumClass) obj).getName().equals(this.name);
+ }
+}
Added:
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/XMLParser.java
===================================================================
---
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/XMLParser.java
(rev 0)
+++
branches/community/3.3.X/test-applications/seleniumTest/richfaces/src/test/java/org/richfaces/testng/util/XMLParser.java 2009-07-17
08:33:11 UTC (rev 14945)
@@ -0,0 +1,228 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+package org.richfaces.testng.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class XMLParser {
+ private static String TESTNG_FAILED_PATH;
+ private static String TESTNG_RESULTS_PATH;
+ protected static ArrayList<SeleniumClass> testngFailedClassList;
+ protected static ArrayList<SeleniumClass> testngResultsClassList;
+ protected static ArrayList<SeleniumClass> passedClassList;
+
+ public static ArrayList<SeleniumClass> getPassedClassList() {
+ return passedClassList;
+ }
+
+ public static void setPassedClassList(
+ ArrayList<SeleniumClass> passedClassList) {
+ XMLParser.passedClassList = passedClassList;
+ }
+
+ public ArrayList<SeleniumClass> getTestngFailedClassList() {
+ return testngFailedClassList;
+ }
+
+ public void setTestngFailedClassList(
+ ArrayList<SeleniumClass> testngFailedClassList) {
+ XMLParser.testngFailedClassList = testngFailedClassList;
+ }
+
+ public ArrayList<SeleniumClass> getTestngResultsClassList() {
+ return testngResultsClassList;
+ }
+
+ public void setTestngResultsClassList(
+ ArrayList<SeleniumClass> testngResultsClassList) {
+ XMLParser.testngResultsClassList = testngResultsClassList;
+ }
+
+ public static void fillTestngFailedClassList() {
+
+ Document doc = buildDocument(TESTNG_FAILED_PATH);
+ NodeList classLst = doc.getElementsByTagName("class");
+
+ ArrayList<String> tempMethods = new ArrayList<String>();
+ for (int i = 0; i < classLst.getLength(); i++) {
+ Node classNode = classLst.item(i);// enter to the <class>
+ SeleniumClass seleniumClass = new SeleniumClass(classNode
+ .getAttributes().item(0).getNodeValue());
+
+ if (classNode.getNodeType() == Node.ELEMENT_NODE) {
+ Element classEl = (Element) classNode;
+
+ NodeList includeList = classEl.getElementsByTagName("include");
+
+ tempMethods.clear();
+ for (int j = 0; j < includeList.getLength(); j++) {
+ Node failedMethodName = includeList.item(j).getAttributes()
+ .item(0);
+ tempMethods.add(failedMethodName.getNodeValue());
+ }
+ seleniumClass.getMethods().addAll(tempMethods);
+ }
+ testngFailedClassList.add(seleniumClass);
+ }
+ }
+
+ public static void fillTestngResultsClassList() {
+
+ Document doc = buildDocument(TESTNG_RESULTS_PATH);
+ NodeList methodLst = doc.getElementsByTagName("group");
+
+ ArrayList<String> tempMethods = new ArrayList<String>();
+
+ Node groupNode = methodLst.item(0);// enter to the <group>
+
+ if (groupNode.getNodeType() == Node.ELEMENT_NODE) {
+ Element groupEl = (Element) groupNode;
+
+ NodeList methodList = groupEl.getElementsByTagName("method");
+
+ tempMethods.clear();
+ for (int i = 0; i < methodList.getLength(); i++) {
+ Node failuresMethodName = methodList.item(i).getAttributes()
+ .getNamedItem("name");
+ Node failuresClassName = methodList.item(i).getAttributes()
+ .getNamedItem("class");
+ String s = failuresClassName.getNodeValue();
+ if (!XMLParser.getStringArrayRepresentation(
+ testngResultsClassList).contains(s)) {
+ SeleniumClass seleniumClass = new SeleniumClass(s);
+ seleniumClass.getMethods().add(
+ failuresMethodName.getNodeValue());
+ testngResultsClassList.add(seleniumClass);
+ } else {
+ testngResultsClassList.get(
+ testngResultsClassList
+ .indexOf(new SeleniumClass(s)))
+ .getMethods()
+ .add(failuresMethodName.getNodeValue());
+ }
+ }
+ }
+ }
+
+ public static void fillPassedClassList() {
+
+ Document doc = buildDocument(TESTNG_RESULTS_PATH);
+ NodeList classLst = doc.getElementsByTagName("class");
+
+ ArrayList<String> passedMethods = new ArrayList<String>();
+ ArrayList<String> failedMethods = new ArrayList<String>();
+ for (int i = 0; i < classLst.getLength(); i++) {
+ Node classNode = classLst.item(i);// enter to the <class>
+ SeleniumClass seleniumClass = new SeleniumClass(classNode
+ .getAttributes().item(0).getNodeValue());
+
+ if (classNode.getNodeType() == Node.ELEMENT_NODE) {
+ Element classEl = (Element) classNode;
+
+ NodeList testMethodList = classEl
+ .getElementsByTagName("test-method");
+
+ passedMethods.clear();
+ failedMethods.clear();
+ for (int j = 0; j < testMethodList.getLength(); j++) {
+ Node methodName = testMethodList.item(j).getAttributes()
+ .getNamedItem("name");
+ Node methodStatus = testMethodList.item(j).getAttributes()
+ .getNamedItem("status");
+ String name = methodName.getNodeValue();
+ String status = methodStatus.getNodeValue();
+ if (status.equals("PASS")
+ && !(passedMethods.contains(name))) {
+ passedMethods.add(name);
+ }
+ if (status.equals("FAIL")
+ && !(failedMethods.contains(name))) {
+ failedMethods.add(name);
+ }
+ }
+ passedMethods.removeAll(failedMethods);
+ seleniumClass.getMethods().addAll(passedMethods);
+ }
+ passedClassList.add(seleniumClass);
+ }
+ }
+
+ public static void parse() {
+ try {
+ init();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ fillTestngFailedClassList();
+ fillTestngResultsClassList();
+ fillPassedClassList();
+ }
+
+ private static void init() throws IOException {
+ String currentPath = (new File("")).getAbsolutePath();
+ TESTNG_FAILED_PATH = currentPath + "/test-output/testng-failed.xml";
+ TESTNG_RESULTS_PATH = currentPath + "/test-output/testng-results.xml";
+
+ testngFailedClassList = new ArrayList<SeleniumClass>();
+ testngResultsClassList = new ArrayList<SeleniumClass>();
+ passedClassList = new ArrayList<SeleniumClass>();
+ }
+
+ public static Document buildDocument(String PATH) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db;
+ Document doc = null;
+ try {
+ db = dbf.newDocumentBuilder();
+ doc = db.parse(PATH);
+ } catch (ParserConfigurationException e) {
+ e.printStackTrace();
+ } catch (SAXException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ doc.getDocumentElement().normalize();
+ return doc;
+ }
+
+ private static ArrayList<String> getStringArrayRepresentation(
+ ArrayList<SeleniumClass> classes) {
+ ArrayList<String> strs = new ArrayList<String>();
+ for (SeleniumClass sc : classes) {
+ strs.add(sc.getName());
+ }
+ return strs;
+ }
+
+}