From bff6e9205300adeecaab3f746fe3f5fc025533ce Mon Sep 17 00:00:00 2001 From: Adam <897017+aSemy@users.noreply.github.com> Date: Thu, 25 Aug 2022 22:49:58 +0200 Subject: [PATCH] introduce Kotlinx Benchmark tests (copied from #763 - credit to @tmszdmsk) refactor test projects to be in separate directory --- .../buildsrc/convention/kotlin-jvm.gradle.kts | 2 -- settings.gradle.kts | 3 +- .../client-tests/build.gradle.kts | 0 .../kotlin/io/mockk/test/AnotherClientTest.kt | 0 .../kotlin/io/mockk/test/BasicClientTest.kt | 0 .../kotlin/io/mockk/test/CompileTimeTest.kt | 0 test-modules/performance-tests/README.md | 31 +++++++++++++++++++ .../performance-tests/build.gradle.kts | 30 ++++++++++++++++++ .../kotlin/io/mockk/performance/JmhTest.kt | 23 ++++++++++++++ 9 files changed, 86 insertions(+), 3 deletions(-) rename {modules => test-modules}/client-tests/build.gradle.kts (100%) rename {modules => test-modules}/client-tests/src/jvmTest/kotlin/io/mockk/test/AnotherClientTest.kt (100%) rename {modules => test-modules}/client-tests/src/jvmTest/kotlin/io/mockk/test/BasicClientTest.kt (100%) rename {modules => test-modules}/client-tests/src/jvmTest/kotlin/io/mockk/test/CompileTimeTest.kt (100%) create mode 100644 test-modules/performance-tests/README.md create mode 100644 test-modules/performance-tests/build.gradle.kts create mode 100644 test-modules/performance-tests/src/main/kotlin/io/mockk/performance/JmhTest.kt 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 cafa67580..30f278083 100644 --- a/buildSrc/src/main/kotlin/buildsrc/convention/kotlin-jvm.gradle.kts +++ b/buildSrc/src/main/kotlin/buildsrc/convention/kotlin-jvm.gradle.kts @@ -11,8 +11,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..7ec1ed7a6 --- /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 2 ways to execute the benchmark code + +Basic with Gradle + +```shell +./gradlew benchmark +``` + +It will use default configuration set in [build.gradle.kts](build.gradle.kts) and print out the results + +#### 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/mockk-performance-main-jmh-.jar -w 1 -i 2 -r 60s -prof jfr +``` + +which will attach the JFR profiler (not possible with `kontlinx-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..bd8a43269 --- /dev/null +++ b/test-modules/performance-tests/build.gradle.kts @@ -0,0 +1,30 @@ +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("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") + implementation(projects.modules.mockk) +} + +benchmark { + configurations { + named("main") { + iterationTime = 60 + iterationTimeUnit = "sec" + iterations = 2 + 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..5d38f52b2 --- /dev/null +++ b/test-modules/performance-tests/src/main/kotlin/io/mockk/performance/JmhTest.kt @@ -0,0 +1,23 @@ +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 simpleMockAndStub(blackhole: Blackhole) { + val mockedClass: MockedClass = mockk() + every { mockedClass.mockedFun() } returns "Hello, mockk!" + blackhole.consume(mockedClass) + } + + class MockedClass { + fun mockedFun(): String = "Hello, world!" + } +}