hansel-general Mailing List for Hansel
Brought to you by:
jiriki
You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
(4) |
Apr
(8) |
May
(7) |
Jun
(2) |
Jul
(6) |
Aug
(1) |
Sep
|
Oct
(6) |
Nov
(5) |
Dec
(18) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(3) |
Feb
(3) |
Mar
(6) |
Apr
(2) |
May
(4) |
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
(4) |
Nov
(4) |
Dec
(4) |
2005 |
Jan
(1) |
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(4) |
Sep
(1) |
Oct
|
Nov
|
Dec
|
2007 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
2013 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Rick K. (rkarcich) <rka...@ci...> - 2013-06-06 15:49:27
|
Interested in opinions/experiences regarding the following code coverage tools... any insights/anecdotes regarding the use of these in a Jenkin CI enviroment using Java is appreciated... Agitar < http://www.agitar.com/index.html > Cobertura < http://cobertura.sourceforge.net/ > EMMA < http://emma.sourceforge.net/faq.html > Clover < http://www.atlassian.com/software/clover/overview > Sonar < http://www.sonarsource.org/ > JVMTI manual alternative these tools appear to me to involve static measurements -- my question above is prompted by a desire to measure test coverage and my primary criteria in evaluating a tool are: 1) do they perform dynamic profiling(i.e., for Java by engaging the JVMTI) and 2) where do they put, i.e., what's the i/f, that profiling data... As background: - my app is running inside a Java 7 JVM - all app code is written in Java - Eclipse is the IDE; we also use ANT and Maven... - Eclipse Modeling Framework(EMF) models config options and generates the component object model - Subversion(SVN) is our version control system - Jenkins is the build server for continuous integration(CI) Precisely, I’d like to know: 1) The tool does perform dynamic profiling, i.e., telling me how frequently I touch a Java method(module)… (I’m assuming the tool uses the JVMTI…?) 2) Where (i.e., what’s the i/f) does the tool put the profiling data… I’d like to be able to access the data and put it into a database…? 3) Is the tool compatible with Java 7 JVM…? i appreciate any help -- thx very much! |
From: Caolouren <cao...@16...> - 2007-10-19 06:45:03
|
hi Friends, I run the test follow the = URL:http://hansel.sourceforge.net/doc/tutorial4.html ,All the test will = pass using JVM javaagent:hansel.jar,but I can't get any fail message or = Report. Is ASM required? Thanks, Aman |
From: Butash, B. <bob...@ed...> - 2007-02-07 15:24:21
|
Trying to follow the examples with setting up Hansel 2 based JUnit 4 tests and I am not able to get the code to execute. I have a simple test: package com.eds.junit; import org.hansel.CoverageRunner; import static org.junit.Assert.assertTrue; import org.junit.Test; import org.junit.runner.JUnitCore; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(CoverageRunner.class) @Suite.SuiteClasses({ SomeTest.class }) @CoverageRunner.CoverClasses({ Some.class }) public class SomeTest { public SomeTest() { } @Test public void xyz() { Some some =3D new Some(); assertTrue("Test", true); } public static void main(String... arguments) { JUnitCore core =3D new JUnitCore(); //core.addListener(new SomeListener()); core.run(SomeTest.class); } } That tests an even simpler object: package com.eds.junit; public class Some { public Some() { } } When I execute this code following the steps in the tutorial I get errors, the code works fine without Hansel. We have looked into Hansel 1.x and got proof of concepts working with that, now since we are switching to Java 1.5 we want to start looking at Hansel 2. The results that I'm getting are: D:\>java -classpath "D:\Program Files\Oracle\JDeveloperStudio10.1.3.2\jdev\mywor k\JUnit4Application\JUnit4Project\classes;D:\Tools\junit4.1\junit-4.1.ja r;D:\Too ls\hansel-2.0a3\lib\asm-all-3.0_RC1.jar;D:\Tools\hansel-2.0a3\lib\hansel .jar" -j avaagent:D:/Tools/hansel-2.0a3/lib/hansel.jar com.eds.junit.SomeTest *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 831 *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 831 *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 831 *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 831 *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 831 *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 831 This Assertion Failed error continues on until IllegalState exceptions start to get thrown: java.lang.IllegalStateException: Inconsistent instrumentation: 9 !=3D 8 at org.hansel.HanselCodeAdapter.visitEnd(HanselCodeAdapter.java:312) at org.objectweb.asm.tree.MethodNode.accept(Unknown Source) at org.objectweb.asm.tree.MethodNode.accept(Unknown Source) at org.objectweb.asm.tree.ClassNode.accept(Unknown Source) at org.hansel.Transformer.transform(Transformer.java:47) at sun.instrument.TransformerManager.transform(Unknown Source) at sun.instrument.InstrumentationImpl.transform(Unknown Source) at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method) at sun.instrument.InstrumentationImpl.redefineClasses(Unknown Source) at org.hansel.Startup.init(Startup.java:97) at org.hansel.CoverageRunner.init(CoverageRunner.java:78) at org.hansel.CoverageRunner.getDescription(CoverageRunner.java:116) at org.junit.internal.runners.CompositeRunner.getDescription(CompositeRu nner.java:36) at org.junit.internal.runners.TestClassRunner.getDescription(TestClassRu nner.java:57) at org.hansel.CoverageRunner.getDescription(CoverageRunner.java:119) at org.junit.internal.runners.CompositeRunner.getDescription(CompositeRu nner.java:36) at org.junit.internal.runners.TestClassRunner.getDescription(TestClassRu nner.java:57) at org.hansel.CoverageRunner.getDescription(CoverageRunner.java:119) at org.junit.internal.runners.CompositeRunner.getDescription(CompositeRu This starts an infinite loop. I'm using the latest JUnit 4 release, however I get the same results if I use the JUnit distibution that is packaged with Hansel. Any help would be appreciated. Thanks, Bob Butash |
From: Niklas M. <nik...@fr...> - 2006-09-09 21:31:22
|
Daren Desjardins wrote: > Does Hansel work with JUnit 4.0? Sorry for taking so long to answer. I have just implemented support for JUnit 4.0 in Hansel 2.0a2. It is now possible to write TestSuites like the following: package org.hanselexample; import org.hansel.CoverageRunner; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(CoverageRunner.class) @Suite.SuiteClasses({ ExampleJUnit4Test.class }) @CoverageRunner.CoverClasses({ Example.class }) public class ExampleJUnit4Suite { } This runs the Test class ExampleJUnit4Test and expects it to cover the class Example. Hope this helps, Niklas |
From: Daren D. <da...@gm...> - 2006-08-31 20:07:37
|
Does Hansel work with JUnit 4.0? |
From: Butash, B. <bob...@ed...> - 2006-08-21 13:01:21
|
Thank for the information. I downloaded it and have the test running but the code coverage tests are erroring off. The exceptions in the console are: java.lang.IllegalStateException: Inconsistent instrumentation: 53 !=3D = 52 at org.hansel.HanselCodeAdapter.visitEnd(HanselCodeAdapter.java:288) at org.objectweb.asm.tree.MethodNode.accept(Unknown Source) at org.objectweb.asm.tree.MethodNode.accept(Unknown Source) at org.objectweb.asm.tree.ClassNode.accept(Unknown Source) at org.hansel.Transformer.transform(Transformer.java:47) at sun.instrument.TransformerManager.transform(TransformerManager.java:122) at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:15 5) at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method) at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.j ava:79) at org.hansel.Startup.init(Startup.java:97) at org.hansel.CoverageDecorator.init(CoverageDecorator.java:120) at org.hansel.CoverageDecorator.run(CoverageDecorator.java:142) at oracle.jdevimpl.junit.runner.TestRunner.doRun(TestRunner.java:111) at oracle.jdevimpl.junit.runner.TestRunner.start(TestRunner.java:91) at oracle.jdevimpl.junit.runner.TestRunner.main(TestRunner.java:43) java.lang.IllegalStateException: Inconsistent instrumentation: 10 !=3D 9 at org.hansel.HanselCodeAdapter.visitEnd(HanselCodeAdapter.java:288) at org.objectweb.asm.tree.MethodNode.accept(Unknown Source) at org.objectweb.asm.tree.MethodNode.accept(Unknown Source) at org.objectweb.asm.tree.ClassNode.accept(Unknown Source) at org.hansel.Transformer.transform(Transformer.java:47) at sun.instrument.TransformerManager.transform(TransformerManager.java:122) at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:15 5) at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method) at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.j ava:79) at org.hansel.Startup.init(Startup.java:97) at org.hansel.CoverageDecorator.init(CoverageDecorator.java:120) at org.hansel.CoverageDecorator.run(CoverageDecorator.java:142) at oracle.jdevimpl.junit.runner.TestRunner.doRun(TestRunner.java:111) at oracle.jdevimpl.junit.runner.TestRunner.start(TestRunner.java:91) at oracle.jdevimpl.junit.runner.TestRunner.main(TestRunner.java:43) Here is my suite method: public static Test suite() { Test coverageDecorator =3D=20 new CoverageDecorator(ExceptionHandlingLifeCycleImplTest.class, new Class[]{ExceptionConfiguration.class, =20 ExceptionHandlingLifeCycleImpl.class}); return coverageDecorator; } I have Hansel and ASM in my class path for compiling and running and am invoking java with Java option -javaagent:"D:\Oracle_JDeveloper_Studio\jdev\mywork\libraries\runtime\ha nsel.jar" Any help would be great. Thanks=20 -----Original Message----- From: han...@li... [mailto:han...@li...] On Behalf Of han...@li... Sent: Sunday, August 20, 2006 4:27 PM To: han...@li... Subject: Hansel-general Digest, Vol 1, Issue 59 Send Hansel-general mailing list submissions to han...@li... To subscribe or unsubscribe via the World Wide Web, visit https://lists.sourceforge.net/lists/listinfo/hansel-general or, via email, send a message with subject or body 'help' to han...@li... You can reach the person managing the list at han...@li... When replying, please edit your Subject line so it is more specific than "Re: Contents of Hansel-general digest..." Today's Topics: 1. Re: Hansel & Java 1.5 (Niklas Mehner) ---------------------------------------------------------------------- Message: 1 Date: Sat, 19 Aug 2006 22:59:56 +0200 From: Niklas Mehner <nik...@fr...> Subject: Re: [Hansel-general] Hansel & Java 1.5 To: "Butash, Bob" <bob...@ed...> Cc: han...@li... Message-ID: <44E...@fr...> Content-Type: text/plain; charset=3DISO-8859-1; format=3Dflowed Butash, Bob wrote: > I was very interested in using Hansel but have found that if I try to=20 > use it with Java 1.5 and generics, it does not work. > I just released an alpha version of hansel 2.0 supporting jdk1.5 and using asm for bytecode instrumentation. The changes have already been available from CVS for almost 2 years but unfortunatly I never got around to release them. There are still some tests failing/not converted from bcel to asm. But since I've already been using this code for my own projects for quite some time, it should be in a working state. If you encounter any problems, please tell me. Niklas ------------------------------ ------------------------------------------------------------------------ - Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=3Dlnk&kid=3D120709&bid=3D263057&dat=3D= 121642 ------------------------------ _______________________________________________ Hansel-general mailing list Han...@li... https://lists.sourceforge.net/lists/listinfo/hansel-general End of Hansel-general Digest, Vol 1, Issue 59 ********************************************* |
From: Niklas M. <nik...@fr...> - 2006-08-19 21:00:04
|
Butash, Bob wrote: > I was very interested in using Hansel but have found that if I try to > use it with Java 1.5 and generics, it does not work. > I just released an alpha version of hansel 2.0 supporting jdk1.5 and using asm for bytecode instrumentation. The changes have already been available from CVS for almost 2 years but unfortunatly I never got around to release them. There are still some tests failing/not converted from bcel to asm. But since I've already been using this code for my own projects for quite some time, it should be in a working state. If you encounter any problems, please tell me. Niklas |
From: Butash, B. <bob...@ed...> - 2006-08-18 20:06:07
|
I was very interested in using Hansel but have found that if I try to use it with Java 1.5 and generics, it does not work. Any assistance would be great Thanks, Bob |
From: <Chr...@ny...> - 2005-12-13 20:31:19
|
Has anyone else experienced OutOfMemoryErrors when using Hansel-decorated Tests within a large TestSuite()? We have a custom TestCollector which finds all the Test classes in the classpath. If the Test class has a suite() method - which all our Hansel-decorated Tests do - then that "custom" TestSuite gets added to the outer Suite. Otherwise, our collector just creates a regular suite using new TestSuite(*Test.class); When we leave out the Hansel-decorated suites, we have over 1,300 Tests for our application, all of which are successful. With the Hansel-decorated suites, we have over 2,100 Tests (including Hansel probes). Around about Test#950 or so, the tests start failing with OutOfMemoryErrors. I have yet to be able to isolate the source of the memory leak, so I don't know for sure that Hansel is (part of) the cause. Just checking with others' experiences before I spend more time on deeper investigation. Thanx - Xris ----- Chris Kreussling, Senior Technical Specialist Federal Reserve Bank of New York Tel: (212)720-1601, Alt: (646)720-1601 ----- "The Helpful Model: No matter how it looks, everyone is trying to be helpful. The Principle of Addition: The best way to reduce ineffective behavior is by adding more effective behavior." - Gerald M. Weinberg, "Quality Software Management, Volume 1: Systems Thinking" ----- "When he was younger, Gensha went on a pilgrimage to many monasteries. While walking he stubbed his toe on a sharp rock. He cried out, "Where does this pain come from?" Not "this dumb rock" or "I am so stupid," but instead, "Where does this pain come from?" At that instant, he attained enlightenment." - Zen Story ----- All statements are my own and do not represent the views or positions of the Federal Reserve. |
From: Paul Z. <pau...@ya...> - 2005-02-16 05:09:23
|
Looks like hansel reports uncovered static initializer of TestClas, which is empty. Once you create an instance of a derived class, the initializer will be invoked and covered. --- Dubravko OstoiÄ <do...@fi...> wrote: > I have abstract class that i'm testing: > > public abstract class TestClas { > > public static int proba(int pParam1) { > int tTemp=0; > if (pParam1 == 1) { > tTemp = -1; > return tTemp; > } > tTemp++; > return tTemp; > } > } > > public class TestClasTest extends TestCase { > > public TestClasTest(String arg0) { > super(arg0); > } > > public static Test suite() { > return new CoverageDecorator(TestClasTest.class, new Class[] { > TestClas.class }); > } > > public void testProba() { > assertEquals(TestClas.proba(0), 1); > assertEquals(TestClas.proba(1), -1); > } > > } > > all code is covered, but i get > > Coverage failure: Method not covered. > at hansel.TestClas.<init>(TestClas.java:20) > > Why ? > > Thanks __________________________________ Do you Yahoo!? Yahoo! Mail - Easier than ever with enhanced search. Learn more. http://info.mail.yahoo.com/mail_250 |
From: <do...@fi...> - 2005-02-15 07:59:22
|
I have abstract class that i'm testing: public abstract class TestClas { public static int proba(int pParam1) { int tTemp=0; if (pParam1 == 1) { tTemp = -1; return tTemp; } tTemp++; return tTemp; } } public class TestClasTest extends TestCase { public TestClasTest(String arg0) { super(arg0); } public static Test suite() { return new CoverageDecorator(TestClasTest.class, new Class[] { TestClas.class }); } public void testProba() { assertEquals(TestClas.proba(0), 1); assertEquals(TestClas.proba(1), -1); } } all code is covered, but i get Coverage failure: Method not covered. at hansel.TestClas.<init>(TestClas.java:20) Why ? Thanks |
From: SourceForge.net <no...@so...> - 2005-01-25 12:17:03
|
Feature Requests item #1109032, was opened at 2005-01-25 13:17 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=472902&aid=1109032&group_id=54171 Category: None Group: None Status: Open Priority: 5 Submitted By: Ilja Preuß (ipreuss) Assigned to: Nobody/Anonymous (nobody) Summary: Provide source code Initial Comment: Please provide a zip with the source code as download. Thanks! ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=472902&aid=1109032&group_id=54171 |
From: Phil S. <ph...@co...> - 2004-12-18 10:32:16
|
On 18 Dec 2004, at 0:15, Harald M. Muller wrote: > ... it's way back on my priority list, this hansel thing ... please > dont be too angry (probably I am the lowest-activity open-source > project team-member on the planet for a still-alive project ...). Harald, No problem, I can assure you this is not the lowest activity project I have encountered. There are always many demands on our time. I feared that you had taken offence at my suggestion for specifying the coverage categories externally, so it's good to hear from you again! > a) I hope I'll be able to check your static problem in 2 weeks or so. That would be excellent, thank you. > b) Re indicating coverage categories: You write > Unfortunately, in the byte-code, we no longer have good > "connections"/"back-pointers" to a source indicated by path > expressions or the like. Also the XPath variants you indicate are used > for declarations, not for statements - which do not have any sort of > "names". I must admit I am approaching this speculatively. I have not had a detailed look at the Hansel, BCEL or PMD source. I thought PMD used a similar byte code analysis approach, but it uses a JavaCC generated parser to get the structure. > Still, I think adding a concept where you can indicate categories via > filenames + line numbers should be easy to implement. However, this > would be obviously quite fragile. Maybe a better version is to use > method names(+parameter profiles) + offset inside the method in lines. > Moving around methods and adding comments would then not destroy the > "external pointer". How about using mock object substitution? In the static initializer example you could perhaps say to BCEL "In class X, method Y where you find java.sql.DriverManager substitute org.example.MockDriverManager". The mock object might need to implement a Hansel interface so you can manipulate the iterations when exceptions are triggered, such as setMethodName(Throwable exType). For more complex cases, this might need some kind of adapter or proxy so Hansel knows which cases to apply? Or identify a series of cases in the mock object using a method name reflection scheme like JUnit's testX, testY... I haven't thought this through very deeply, but at least you get simulated coverage rather than exclusion. I read in the BCEL manual about insertion and it seems you might be able to locate the relevant methods and types this way? http://jakarta.apache.org/bcel/manual.html They also mention regular expressions using org.apache.bcel.util.InstructionFinder, so perhaps it's possible to generalise this scheme to some extent? I only need a little prompt to come up with some bright ideas, whether they are at all feasible is another matter! Hope this helps. Best regards, Phil -- <URL:http://www.codestyle.org/> |
From: <har...@gm...> - 2004-12-17 23:15:28
|
Hi Phil - ... it's way back on my priority list, this hansel thing ... please dont be too angry (probably I am the lowest-activity open-source project team-member on the planet for a still-alive project ...). a) I hope I'll be able to check your static problem in 2 weeks or so. b) Re indicating coverage categories: You write > I had imagined there might be some kind of external reference scheme > to signify the blocks to exclude, something like XPath perhaps? Unfortunately, in the byte-code, we no longer have good "connections"/"back-pointers" to a source indicated by path expressions or the like. Also the XPath variants you indicate are used for declarations, not for statements - which do not have any sort of "names". Still, I think adding a concept where you can indicate categories via filenames + line numbers should be easy to implement. However, this would be obviously quite fragile. Maybe a better version is to use method names(+parameter profiles) + offset inside the method in lines. Moving around methods and adding comments would then not destroy the "external pointer". Still, this would be more hassle than my "in-code" concept using strings in assertions (to be preferred; still, they end up in the class's constant pool) or with the .length() concept (for JDK1.3). Any other ideas? Regards Harald M. > -----Original Message----- > From: Phil Shaw [mailto:ph...@co...] > Sent: Saturday, November 06, 2004 11:38 AM > To: Harald Mueller > Subject: Re: [Hansel-general] Coverage of static initializer > for java.sql.Driver > > > On 25 Oct 2004, at 10:38, Harald Mueller wrote: > > > > No, this is what alerted me to the problem. My version is 1.02, > > > which does test the coverage of static initializers and > reports the > > > try/catch block is not fully covered. > > > > Aha - then I am surprised. > > Harald, > > Sorry for the delay, your mail was intercepted by spam filters for > some reason. > > > See the attachment (unfortunately, this is a "Microsoft Word html" > > file - hopefully it is readable for you). Actually, categories *are* > > Yes, thank you for the preview. I followed the guidance on putting > explicit markers in the source, but I would like to know more about > the heuristics for assigning categories. Would the following > implicitly exclude the catch block according to the RuntimeException > category? > > /** > * Register with the driver manager. > * @since Version 0.1 2004-10-21 > */ > static { > > try { > > DriverManager.registerDriver(new MockDriver()); > } > catch (SQLException sqle) { > > throw new RuntimeException("Could not register > MockDriver. " + > sqle.getMessage()); > } > } > > I don't think there are any notes on how one would activate the > category heuristics in this draft? I would be more interested in this > approach, I don't like putting test code in production classes. > > I had imagined there might be some kind of external reference scheme > to signify the blocks to exclude, something like XPath perhaps? > > org.example.MockDriver/static/catch(SQLException) > > or > > org.example.Production/getProperty[@String,@Type]/if/else > > PMD uses a similar approach to analyse byte code for common coding > problems: > http://pmd.sourceforge.net/ > time, I'll do this. However, categories certainly need some > improvements (and some alpha testers :-) ) to be useful in practice - > e.g. "re-wiring" the special code handling (among them initializers) > to categories. I would be happy to give feedback on an alpha release and have examples of other code that is impossible to cover. For instance, the final class java.net.URL, which declares MalformedURLException in its constructor, is impossible to cover if your application code pre-validates the protocol. An unrecognised protocol is the _only_ reason the constructor throws the exception, but an application may want to ensure HTTP only. The only solution I could work out was to declare the exception as IOException and pass it all the way up the call stack, even though it could never occur! Best regards, Phil -- <URL:http://www.codestyle.org/> |
From: <har...@gm...> - 2004-12-17 23:05:54
|
Hi all - I am not at all happy with the various CoverageDecorator constructors (which is the main reason why I myself don't use Hansel really!). Currently, we have the following state of affairs: There are parameters for * A test class * Classes to be covered - for real-world examples, this requires long long lists of classes to be maintained; and anonymous classes can be handled only very awkwardly (using Class.forName()) * Prefixes (Strings) to be excluded * a flag indicating "use default ignores" - can be set to false * ProbeFilters to exclude some probes dynamically. Many of these are optional. For technical reasons, it is not possible to set any parameters *after* creating the CoverageDecorator, hence we are going to be flooded by 2^n different constructor versions ... a nightmare, IMO. I would like to change this - and in that course break all existing hansel test suites: that's why I ask! - to: * Required: A test class * Required: A list of regular expressions or "wildcard expressions" indicating the classes to be covered * Optional: A list of regular expressions or "wildcard expressions" indicating classes not to be covered [empty by default] * Optional: An additional flag whether to use the "default ignores" should apply [true be default]. * Optional: A ProbeFilter [default null]. We would end up with theoretically 2^3=8 constructors, which I would limit to the following 4: CD(Class testClass, String[] coveredClassPatterns); CD(Class testClass, String[] coveredClassPatterns, String[] ignoredClassPatterns); CD(Class testClass, String[] coveredClassPatterns, String[] ignoredClassPatterns, boolean useDefaultIgnores); CD(Class testClass, String[] coveredClassPatterns, String[] ignoredClassPatterns, boolean useDefaultIgnores, ProbeFilter filter); --------------- First question to you all: Is this ok????????????????? --------------- Re regexp or wildcard expressions: * RegExp would mean using JDK1.4.x - easier to implement, more general, more limited in use (the commercial projects I'm working one are mostly still on JDK1.3 - thx to IBM's lagging behind), "funny semantics" if used with standard "import syntax": com.mycompany.* would also match comXmyCompany.SomeClass [note the X!]. In practice, this is not of much concern, I'd say... * Wildcard expressions (* means any char sequence, everything else is taken literally) would also work for JDK1.3, are a little bit more work for me, are - I think - general enough, match the import syntax of Java. --------------- Second question: RegExp or wildcard expressions - which would you prefer? --------------- - I would try to implement it and get the build and test cases running again over the holidays for hansel 1.X ... Regards Harald M. Mueller |
From: Carfield Y. <car...@ne...> - 2004-12-07 10:23:56
|
According to the tutorial (http://hansel.sourceforge.net/doc/tutorial.html) , I have to change every test class in order to use Hansel, however this is a problem for my environment as we already have hundreds of testcase. Can I Decorator a testsuit rather than just testcase? |
From: Niklas M. <nik...@fr...> - 2004-11-26 19:50:37
|
be...@ar... wrote: >IŽm having problems checking out the latest version of Hansel via anon >CVS. The link http://cvs.sourceforge.net/viewcvs.py/hansel ends in >"502 Proxy Error, Reason: Max-Forwards has reached zero - proxy loop?". > > viewcvs is only the web interface to cvs, i don't think checking out hansel through the web interface works!? >How can I checkout the latest version from CVS? > > This depends on the tools you are using. If you are using commandline cvs, just issue the commands (described here: http://sourceforge.net/cvs/?group_id=54171): cvs -d:pserver:ano...@cv...:/cvsroot/hansel login cvs -z3 -d:pserver:ano...@cv...:/cvsroot/hansel co /hansel /This checks out the latest version of hansel 2 (which only supports jdk 1.5 and is not stable yet). To check out the newest version of the 1.0 release, you have to use the branch rel1: cvs -z3 -d:pserver:ano...@cv...:/cvsroot/hansel co -r rel1 /hansel/ If you are using eclipse, you can select "New Project" -> "Checkout project from cvs" and enter the same information there. >Another question: how can Hansel be modificated to calculate the >coverage rate of JUnit-Tests? > > Unfortunatly modifying hansel to do this requires quite some work (I believe). As much as I'd like to advertise hansel: If you want to get some kind of "coverage report", you are probably better of using tools like Emma (http://emma.sourceforge.net/samples.html) or JCoverage (http://www.jcoverage.com/). The approach of hansel is to require 100% code coverage, otherwise the test will fail. This way hansel will help you develop more testable code: Often, when you find code, you cannot easily cover by a test, it's time to refactor the code. If you want to take this approach, hansel will help you, by providing instant coverage information about the code you want to cover. Hope this helps, Niklas |
From: <har...@gm...> - 2004-11-26 13:30:46
|
> Hi, >=20 > > Does the same happen with other projects on sourceforge? >=20 > this was the first time I noticed this problem. > I tried checkout using plain cvs with the following commands such as > described on the sourceforge page: > cvs -d:pserver:ano...@cv...:/cvsroot/hansel login >=20 > Then I=B4m prompted for a password. Sourceforge page says to simply > press the ENTER key. Then I get the following: >=20 > Logging in to=20 > :pserver:ano...@cv...:2401:/cvsroot/hansel > CVS password: > cvs [login aborted]: unrecognized auth response from=20 > cvs.sourceforge.net: M Pser > verBackend::PserverBackend() Connect (Connection refused) >=20 > What is going wrong here and how can I fix the problem? ... sorry, I don't know much about CVS etc. It took me a day to set up my environment (with pageant and WinCVS on Windows), and it has worked since then - I keep my fingers crossed. It took me some reading of various documents on sourceforge - but I forgot which ... But digging around should help you. >=20 > > I'd say that this is against the idea of hansel: Very=20 > pointedly: Each > > non-covered branch is an error; there is no meaning in averages. > > A rough guide to "Junit quality" would be > > (number of errors + number of failures) / (number of all=20 > test cases) > > or even simply the 3 numbers JUnit tells you - this is IMO=20 > on the same rough > > statistical value as coverage "rates". >=20 > I simply tried counting the amount of Probes in relation to occuring > CoverageErrors. But this cannot work, because in a situation like > this: >=20 > if (i>0) > / \ > ... if (i>-5) > / \ > =20 > If i is >0 Hansel reports me "Coverage failure: Branch not > completely covered. Condition 'i <=3D 0'is not fulfilled." >=20 > For my purposes it would be enough if all CoverageErrors would be > reported, even if in a not covered branch (like i>-5 or i<=3D5 in the > above example). Then I could simply calculate > (ProbeCount-CoverageErrorCount)/ProbeCount. >=20 > Or if I could modificate Hansel to report covered Probes I could do > CoveredProbeCount/ProbeCount. >=20 The important methods are the public boolean displayFailure() methods. For example, the released 1.x version of hansel has in BranchProbe public boolean displayFailure() { return coverTrue ^ coverFalse; } This means that if either the "true" or the "false" branch is covered, we get a "failure". However, if both are *not* covered, it counts as *ok*, because presumably another probe (surrounding branch or method) must have failed. If you want to have a failure also in this case for the "inner" branch, simply change this to public boolean displayFailure() { return ! (coverTrue & coverFalse); } - i.e., it is a failure unless both sides of the branch are covered. You have to do similar things for SelectProbe. My modifications of hansel (newest checked-in sources) only filter out based on a complete method - i.e., if a method is covered at all, all missed branches inside are displayed as failures. Niklas's newest version (2.x for JDK 1.5), if I understand him correctly, also does this. Regards Harald |
From: <be...@ar...> - 2004-11-25 22:46:52
|
Hi, I=B4m having problems checking out the latest version of Hansel via anon CVS. The link http://cvs.sourceforge.net/viewcvs.py/hansel ends in "502 Proxy Error, Reason: Max-Forwards has reached zero - proxy loop?". How can I checkout the latest version from CVS? Another question: how can Hansel be modificated to calculate the coverage rate of JUnit-Tests? Thanks in advance. regards, James |
From: Dharnidhar V. <dv...@ar...> - 2004-11-09 06:59:52
|
Hello, =20 I have the following piece of code and this fails =20 ExampleTest.java =20 package junit.samples.money; =20 import junit.framework.*; import org.hansel.*; =20 public class ExampleTest extends TestCase { public ExampleTest(String name) { super(name); } =20 public static Test suite() { return new CoverageDecorator(ExampleTest.class, new Class[] { Example.class }); } =20 public void testAbs() { Example example =3D new Example(); assertEquals(1, example.abs(1)); } } =20 Example.java package junit.samples.money; =20 public class Example { public int abs(int i) { if (i > 0) { return i; } else { return -i; } } } =20 I compile and run this junit file using the following lines =20 javac -classpath .;../lib/junit.jar;../lib/bcel.jar;../lib/hansel.jar ../junit/samples/money/*.java java -classpath .;../lib/junit.jar;../lib/bcel.jar;../lib/hansel.jar;../. junit.textui.TestRunner junit.samples.money.ExampleTest =20 =20 I do not get any error. According to the documentation this should give an error =20 Test 'junit.samples.money.ExampleTest' does not cover line(s) [20] in junit.samples.money.Example.abs(I)I. =20 Did I do something wrong? =20 Thanks, Dharnidhar |
From: <har...@gm...> - 2004-10-24 21:15:57
|
Hi - I would guess the reason is that internally, Avalon (which I don't know anything about) inside the lookup uses reflection to find the class name of the Impl class (by "converting" com.iit.asp.network.EdgeBisector to com.iit.asp.network.EdgeBisectorImpl somehow - e.g. adding "Impl"). Now, EdgeBisectorImpl was loaded thru the CoverageDecorator, but the loading framework (i.e. org.apache.avalon.fortress.testcase.FortressTestCase) was loaded thru the default (or some other) classloader. Hence, the framework cannot find the EdgeBisectorImpl class. One possible solution: Include org.apache.avalon.fortress.testcase.FortressTestCase in the Class[] passed to the CoverageDecorator; you may have to add more and more classes recursively until everything works. However, this might fail because the TestCase classes must have been loaded *before* the coverage instrumentation starts ... In that case, you must somehow decouple the JUnit/Hansel Testcase from the Avalong testcase: I.e., the class containing the "lookup" function must already be loaded thru the CoverageDecorator. I would try to write a standard JUnit TestCase (*not* derived from org.apache.avalon.fortress.testcase.FortressTestCase) and, inside the test method, create the org.apache.avalon.fortress.testcase.FortressTestCase and delegate the lookup method thru it. When the org.apache.avalon.fortress.testcase.FortressTestCase is then included in the Class[] parameter of CoverageDecorator, the whole machine should work ... An additional hint: If there are too many classes to add to the Class[], you could try to use the (right now very undocumented) CVS version of hansel 1.x - I have added a CoverageDecorator constructor there which allows to load all classes with a certain prefix (.e. a package name): This could help to e.g. load all of "org.apache.avalon.*" thru the CoverageDecorator - you will then also cover all of this, however! Regards Harald M. Mueller -----Original Message----- From: han...@li... [mailto:han...@li...] On Behalf Of Anthony Bargnesi Sent: Friday, October 22, 2004 8:29 PM To: han...@li... Subject: [Hansel-general] Using Hansel with Avalon Fortress Container Hello Hansel users/developers, I like hansel it helps me with covering my test cases. My current project uses Componenet Oriented Programming with Apache Avalon and uses the Avalon Fortress container to lookup component implementations based on the component interface. The testcases have to extend org.apache.avalon.fortress.testcase.FortressTestCase instead of junit.framework.TestCase because the developer needs to be able to lookup the components it needs to test on. However when Hansel is added to the testcase code via public static junit.framework.Test suite() { return new org.hansel.CoverageDecorator(EdgeBisectorTest.class, new Class[]{EdgeBisectorImpl.class}); } the code will fail with a ClassCastException when trying to lookup the component with the following code: _nodeDAO = (com.iit.asp.dao.NetworkNodeDAO) lookup(com.iit.asp.dao.NetworkNodeDAO.ROLE); _edgeDAO = (com.iit.asp.dao.NetworkEdgeDAO) lookup(com.iit.asp.dao.NetworkEdgeDAO.ROLE); _edgeBisector = (com.iit.asp.network.EdgeBisector) lookup(com.iit.asp.network.EdgeBisector.ROLE); All of those lookups will fail with ClassCastExceptions. If there anyway to make Hansel work with Avalon Fortress Testcases. I would like to be able to provide coverage for my Components TestCases. I have provided the full FortressTestCase EdgeBisectorImplTest as an attachment. Thank you, Anthony Bargnesi Software Developer aba...@e-... 'There's no place like 127.0.0.1' |
From: Phil S. <ph...@co...> - 2004-10-23 11:19:02
|
Hello, I've created a MockDriver to test some other components, but I think this case would apply to a standard Driver implementation. There doesn't seem any way to cover the driver's static initializer: static { try { DriverManager.registerDriver(new MockDriver()); } catch (SQLException sqle) { throw new RuntimeException("Could not register MockDriver. " + sqle.getMessage()); } } How could one provoke the exception in the DriverManager? Best regards, Phil -- <URL:http://www.codestyle.org/> |
From: Lomax K. (e. I. MP PD S. 22 M. 1
<Ken...@mc...> - 2004-10-13 15:59:59
|
Hello I would like to use Hansel for J2ME projects using J2MEUnit. The example..... package Eg1; import junit.framework.TestCase; import junit.framework.Test; import org.hansel.*; public class TestExample extends TestCase{ public TestExample(String name){ super(name); } public void testsay(){ Example e = new Example(); assertEquals("Hi World!", e.say(true)); } public static void main(String[] args) { } public static Test suite() { return new CoverageDecorator(TestExample.class, new Class[] { Example.class }); } } Compiles and runs nicely, BUT the example.... package Eg1; import j2meunit.framework.TestCase; import j2meunit.framework.Test; import org.hansel.*; public class TestExample extends TestCase{ public TestExample(String name){ super(name); } public void testsay(){ Example e = new Example(); assertEquals("Hi World!", e.say(true)); } public static void main(String[] args) { } public static Test suite() { return new CoverageDecorator(TestExample.class, new Class[] { Example.class }); } } Gives two compilation errors: This static method (suite)cannot hide the instance method from TestCase And Type Mismatch cannot convert from CoverageDecorator to Test Can anyone please tell me why this is? Thank you very much Ken |
From: Niklas M. <nik...@fr...> - 2004-06-01 21:10:11
|
John Cleary wrote: > We are prepared to put in some effort to modify the package so that it > does not attempt to cover assert statements. > Can you make any comment about how easy it would be to modify Hansel > to do this and where we would need > to modify the code? I have written a ProbeFilter interface some time ago, that can be used to implement this. See this message for some details: http://sourceforge.net/mailarchive/message.php?msg_id=7562556 The ProbeFilter is a simple interface that allows to ignore certain probes. Unfortunatly this is only in CVS and not released yet (but building hansel is very easy: "ant dist"). There is an example implementation (StringProbeFilter) that filters expression based on a given String. The following code probably filters all assertions (I haven't had time to test it yet): public Test suite() { return new CoverageDecorator(Test.class, new Class[] {Covered.class}, new StringProbeFilter("$assertionsDisabled")); } Note that this code relies on the way the sun javac compiler compiles assertions. Maybe this does not work with the IBM JDK or other compilers. Niklas |
From: John C. <jc...@re...> - 2004-05-29 22:10:43
|
Thank you for your prompt reply. We have over 400,000 lines of code in our current system of which about 1/3 are unit tests using Junit. This contains 45,800 assert statements. The way we use assert statements the vast majority of these cannot be triggered - they are intended to be checks when the code is modified. If we have a condition which can be caused by external users inappropriately using the code then we have an if and throw some other exception (and we test for these in our unit tests already). Hansel otherwise meets our requirements for integrating with Junit and performing low cost coverage (as the classes not under test are not instrumented). We are prepared to put in some effort to modify the package so that it does not attempt to cover assert statements. Can you make any comment about how easy it would be to modify Hansel to do this and where we would need to modify the code? Thank you, John John G. Cleary Chief Technical Officer Reel Two Ltd. Innovation Park, Ruakura Rd. PO Box 1538 Hamilton New Zealand Ph: +64-7857-0706 FAX: +64-7-857-0701 eMail: jc...@re... Web: http://www.reeltwo.com On 23 May 2004, at 11:03 PM, Niklas Mehner wrote: > John Cleary wrote: > >> I have many assert statements in my code. >> I get messages such as the following whether I use >> CoverageDecorator or AssertionCoverageDecorator >> and whether or not I use the -ea option when I run the tests. > > You have to use the AssertionCoverageDecorator. > >> 1) Probe in "Child.java" line 27 Coverage failure: Branch not >> completely covered. Condition 'this.map.get(<local-3>) != null' is >> not fulfilled. >> at com.semkey.trie.Child.add(Child.java:27) >> >> I seem to be misunderstanding something - can someone tell me how to >> avoid these >> spurious messages on my asserts. > > I can only guess, what the source code looks like. But assuming your > class looks like this: > > public class Child { > private Map map; > > [...] > > public void add(Object key, Object value) { > assert map.get(key) == null : "Map already contains this key"; > map.put(key, value); > } > } > > You'll have to write a TestCase: > > public class ChildTest extends TestCase { > public static Test suit() { > return new AssertionCoverageDecorator(ChildTest.class, new Class[] > { Child.class }); > } > > public void testAdd() { > child.add(...); > > } > > private static boolean assertionsEnabled() { > boolean enabled = false; > assert enabled = true; > return enabled; > } > > public void testAssertion() { > if (assertionsEnabled()) { > try { > // some code, that triggers the assertion, probably adding > the same objects two times: > add(...); > add(...); > fail(); > } catch (AssertionError e) { > assertEquals(e.getMessage(), "Map already contains this key"); > } > } > } > } > > I hope this helps, > Niklas > > > |