On Jan 24, 2008 10:12 PM, Dan Fabulich <[EMAIL PROTECTED]> wrote: >
> Most of the JUnit reporting tools, including Ant's JunitReport task and > Maven's surefire-report plugin (but also including Hudson and others) > incorrectly assume that all of those testcases are methods of MyTestSuite. > As a result, it makes it look like all of your tests are methods of one > class in one package. If you've got two "testOutput" methods, they'll be > indistinguishable (except by stacktrace, if one is present). > > The same thing happens when you run TestNG tests: it always generates all > of the test results in one XML file. (Though it contains more > information, see below.) > > More generally, both Ant's JunitReport and surefire-report incorrectly > assume a one-to-one relationship between TestCase classes, XML files, and > "suites" of tests. They assume that every XML file contains one suite of > tests, which is the same thing as a TestCase class, and all of the tests > in the suite are just methods of the TestCase class. This assumption is > wrong. I guess the reason for the assumption is that nobody normally writes a test suite for JUnit, as it is needless coding that a pattern like **/*Test.class could do at the build file level, where you can also turn different tests on and off. But as you point out, it doesnt hold for other test systems. > Ant 1.6 (I think?) introduced a helpful attribute on all of its <testcase> > classes to include the class name of the class on every <testcase> > element: > > Example 7 > <testsuite name="com.mycompany.MyTestSuite" failures="0" errors="0" > tests="4" time="0.031"> > <properties><!-- ... --></properties > <testcase name="test1a" time="0.0" classname="com.mycompany.Test1" /> > <testcase name="test1b" time="0.0" classname="com.mycompany.Test1" /> > <testcase name="test2a" time="0.0" classname="com.mycompany.Test2" /> > <testcase name="test2b" time="0.0" classname="com.mycompany.Test2" /> > <testcase name="test3a" time="0.0" classname="com.mycompany.Test3" /> > <testcase name="test3b" time="0.0" classname="com.mycompany.Test3" /> > </testsuite> I forget when, but take your word for it. > This is good, because it allows you to figure out which class the method > really belongs to. This is what TestNG outputs when it generates > JUnit-like results. Unfortunately, nobody honors the "classname" > attribute, including Ant 1.7's JunitReport task! You contributions to the XSL file are welcome :) > > Even if we did try to honor that information and report on it in the HTML, > how would we do it? Right now, the reports are organized in terms of > packages, and within the packages you'll get a list of classes (assumed > incorrectly to be the same thing as "suites"), and within the list of > classes you'll get a list of test method names. There's no room for > "suites" (as distinct from classes) in these reports at all. > > And arguably there shouldn't be a place for this information, because > apparently 80-90% of the time suites aren't being used; adding a "suites" > section would be redundant in those cases. > > We could throw away the "suite" wrapper and pretend as if the tests were > just classes and methods, but note something else: the sum of the "time" > attribute on the <testcase> elements is normally different from the "time" > attribute on the <testsuite>. That's because the timer has a 16ms > resolution on most operating systems. > > In bug SUREFIRE-433, it was argued that we should generate separate JUnit > XML files for every class. You could even imagine converting the results > from Example 7 into results that looked like Example 2, throwing away all > of the suite-level information. > > I certainly want to be conservative in what I emit and liberal in what I > accept, but I *really* don't want to throw away information, especially at > the XML level. With that said, as we're trying to make the report look > something like the way it looks today, we're going to lose suite-level > information in the HTML. > > What I propose is that, in order to avoid destroying information, Surefire > should generate XML that looks like Example 7 (all-in-one-file), and not > try to fake it to look like Example 2 (one-file-per-class). (TestNG's > junit-like output also generates files like Example 7.) However, when it > comes time to generate an HTML report, surefire-reports will discard > suite-level information, and treat large suites like Example 7 as if they > had been presented in separate files like Example 2. I'd argue that all > of the other JunitReport-like tools (including Ant) should probably follow > the same lead. I think that if everyone else has a bug, its hard to call it a bug. More a presentation choice :) > My proposal is not obviously right, because, again, most other JUnit > report tools also have this reporting bug; when they try to format TestNG > output or Surefire output, they'll incorrectly report all methods to be > members of the suite class. Maybe since we expect EVERYONE to have this > bug, we should be even more conservative in what we emit and generate > multi-file output, just so the other tools will know how to interpret it > correctly. That would make it more likely that the HTML output would > contain complete information. > > What do other people think? Agree, disagree? I do need to allocate time to fix reporting in Ant, both what we generate (assuming a junit4 task), and what the tool processes. Me, I'm more concerned with the problem of trying to merge log results from a server and a client, as the current reports only pick the stdout and stderr from one side of the party, -steve