Maven build - run an application then perform JUnit tests - maven

As part of my build process, I would like maven to start a program and then execute JUNIT tests in the same phase, which is the mvn test phase.
I am using Spring Boot as well as the Spring Boot Maven plugin. As you know Spring boot has an embedded tomcat container. So I can just run my application on this tomcat server by just running as an application in eclipse.
For example when I run mvn test, I would like my application to run FIRST and then have the tests executed.
I have seen the exec-maven plugin being used and that you specify the phase in the maven build cycle that you want the application to run. The earliest phase that it allows you to specify is the test phase.
But I'm not sure if the Application will run immediately before the tests?
How do I specify in my POM file that I want the application to run BEFORE the test phase?

Related

How to visualize output of JUnit integration tests in IntelliJ when using docker-maven-plugin?

IntelliJ has a nice integration with JUnit that allows me to run some or all of my unit tests and visualize the results of each test and test class with a collapsible/expandable hierarchy that even takes into account JUnit5 nested test classes. I can click on any failed test to see the log output from running just that method. It looks like this:
I have now defined an integration test phase to my project using two popular Maven plugins:
maven-failsafe-plugin separates my JUnit tests into two phases. The test classes ending in "Test" run during the test phase, and those ending in "IT" run during the integration-test phase.
fabric8's docker-maven-plugin which I'm using to spin up a test database in the pre-integration-test phase and shut it down in the post-integration-test phase.
I can tell IntelliJ to run a Maven command (such as maven clean verify) that runs this lifecycle and tells me if the tests have passed. However, a Maven "run configuration" in IntelliJ doesn't produce the same helpful output. All I get is the success or failure status of each phase, and I can navigate to the console output for a phase, but not an individual test. The output looks like this:
So here's my question: Is there any way to configure IntelliJ (or Maven, or both) to give that hierarchical test-by-test output while keeping the Maven lifecycle I've defined, with the temporary use of a docker-container database for my integration tests?
I know that I can manually spin up the test database container, use IntelliJ's JUnit runner for my integration tests, and then manually stop the container. Can I do better?
Unfortunately there is no tool to show test-by-test output while keeping the Maven lifecycle as Maven run configuration is used in this case. Please use Junit run configuration for Class/method output in test runner tab.

Spring Boot Maven plugin run goal doesn't invoke tests

Following command doesn't run any of my tests :
mvn spring-boot:run
whereas plain old mvn test does.
I have added these annotations to the tests :
#RunWith(SpringRunner.class)
#SpringBootTest
I do not see any relevant information on the plugin documentation pages, either here or here
Spring boot maven plugin
Requires a Maven project to be executed. Requires dependency
resolution of artifacts in scope: test. Since version: 1.1. Binds by
default to the lifecycle phase: validate. Invokes the execution of the
lifecycle phase test-compile prior to executing itself.
More details
Maven lifecycles:
validate compile test ...
More details
To sum up: spring-boot:run only compiles tests and execute maven validate phase. One of the possible solutions to execute tests before start of the application: mvn test spring-boot:run

Running API tests in Teamcity build step

I have a Spring Boot Maven app. There is a bunch of API tests using RestAssured, inside the project. These tests are not marked as #SpringBootTest, therefore when running them, the context of the application is not raising so to make tests pass the application must be up and running before.
I'm creating a Teamcity build in which I want to:
Start the app
Run RestAssured tests
Create an artifact
I'm using an Agent with maven installed.
The question is:
How can I create a build step where I run the application on a defined port and then run api tests
against it?
What I've tried is creating such build steps:
Command line: mvn spring-boot:run & sleep 50s mvn test
Maven step/command line: mvn clean package -DskipTests
I thought the spring boot application will start and tests will be ready to start after some time. On successful step 1 I create an artifact.
The problem is that the build step is never exited because of spring boot app running (blocking terminal).

How to run junit test case after bootRun (server startup) using gradle

In my spring boot application I have junit test case. I implemented with application listener which will do certain task after server start up. Now I need to run the Junit test case after the bootRun. Basically the application runs like this., I am using gradle build script.
compile->build (running junit test cases)->bootRun
Can we run the test case after bootRun?
Thanks in advance

Running selenium unit tests with Spring Boot

I have some integration tests that use Selenium and the HtmlUnitDriver to verify my web app behaves correctly from the browser. In IntelliJ, I'm able to run ./gradlew bootRun to start my embedded web server, and then run my Selenium tests manually.
The tests run as expected.
However, I'm wondering what the best strategy is to run these in an automated fashion on my CI Server (TeamCity in this case). Simply running bootRun doesn't quite work since the task runs until it gets terminated.
Should I create a script that runs bootRun, and then I can terminate gradle somehow after the tests complete? I'd also like to use my application.properties file I have in src/test/resources instead of src/main/resources which bootRun uses normally.

Resources