Java tutorial
/******************************************************************************* * 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.ofbiz.testtools; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.commons.lang.RandomStringUtils; import org.apache.ofbiz.base.util.Debug; import org.apache.ofbiz.base.util.ObjectType; import org.apache.ofbiz.base.util.UtilGenerics; import org.apache.ofbiz.base.util.UtilMisc; import org.apache.ofbiz.base.util.UtilValidate; import org.apache.ofbiz.base.util.UtilXml; import org.apache.ofbiz.entity.Delegator; import org.apache.ofbiz.entity.DelegatorFactory; import org.apache.ofbiz.entity.testtools.EntityTestCase; import org.apache.ofbiz.minilang.MiniLangException; import org.apache.ofbiz.minilang.SimpleMethod; import org.apache.ofbiz.service.LocalDispatcher; import org.apache.ofbiz.service.ServiceContainer; import org.apache.ofbiz.service.testtools.OFBizTestCase; import org.w3c.dom.Element; /** * Use this class in a JUnit test runner to bootstrap the Test Suite runner. */ public class ModelTestSuite { public static final String module = ModelTestSuite.class.getName(); protected String suiteName; protected String originalDelegatorName; protected String originalDispatcherName; protected Delegator delegator; protected LocalDispatcher dispatcher; protected List<Test> testList = new ArrayList<Test>(); public ModelTestSuite(Element mainElement, String testCase) { this.suiteName = mainElement.getAttribute("suite-name"); this.originalDelegatorName = mainElement.getAttribute("delegator-name"); if (UtilValidate.isEmpty(this.originalDelegatorName)) this.originalDelegatorName = "test"; this.originalDispatcherName = mainElement.getAttribute("dispatcher-name"); if (UtilValidate.isEmpty(this.originalDispatcherName)) this.originalDispatcherName = "test-dispatcher"; String uniqueSuffix = "-" + RandomStringUtils.randomAlphanumeric(10); this.delegator = DelegatorFactory.getDelegator(this.originalDelegatorName) .makeTestDelegator(this.originalDelegatorName + uniqueSuffix); this.dispatcher = ServiceContainer.getLocalDispatcher(originalDispatcherName + uniqueSuffix, delegator); for (Element testCaseElement : UtilXml.childElementList(mainElement, UtilMisc.toSet("test-case", "test-group"))) { String caseName = testCaseElement.getAttribute("case-name"); String nodeName = testCaseElement.getNodeName(); if (testCase == null || caseName.equals(testCase)) { if (nodeName.equals("test-case")) { parseTestElement(caseName, UtilXml.firstChildElement(testCaseElement)); } else if (nodeName.equals("test-group")) { int i = 0; for (Element childElement : UtilXml.childElementList(testCaseElement)) { parseTestElement(caseName + '-' + i, childElement); i++; } } } } } private void parseTestElement(String caseName, Element testElement) { String nodeName = testElement.getNodeName(); if ("junit-test-suite".equals(nodeName)) { String className = testElement.getAttribute("class-name"); try { @SuppressWarnings("unchecked") Class<? extends TestCase> clz = (Class<? extends TestCase>) ObjectType.loadClass(className); TestSuite suite = new TestSuite(); suite.addTestSuite(clz); Enumeration<?> testEnum = suite.tests(); int testsAdded = 0; int casesAdded = 0; while (testEnum.hasMoreElements()) { Test tst = (Test) testEnum.nextElement(); this.testList.add(tst); casesAdded += tst.countTestCases(); testsAdded++; } Debug.logInfo( "Added " + testsAdded + " tests [" + casesAdded + " cases] from the class: " + className, module); } catch (Exception e) { String errMsg = "Unable to load test suite class : " + className; Debug.logError(e, errMsg, module); } } else if ("service-test".equals(nodeName)) { this.testList.add(new ServiceTest(caseName, testElement)); } else if ("simple-method-test".equals(nodeName)) { if (UtilValidate.isNotEmpty(testElement.getAttribute("name"))) { this.testList.add(new SimpleMethodTest(caseName, testElement)); } else { String methodLocation = testElement.getAttribute("location"); List<SimpleMethod> simpleMethods; try { simpleMethods = SimpleMethod.getSimpleMethodsList(methodLocation, null); for (SimpleMethod simpleMethod : simpleMethods) { String methodName = simpleMethod.getMethodName(); if (methodName.startsWith("test")) { this.testList.add( new SimpleMethodTest(caseName + "." + methodName, methodLocation, methodName)); } } } catch (MiniLangException e) { Debug.logError(e, module); } } } else if ("webdriver-test".equals(nodeName)) { try { String className = "org.apache.ofbiz.testtools.WebDriverTest"; Class<?> cl; cl = Class.forName(className); Constructor<?> con = cl.getConstructor(String.class, Element.class); this.testList.add((Test) con.newInstance(caseName, testElement)); } catch (Exception e) { Debug.logError(e, module); } } else if ("entity-xml".equals(nodeName)) { this.testList.add(new EntityXmlAssertTest(caseName, testElement)); } else if ("entity-xml-assert".equals(nodeName)) { // this is the old, deprecated name for the element, changed because it now does assert or load this.testList.add(new EntityXmlAssertTest(caseName, testElement)); } } String getSuiteName() { return this.suiteName; } Delegator getDelegator() { return this.delegator; } List<Test> getTestList() { return testList; } public TestSuite makeTestSuite() { TestSuite suite = new TestSuite(); suite.setName(this.getSuiteName()); for (Test tst : this.getTestList()) { prepareTest(tst); suite.addTest(tst); } return suite; } private void prepareTest(Test test) { if (test instanceof TestSuite) { Enumeration<Test> subTests = UtilGenerics.cast(((TestSuite) test).tests()); while (subTests.hasMoreElements()) { prepareTest(subTests.nextElement()); } } else if (test instanceof EntityTestCase) { ((EntityTestCase) test).setDelegator(delegator); if (test instanceof OFBizTestCase) { ((OFBizTestCase) test).setDispatcher(dispatcher); } } } }