= Spring AOT Smoke Tests image:https://img.shields.io/badge/Revved%20up%20by-Develocity-06A0CE?logo=Gradle&labelColor=02303A["Revved up by Develocity", link="https://ge.spring.io/scans?search.rootProjectNames=spring-aot-smoke-tests"] A suite of tests for applications using AOT on the JVM and in GraalVM native images. There are two types of tests: unit tests and application tests. Unit tests are processed ahead of time and are then either run on the JVM or as a native executable. Unit tests can be run on the JVM using the `test` task and as a native executable using the `nativeTest` task. Application tests are always executed on the JVM against an application that's running on the JVM or as a native executable. The `appTest` task tests the application running on the JVM.The `nativeAppTest` task tests the application running as a native executable. == Contributing Please read and follow the link:CONTRIBUTING.adoc[contributing guide]. == Initial Setup The smoke tests resolve commercial dependencies from https://repo.spring.io which requires authentication. Use the `REPO_SPRING_IO_USERNAME` and `REPO_SPRING_IO_PASSWORD` environment variables to provide the necessary credentials. == How to === Run all of a project's smoke tests [source,] ---- ./gradlew :::build ---- for example [source,] ---- ./gradlew :boot:actuator-webmvc:build ---- === Run a specific type of tests for a project [source,] ---- ./gradlew ::: ---- Valid test task names are: 1. `appTest` – tests the application running on the JVM 2. `nativeAppTest` – tests the application running as a native executable 3. `test` – executes the AOT-processed unit tests on the JVM 4. `nativeTest` – executes the AOT-processed unit tests in a native executable for example [source,] ---- ./gradlew :boot:actuator-webmvc:appTest ---- === Add a new smoke test 1. Create a new directory for your smoke test in the appropriate group 2. Include the directory in `settings.gradle` (new groups only) 3. Consult the https://github.com/spring-projects/spring-aot-smoke-tests/tree/ci/README.adoc[README in the `ci` branch] to update the CI infrastructure === Test against local changes ==== Your project uses Gradle [source,] ---- ./gradlew :::build --include-build /path/to/your/project ---- Gradle https://docs.gradle.org/current/userguide/composite_builds.html#command_line_composite[will then substitute the dependency] with your provided version. _Hint: You can use `--include-build` multiple times._ ==== Your project uses Maven or --include-build does not work First, install the snapshots into your local Maven cache. You can now consume those snapshots using `-PfromMavenLocal` which takes a comma-separated list of group IDs: [source,] ---- ./gradlew :rest-template:build -PfromMavenLocal=org.springframework,org.springframework.data ---- The preceding example will run the `rest-template` smoke test, resolving Spring Framework and Spring Data modules from your local Maven cache. === Using snapshots By default, the smoke tests will use snapshots of `org.springframework.*` dependencies. Note that `org.springframework.boot` and `org.springframework.cloud` dependencies are not affected. Their versions are controlled by the `springBootVersion` and `springCloudVersion` properties defined in `gradle.properties`. For each eligible dependency, the snapshot version that is used is derived from the dependency's default version: - `x.y.z-SNAPSHOT` is left as-is - `x.y.z` is changed to `x.y.z+1-SNAPSHOT` - `x.y.z-Mn` is changed to `x.y.z-SNAPSHOT` - `x.y.z-RCn` is changed to `x.y.z-SNAPSHOT` To disable this behavior, set the `forceSnapshots` property to `false`, as shown in the following example: [source,] ---- ./gradlew :boot:actuator-webmvc:build -PforceSnapshots=false ---- === Override a dependency version As the test doesn't use the Spring Dependency Management Plugin, you can't use the `ext['...'] = '...'` method. Instead, use https://docs.gradle.org/current/userguide/dependency_constraints.html[Gradle dependency constraints]. Say, for example, you want to update the version of Spring Session JDBC to `3.0.0-SNAPSHOT`: [source,] ---- dependencies { // ... constraints { implementation('org.springframework.session:spring-session-jdbc:3.0.0-SNAPSHOT') } } ---- This works for direct and transitive dependencies.