简体   繁体   English

Maven Cargo:集成测试在货物部署战争之前运行

[英]Maven Cargo: Integration Test runs before cargo deploys war

The integration pom.xml looks like 集成pom.xml看起来像

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.12</version>
            <executions>
                <execution>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.codehaus.cargo</groupId>
            <artifactId>cargo-maven2-plugin</artifactId>
            <version>1.4.8</version>
            <configuration>
                <container>
                    <containerId>tomcat7x</containerId>
                    <zipUrlInstaller>
                        <url>http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.16/bin/apache-tomcat-7.0.16.zip</url>
                        <downloadDir>${project.build.directory}/downloads</downloadDir>
                        <extractDir>${project.build.directory}/extracts</extractDir>
                    </zipUrlInstaller>
                </container>
                <configuration>
                    <properties>
                        <cargo.servlet.port>9090</cargo.servlet.port>
                    </properties>
                </configuration>
                <deployables>
                    <deployable>
                        <groupId>com.yahoo.pryme_services.inventory</groupId>
                        <artifactId>services</artifactId>
                        <type>war</type>
                        <pingURL>http://localhost:9090/services/rest/hello</pingURL>
                    </deployable>
                </deployables>
            </configuration>
            <executions>
                <execution>
                    <id>start-container</id>
                    <goals>
                        <goal>start</goal>
                    </goals>
                    <phase>pre-integration-test</phase>
                </execution>
                <execution>
                    <id>stop-container</id>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                    <phase>post-integration-test</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

The test looks like 测试看起来像

public class TestHelloIT {
    @Test
    public void testHello() {
        final String url = "http://localhost:9090/services/rest";
        final Client client = ClientBuilder.newClient();
        final WebTarget target = client.target(url).path("hello");
        final Invocation.Builder builder = target.request();
        final Response response = builder.get();

        assertEquals(Response.Status.ACCEPTED.getStatusCode(), response.getStatus());
    }
}

when i run mvn clean install , I see that tests runs and fails and cargo is no where in logs saying it was deploying. 当我运行mvn clean install ,我看到测试运行并失败,并且货物不在日志中说它正在部署。

[INFO] Scanning for projects...
[INFO] 
[INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Pryme REST Services Integration Test 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ integration ---
[INFO] Deleting /Users/harith/IdeaProjects/pryme_services/inventory/integration/target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ integration ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ integration ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ integration ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/harith/IdeaProjects/pryme_services/inventory/integration/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ integration ---
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/harith/IdeaProjects/pryme_services/inventory/integration/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ integration ---
[INFO] Surefire report directory: /Users/harith/IdeaProjects/pryme_services/inventory/integration/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.yahoo.pryme_services.inventory.integration.TestHelloIT
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.469 sec <<< FAILURE!
testHello(com.yahoo.pryme_services.inventory.integration.TestHelloIT)  Time elapsed: 0.435 sec  <<< ERROR!
javax.ws.rs.ProcessingException: java.net.ConnectException: Connection refused
    at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:229)
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:224)
    at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:655)
    at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:652)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:652)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:387)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:291)
    at com.yahoo.pryme_services.inventory.integration.TestHelloIT.testHello(TestHelloIT.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:211)
    at sun.net.www.http.HttpClient.New(HttpClient.java:308)
    at sun.net.www.http.HttpClient.New(HttpClient.java:326)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:996)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:932)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:850)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1300)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
    at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:321)
    at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:227)
    ... 40 more


Results :

Question

How can I make sure cargo deploys the war before tests actually run 如何在测试实际运行之前确保货物部署战争

So, it turns out that your issue is with the name of your test. 因此,事实证明您的问题与您的测试名称有关。 Rename it HelloIT from TestHelloIT and it should work. TestHelloIT重命名它的HelloIT ,它应该工作。

To understand why this is the case, let's remind ourselves of Maven's lifecycle: 要理解为什么会这样,让我们​​自己提醒Maven的生命周期:

validate
compile
test
package
integration-test
verify
install
deploy

And you'll notice that your test is running and failing in the Surefire plugin. 你会注意到你的测试正在运行并且在Surefire插件中失败了。 The Surefire plugin runs in the test phase, that is, it is running before your application is even packaged, let alone deployed, to your container in the integration-test phase. Surefire插件在测试阶段运行,也就是说,它在应用程序甚至在集成测试阶段打包(更不用说已部署)到容器之前运行。

You've actually correctly named your test for the Failsafe plugin, which is the one you wanted it to run in for the integration-test phase. 实际上,您已经为Failsafe插件正确命名了测试,该插件是您希望它在集成测试阶段运行的插件。 By default, it picks up classes named **/IT*.java , **/*IT.java , and **/*ITCase.java . 默认情况下,它会选择名为**/IT*.java**/*IT.java**/*ITCase.java

However, the naming convention for the Surefire plugin is **/Test*.java , **/*Test.java , and **/*TestCase.java . 但是,Surefire插件的命名约定是**/Test*.java**/*Test.java**/*TestCase.java So what you've managed to do is name the test so that it is picked up by both plugins, and since Surefire runs and fails first it isn't even getting to the point that your container would deploy. 所以你设法做的是命名测试,以便它被两个插件拾取,并且因为Surefire运行并且首先失败,所以甚至没有达到容器将部署的程度。

The rest looks fine so that should work. 其余看起来很好,所以应该工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM