You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@maven.apache.org by Stevo Slavić <ss...@gmail.com> on 2009/03/26 11:31:55 UTC

Code coverage reports & Activating profile if (site) plug-in is run

Hello maven users,

Is there a way to activate a profile based on plug-in being run? I'm trying
to find a workaround for issue present in both free open source code
coverage maven report options, cobertura and emma (if there are more, please
let me know). AFAIK, both, to produce report, run code instrumentalization,
execute test phase in lifecycle separate from default, and then generate
output. Problem is that test phase is so to speak hardcoded, so surefire
execution configured to run in integration-test phase doesn't get run and
coverage data will apear to be lower than what they actually are.

Typicaly I use TestNG for tests, and it's test groups feature, separating
tests in at least "unit", and "integration" and/or "functional" test groups.
Then I configure surefire to run "unit" tests in "test" phase, and all the
others in "integration-test" phase. If profile could be activated based on
plug-in being run, workaround would be to create a profile, activeted on
e.g. site plug-in being run, and in that profile surefire could be
configured to contain only one default execution on test phase but would
include all the tests.

IMO, best solution would be to have following (in cobertura case,
longstanding) issues fixed ( http://jira.codehaus.org/browse/MCOBERTURA-86 ,
http://jira.codehaus.org/browse/MOJO-1299 )

Regards,
Stevo.

Re: Code coverage reports & Activating profile if (site) plug-in is run

Posted by Stevo Slavić <ss...@gmail.com>.
I must have asked a silly question, or ...

Nevertheless, I'm taking another approach now, by trying to fix
http://jira.codehaus.org/browse/MCOBERTURA-86 issue. To make the cobertura
maven plug-in execute verify phase instead of test phase in cobertura
lifecycle, I've created a new report mojo ("cobertura-integration" goal)
that extends existing cobertura report, with @execute phase attribute set to
verify. Verify is needed so that post-integration-test bound executions can
kick in, e.g. to stop server where application was deployed for functional
testing. In war project pom I've configured jetty, selenium, and surefire
similarly to this<http://www.theserverlabs.com/blog/2008/09/17/automated-integration-testing-with-selenium-maven-and-jetty/>blog
post (see [1] Jetty, selenium, and surefire plug-in configuration).

When running "mvn verify site", unit tests pass, then functional tests begin
executing and pass well, but in post-integration-test phase jetty stop goal
is executed and immediately after that selenium stop-server goal is run but
it fails with fatal error (see [2] Selenium stop-server "Connection reset"
error log. Because of this failure in default lifecycle before site/report
generation starts, build doesn't even get to run my new
cobertura-integration goal. Based on all given information, does anyone see
what could be the cause of this "connection reset" error? Is order of the
plug-ins correct, or should selenium server start/stop before jetty.

Then I tried running "mvn cobertura:cobertura-integration" on it's own, but
then another problem occurred - it seems jetty runs maven war plug-in and,
probably instructed by cobertura, tries to set war plug-in's
classesDirectory so that cobertura instrumented classes get used instead of
regular ones. Because classesDirectory is read-only property, maven war
plugin breaks the build (see [3] cobertura:cobertura-integration Maven log).
Build fails even if I configure jetty classesDirectory configuration element
to ${basedir}/target/generated-classes/cobertura. Does anyone know how to
overcome this? Some jetty configuration?

Regards,
Stevo.


[1] Jetty, selenium, and surefire plug-in configuration
            ...
            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>7.0.0.pre5</version>
                <configuration>
                    <scanIntervalSeconds>5</scanIntervalSeconds>
                    <stopPort>9966</stopPort>
                    <stopKey>foo</stopKey>
                    <connectors>
                        <connector
implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                            <port>8080</port>
                            <maxIdleTime>60000</maxIdleTime>
                        </connector>
                        <connector
implementation="org.mortbay.jetty.ssl.SslSelectChannelConnector">
                            <port>8443</port>
                            <maxIdleTime>60000</maxIdleTime>

<keystore>${basedir}/src/test/jetty/server.keystore</keystore>
                            <keyPassword>123456</keyPassword>
                        </connector>
                    </connectors>
                    <webAppConfig>
                        <contextPath>/mamp</contextPath>
                    </webAppConfig>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.mortbay.jetty</groupId>
                        <artifactId>jetty-ssl</artifactId>
                        <version>7.0.0.pre5</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>start-jetty</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>run-exploded</goal>
                        </goals>
                        <configuration>
                            <daemon>true</daemon>
                        </configuration>
                    </execution>
                    <execution>
                        <id>stop-jetty</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>selenium-maven-plugin</artifactId>
                <version>1.0-rc-2-SNAPSHOT</version>
                <executions>
                    <execution>
                        <id>start-selenium</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>start-server</goal>
                        </goals>
                        <configuration>
                            <background>true</background>
                            <logOutput>true</logOutput>
                            <multiWindow>true</multiWindow>

<firefoxProfileTemplate>${basedir}/src/test/selenium</firefoxProfileTemplate>
                        </configuration>
                    </execution>
                    <execution>
                        <id>stop-selenium</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>stop-server</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <id>integration-test</id>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>test</goal>
                        </goals>
                        <configuration>
                            <groups>functional</groups>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            ...



[2] Selenium stop-server "Connection reset" error log

[INFO]
------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO]
------------------------------------------------------------------------
[INFO] Connection reset
[INFO]
------------------------------------------------------------------------
[INFO] Trace
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:168)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:652)
    at
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1064)
    at java.net.URLConnection.getContent(URLConnection.java:688)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
    at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1392)
    at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:2587)
    at
org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:178)
    at
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getProperty(ScriptBytecodeAdapter.java:477)
    at
org.codehaus.mojo.selenium.StopServerMojo.execute(StopServerMojo.groovy:66)
    at
org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:483)
    at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:678)
    at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:540)
    at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:519)
    at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:371)
    at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:332)
    at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:181)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:356)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:137)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:356)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
    at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
    at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
    at org.codehaus.classworlds.Launcher.main(Launcher.java:375)


[3] cobertura:cobertura-integration Maven log

[INFO] [cobertura:cobertura-integration]
[INFO] Cobertura 1.9 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file
Cobertura: Loaded information on 19 classes.
Report time: 282ms

[INFO] Cobertura Report generation was successful.
[INFO]
------------------------------------------------------------------------
[INFO] Building A Web Project
[INFO]    task-segment: [cobertura:cobertura-integration]
[INFO]
------------------------------------------------------------------------
[INFO] Preparing cobertura:cobertura-integration
[INFO] [resources:resources]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 95 resources
[INFO] [compiler:compile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [cobertura:instrument]
[INFO] Cobertura 1.9 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file
Cobertura: Loaded information on 175 classes.
Instrumenting 175 files to
D:\work\java\workspaces\projects\awebproject\target\generated-classes\cobertura
Cobertura: Saved information on 175 classes.
Instrument time: 579ms

[INFO] Instrumentation was successful.
[INFO] [resources:testResources]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
[INFO] [compiler:testCompile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [surefire:test]
[INFO] Surefire report directory:
D:\work\java\workspaces\projects\awebproject\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running TestSuite
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.563 sec

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[INFO]
------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO]
------------------------------------------------------------------------
[INFO] Error configuring: org.apache.maven.plugins:maven-war-plugin. Reason:
ERROR: Cannot override read-only parameter: classesDirectory in goal:
war:war
[INFO]
------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.lifecycle.LifecycleExecutionException: Error configuring:
org.apache.maven.plugins:maven-war-plugin. Reason: ERROR: Cannot override
read-only parameter: classesDirectory in goal: war:war
        at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:707)
        at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:540)
        at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkProjectLifecycle(DefaultLifecycleExecutor.java:1168)
        at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkLifecycle(DefaultLifecycleExecutor.java:1009)
        at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:627)
        at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:553)
        at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:523)
        at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:371)
        at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:332)
        at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:181)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:356)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:137)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:356)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at
org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
        at
org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: org.apache.maven.plugin.PluginConfigurationException: Error
configuring: org.apache.maven.plugins:maven-war-plugin. Reason: ERROR:
Cannot override read-only parameter: classesDirectory in goal: war:war
        at
org.apache.maven.plugin.DefaultPluginManager.validatePomConfiguration(DefaultPluginManager.java:1150)
        at
org.apache.maven.plugin.DefaultPluginManager.getConfiguredMojo(DefaultPluginManager.java:698)
        at
org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:461)
        at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:678)
        ... 20 more






On Thu, Mar 26, 2009 at 12:31 PM, Stevo Slavić <ss...@gmail.com> wrote:

> Hello maven users,
>
> Is there a way to activate a profile based on plug-in being run? I'm trying
> to find a workaround for issue present in both free open source code
> coverage maven report options, cobertura and emma (if there are more, please
> let me know). AFAIK, both, to produce report, run code instrumentalization,
> execute test phase in lifecycle separate from default, and then generate
> output. Problem is that test phase is so to speak hardcoded, so surefire
> execution configured to run in integration-test phase doesn't get run and
> coverage data will apear to be lower than what they actually are.
>
> Typicaly I use TestNG for tests, and it's test groups feature, separating
> tests in at least "unit", and "integration" and/or "functional" test groups.
> Then I configure surefire to run "unit" tests in "test" phase, and all the
> others in "integration-test" phase. If profile could be activated based on
> plug-in being run, workaround would be to create a profile, activeted on
> e.g. site plug-in being run, and in that profile surefire could be
> configured to contain only one default execution on test phase but would
> include all the tests.
>
> IMO, best solution would be to have following (in cobertura case,
> longstanding) issues fixed ( http://jira.codehaus.org/browse/MCOBERTURA-86,
> http://jira.codehaus.org/browse/MOJO-1299 )
>
> Regards,
> Stevo.
>