001: /********************************************************************************
002: * DDTUnit, a Datadriven Approach to Unit- and Moduletesting
003: * Copyright (c) 2004, Joerg and Kai Gellien
004: * All rights reserved.
005: *
006: * The Software is provided under the terms of the Common Public License 1.0
007: * as provided with the distribution of DDTUnit in the file cpl-v10.html.
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * + Redistributions of source code must retain the above copyright
013: * notice, this list of conditions and the following disclaimer.
014: *
015: * + Redistributions in binary form must reproduce the above
016: * copyright notice, this list of conditions and the following
017: * disclaimer in the documentation and/or other materials provided
018: * with the distribution.
019: *
020: * + Neither the name of the authors or DDTUnit, nor the
021: * names of its contributors may be used to endorse or promote
022: * products derived from this software without specific prior
023: * written permission.
024: *
025: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
026: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
027: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
028: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
029: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
030: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
031: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
032: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
033: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
034: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
035: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
036: ********************************************************************************/package junitx.ddtunit;
037:
038: import junit.framework.AssertionFailedError;
039: import junit.framework.Test;
040: import junit.framework.TestCase;
041: import junit.textui.ResultPrinter;
042:
043: import org.apache.log4j.Logger;
044:
045: /**
046: * This class implements a simple monitor for testruns. <br/>It is implemented
047: * as singleton so we can use it internally to protocol test progress and
048: * results. <br/>Lateron there will be an implementaion of a TestRunner that
049: * conformes to the interface DDTTestListener
050: *
051: * @author jg
052: */
053: public class DDTRunMonitor extends ResultPrinter implements
054: DDTTestListener {
055: private static DDTRunMonitor singletonRef;
056:
057: private Logger log = Logger.getLogger(DDTRunMonitor.class);
058:
059: private int testRuns = 0;
060:
061: private int testErrors = 0;
062:
063: private int testFailures = 0;
064:
065: /**
066: * Create object of type DDTRunMonitor
067: */
068: private DDTRunMonitor() {
069: super (System.out);
070: }
071:
072: /**
073: * Get singleton instance of this class
074: *
075: * @return singleton instance
076: */
077: static public DDTRunMonitor getInstance() {
078: if (singletonRef == null) {
079: singletonRef = new DDTRunMonitor();
080: }
081:
082: return singletonRef;
083: }
084:
085: /**
086: * Add error of executed test
087: *
088: * @see junitx.ddtunit.DDTTestListener#addMethodTestError(junit.framework.Test,
089: * java.lang.String, java.lang.Throwable)
090: */
091: public void addMethodTestError(Test test, String testName,
092: Throwable throwable) {
093: String method = "";
094:
095: if (TestCase.class.isInstance(test)) {
096: method = ((TestCase) test).getName();
097: }
098:
099: log.info("[" + test.getClass() + "] Error method " + method
100: + ", test " + testName);
101: log.info("Cause: ", throwable);
102: this .testErrors++;
103: }
104:
105: /**
106: * Add failure of executed test
107: *
108: * @see junitx.ddtunit.DDTTestListener#addMethodTestFailure(junit.framework.Test,
109: * java.lang.String, junit.framework.AssertionFailedError)
110: */
111: public void addMethodTestFailure(Test test, String testName,
112: AssertionFailedError assertFailed) {
113: String method = "";
114:
115: if (TestCase.class.isInstance(test)) {
116: method = ((TestCase) test).getName();
117: }
118:
119: log.info("[" + test.getClass() + "] Failure method " + method
120: + ", test " + testName);
121: log.info("Cause: ", assertFailed);
122: this .testFailures++;
123: }
124:
125: /**
126: * Notify about end of method test execution
127: *
128: * @see junitx.ddtunit.DDTTestListener#endMethodTest(junitx.ddtunit.DDTTestCase,
129: * java.lang.String)
130: */
131: public void endMethodTest(DDTTestCase test, String testName) {
132: int testCount = test.countMethodTests();
133: String method = test.getName();
134: log.info("[" + test.getClass() + "] (" + this .testRuns + "/"
135: + testCount + ") method \"" + method + "\", test \""
136: + testName + "\"");
137: }
138:
139: /**
140: * Notify about start of method test execution
141: *
142: * @see junitx.ddtunit.DDTTestListener#startMethodTest(junitx.ddtunit.DDTTestCase,
143: * java.lang.String)
144: */
145: public void startMethodTest(DDTTestCase test, String testName) {
146: String method = test.getName();
147: int testCount = test.countMethodTests();
148: this .testRuns++;
149: log.debug("[" + test.getClass() + "] Start method " + method
150: + " (" + this .testRuns + " of " + testCount + ") test "
151: + testName);
152: }
153:
154: /**
155: * Just let the standard runner do this work - do nothing
156: *
157: * @see junit.framework.TestListener#addError(junit.framework.Test,
158: * java.lang.Throwable)
159: */
160: public void addError(Test test, Throwable t) {
161: String method = "";
162:
163: if (TestCase.class.isInstance(test)) {
164: method = ((TestCase) test).getName();
165: }
166: log.info("[" + test.getClass() + "] method " + method
167: + " error:", t);
168: }
169:
170: /**
171: * Just let the standard runner do this work - do nothing
172: *
173: * @see junit.framework.TestListener#addFailure(junit.framework.Test,
174: * junit.framework.AssertionFailedError)
175: */
176: public void addFailure(Test test, AssertionFailedError t) {
177: String method = "";
178:
179: if (TestCase.class.isInstance(test)) {
180: method = ((TestCase) test).getName();
181: }
182:
183: log.info("[" + test.getClass() + "] Add Faiure method "
184: + method, t);
185: }
186:
187: /**
188: * Just let the standard runner do this work - do nothing
189: *
190: * @see junit.framework.TestListener#endTest(junit.framework.Test)
191: */
192: public void endTest(Test test) {
193: String method = "";
194: if (TestCase.class.isInstance(test)) {
195: method = ((TestCase) test).getName();
196: }
197: if (DDTTestCase.class.isInstance(test)) {
198: int testCount = ((DDTTestCase) test).countMethodTests();
199: log.info("[" + test.getClass() + "] method \"" + method
200: + "\": " + testRuns + " of " + testCount
201: + " test(s), " + testErrors + " error(s), "
202: + testFailures + " failure(s)");
203: } else {
204: log.info("[" + test.getClass() + "] method \"" + method
205: + "\": " + testErrors + " error(s), "
206: + testFailures + " failure(s)");
207: }
208: }
209:
210: /**
211: * Just let the standard runner do this work - do nothing
212: *
213: * @see junit.framework.TestListener#startTest(junit.framework.Test)
214: */
215: public void startTest(Test test) {
216: String method = "";
217: this .testRuns = 0;
218: this .testErrors = 0;
219: this .testFailures = 0;
220:
221: if (TestCase.class.isInstance(test)) {
222: method = ((TestCase) test).getName();
223: }
224: log.debug("[" + test.getClass() + "] Start method \"" + method
225: + "\"");
226: }
227: }
|