diff --git a/buildSrc/src/main/kotlin/buildsrc/convention/kotlin-jvm.gradle.kts b/buildSrc/src/main/kotlin/buildsrc/convention/kotlin-jvm.gradle.kts index b24ab7b65..14847fc4c 100644 --- a/buildSrc/src/main/kotlin/buildsrc/convention/kotlin-jvm.gradle.kts +++ b/buildSrc/src/main/kotlin/buildsrc/convention/kotlin-jvm.gradle.kts @@ -12,8 +12,6 @@ plugins { id("buildsrc.convention.toolchain-jvm") } -// note: all subprojects are currently Kotlin Multiplatform, so this convention plugin is unused - java { withJavadocJar() withSourcesJar() diff --git a/settings.gradle.kts b/settings.gradle.kts index 8beac794c..d53d10207 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -16,7 +16,8 @@ include( ":modules:mockk-agent", ":modules:mockk-dsl", - ":modules:client-tests", + ":test-modules:client-tests", + ":test-modules:performance-tests", ) val androidSdkDetected: Boolean? by extra diff --git a/modules/client-tests/build.gradle.kts b/test-modules/client-tests/build.gradle.kts similarity index 100% rename from modules/client-tests/build.gradle.kts rename to test-modules/client-tests/build.gradle.kts diff --git a/modules/client-tests/src/jvmTest/kotlin/io/mockk/test/AnotherClientTest.kt b/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/test/AnotherClientTest.kt similarity index 100% rename from modules/client-tests/src/jvmTest/kotlin/io/mockk/test/AnotherClientTest.kt rename to test-modules/client-tests/src/jvmTest/kotlin/io/mockk/test/AnotherClientTest.kt diff --git a/modules/client-tests/src/jvmTest/kotlin/io/mockk/test/BasicClientTest.kt b/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/test/BasicClientTest.kt similarity index 100% rename from modules/client-tests/src/jvmTest/kotlin/io/mockk/test/BasicClientTest.kt rename to test-modules/client-tests/src/jvmTest/kotlin/io/mockk/test/BasicClientTest.kt diff --git a/modules/client-tests/src/jvmTest/kotlin/io/mockk/test/CompileTimeTest.kt b/test-modules/client-tests/src/jvmTest/kotlin/io/mockk/test/CompileTimeTest.kt similarity index 100% rename from modules/client-tests/src/jvmTest/kotlin/io/mockk/test/CompileTimeTest.kt rename to test-modules/client-tests/src/jvmTest/kotlin/io/mockk/test/CompileTimeTest.kt diff --git a/test-modules/performance-tests/README.md b/test-modules/performance-tests/README.md new file mode 100644 index 000000000..d97767847 --- /dev/null +++ b/test-modules/performance-tests/README.md @@ -0,0 +1,31 @@ +This is a performance testing setup for `mockk` using [JMH](https://github.com/openjdk/jmh). + +### How to run + +There are two ways to execute the benchmark code + +#### 1. Basic with Gradle + +```shell +./gradlew benchmark +``` + +It will use default configuration set in [build.gradle.kts](build.gradle.kts) and print out the results + +#### 2. Advanced with JMH binary + +If you want access to more JMH features you can + +```shell +./gradlew mainBenchmarkJar +``` + +to build the `.jar` file containing the benchmark code. It will be saved to `./build/benchmarks/main/jars` directory. + +From there you can run JMH with all the JMH-specific configuration options form CLI (even on different machine). + +```shell +java -jar ./build/benchmarks/main/jars/performance-tests-main-jmh-.jar -w 1 -i 2 -r 60s -prof jfr +``` + +which will attach the JFR profiler (not possible with `kotlinx-benchmark` executed from Gradle) diff --git a/test-modules/performance-tests/build.gradle.kts b/test-modules/performance-tests/build.gradle.kts new file mode 100644 index 000000000..dc79b6d68 --- /dev/null +++ b/test-modules/performance-tests/build.gradle.kts @@ -0,0 +1,32 @@ +import buildsrc.config.Deps +import kotlinx.benchmark.gradle.JvmBenchmarkTarget +import kotlinx.benchmark.gradle.benchmark + +plugins { + buildsrc.convention.`kotlin-jvm` + id("org.jetbrains.kotlinx.benchmark") version "0.4.5" +} + +dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-benchmark-runtime:0.4.5") + implementation(platform(Deps.Libs.kotlinCoroutinesBom)) + implementation(Deps.Libs.kotlinCoroutinesCore) + implementation(projects.modules.mockk) +} + +benchmark { + configurations { + named("main") { + iterationTime = 10 + iterationTimeUnit = "sec" + iterations = 3 + warmups = 1 + } + } + targets { + register("main") { + this as JvmBenchmarkTarget + jmhVersion = "1.35" + } + } +} diff --git a/test-modules/performance-tests/src/main/kotlin/io/mockk/performance/JmhTest.kt b/test-modules/performance-tests/src/main/kotlin/io/mockk/performance/JmhTest.kt new file mode 100644 index 000000000..ff6e6595a --- /dev/null +++ b/test-modules/performance-tests/src/main/kotlin/io/mockk/performance/JmhTest.kt @@ -0,0 +1,35 @@ +package io.mockk.performance + +import io.mockk.every +import io.mockk.mockk +import org.openjdk.jmh.annotations.Benchmark +import org.openjdk.jmh.annotations.BenchmarkMode +import org.openjdk.jmh.annotations.Mode +import org.openjdk.jmh.infra.Blackhole + +@BenchmarkMode(Mode.Throughput) +open class JmhTest { + + @Benchmark + fun noMockOrStub(blackhole: Blackhole) { + val mockedClass = MockedClass() + blackhole.consume(mockedClass) + } + + @Benchmark + fun simpleMock(blackhole: Blackhole) { + val mockedClass: MockedClass = mockk() + blackhole.consume(mockedClass) + } + + @Benchmark + fun simpleMockAndStub(blackhole: Blackhole) { + val mockedClass: MockedClass = mockk() + every { mockedClass.mockedFun() } returns "Hello, mockk!" + blackhole.consume(mockedClass) + } + + class MockedClass { + fun mockedFun(): String = "Hello, world!" + } +}