Skip to main content

Test Berdasarkan Kondisi

Sebenarnya kita bisa menggunakan Assumptions untuk menjalankan unit test berdasarkan kondisi tertentu. Namun JUnit menyediakan fitur yang lebih mudah untuk pengecekan beberapa kondisi, seperti kondisi sistem operasi, versi java, system property atau environment variable Ini lebih mudah dibandingkan menggunakan Assumptions.

Kondisi berdasarkan Sistem Operasi

Untuk kondisi sistem operasi, kita bisa menggunakan beberapa annotation @EnabledOnOs digunakan untuk penanda bahwa unit test boleh berjalan di sistem operasi yang ditentukan.@DisabledOnOs digunakan untuk penanda bahwa unit test tidak boleh berjalan di sistem operasi yang ditentukan.

@Test
@EnabledOnOs({OS.WINDOWS})
public void testOnlyRunOnWindows() {

}

@Test
@DisabledOnOs({OS.WINDOWS})
public void testDisableRunOnWindows() {

}

Kondisi berdasarkan Versi Java

Untuk kondisi versi Java yang kita gunakan, kita bisa menggunakan beberapa annotation @EnabledOnJre digunakan untuk penanda bahwa unit test boleh berjalan di Java versi tertentu. @DisabledOnJre digunakan untuk penanda bahwa unit test tidak boleh berjalan di Java versi tertentu. @EnabledForJreRange digunakan untuk penanda bahwa unit test boleh berjalan di range Java versi tertentu. @DisabledForJreRange digunakan untuk penanda bahwa unit test tidak boleh berjalan di range Java versi tertentu.

@Test
@EnabledOnJre({JRE.JAVA_17})
public void testOnlyRunJava17() {

}

@Test
@DisabledOnJre({JRE.JAVA_17})
public void testDisableRunJava17() {

}

@Test
@EnabledForJreRange(min = JRE.JAVA_17, max = JRE.JAVA_21)
public void testRunRangeJava17To21() {

}

@Test
@DisabledForJreRange(min = JRE.JAVA_17, max = JRE.JAVA_21)
public void testDisableRangeJava17To21() {

}

Kondisi berdasarkan System Property

Untuk kondisi nilai dari system property, kita bisa menggunakan beberapa annotation @EnabledIfSystemProperty untuk penanda bahwa unit test boleh berjalan jika system property sesuai dengan yang ditentukan.@DisabledIfSystemProperty untuk penanda bahwa unit test tidak boleh berjalan jika system property sesuai dengan yang ditentukan. Jika kondisinya lebih dari satu, kita bisa menggunakan @EnabledIfSystemProperties dan @DisabledIfSystemProperties.

// check system properties
@Test
public void testSystemProperties() {
Properties properties = System.getProperties();
properties.forEach((key, value) -> System.out.println(key + " : " + value));
}

@Test
@EnabledIfSystemProperties({
@EnabledIfSystemProperty(named = "java.vm.vendor", matches = "Red Hat, Inc.")
})
void testEnableVendorRedhat() {

}

@Test
@DisabledIfSystemProperties({
@DisabledIfSystemProperty(named = "java.vm.vendor", matches = "Red Hat, Inc.")
})
void testDisableVendorRedhat() {

}

Dengan menggunakan testSystemProperties(), akan mengeksekusi test untuk melakukan printout info terkait system pada komputer yang digunakan. Sedangkan pada parameter EnabledIfSystemProperties dan DisabledIfSystemProperties akan melakukan pengujian testing diuji jika parameternya cocok, jika tidak cocok akan di-skip.

info

Pada contoh kasus ini saya menggunakan sistem operasi GNU/Linux Fedora dan Java versi 21 dari default distribusi Fedora. Jadi hasil kemungkinan berbeda dimasing-masing sistem yang digunakan.

java.specification.version : 21
sun.jnu.encoding : UTF-8
java.class.path : /home/ucup/Workspace/eclipse-java/belajar-java-unit-test/target/test-classes:/home/ucup/Workspace/eclipse-java/belajar-java-unit-test/target/classes:/home/ucup/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.11.0/junit-jupiter-api-5.11.0.jar:/home/ucup/.m2/repository/org/opentest4j/opentest4j/1.3.0/opentest4j-1.3.0.jar:/home/ucup/.m2/repository/org/junit/platform/junit-platform-commons/1.11.0/junit-platform-commons-1.11.0.jar:/home/ucup/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar:/home/ucup/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.11.0/junit-jupiter-params-5.11.0.jar:/home/ucup/.m2/repository/org/junit/platform/junit-platform-launcher/1.11.0/junit-platform-launcher-1.11.0.jar:/home/ucup/.m2/repository/org/junit/platform/junit-platform-engine/1.11.0/junit-platform-engine-1.11.0.jar:/home/ucup/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.11.0/junit-jupiter-engine-5.11.0.jar:/home/ucup/App/eclipse/eclipse-java/eclipse/configuration/org.eclipse.osgi/766/0/.cp:/home/ucup/App/eclipse/eclipse-java/eclipse/configuration/org.eclipse.osgi/764/0/.cp
java.vm.vendor : Red Hat, Inc.
sun.arch.data.model : 64
java.vendor.url : https://www.redhat.com/
java.vm.specification.version : 21
os.name : Linux
sun.java.launcher : SUN_STANDARD
user.country : US
sun.boot.library.path : /usr/lib/jvm/java-21-openjdk/lib
sun.java.command : org.eclipse.jdt.internal.junit.runner.RemoteTestRunner -version 3 -port 40697 -testLoaderClass org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader -loaderpluginname org.eclipse.jdt.junit5.runtime -classNames com.timposulabs.DemoConditionTest
jdk.debug : release
sun.cpu.endian : little
user.home : /home/ucup
user.language : en
java.specification.vendor : Oracle Corporation
java.version.date : 2025-01-21
java.home : /usr/lib/jvm/java-21-openjdk
file.separator : /
java.vm.compressedOopsMode : Zero based
line.separator :

java.vm.specification.vendor : Oracle Corporation
java.specification.name : Java Platform API Specification
sun.management.compiler : HotSpot 64-Bit Tiered Compilers
java.runtime.version : 21.0.6+7
user.name : ucup
stdout.encoding : UTF-8
path.separator : :
os.version : 6.12.15-200.fc41.x86_64
java.runtime.name : OpenJDK Runtime Environment
file.encoding : UTF-8
java.vm.name : OpenJDK 64-Bit Server VM
java.vendor.version : (Red_Hat-21.0.6.0.7-1)
java.vendor.url.bug : https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora&component=java-21-openjdk&version=40
java.io.tmpdir : /tmp
java.version : 21.0.6
user.dir : /home/ucup/Workspace/eclipse-java/belajar-java-unit-test
os.arch : amd64
java.vm.specification.name : Java Virtual Machine Specification
native.encoding : UTF-8
java.library.path : /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib
java.vm.info : mixed mode, sharing
stderr.encoding : UTF-8
java.vendor : Red Hat, Inc.
java.vm.version : 21.0.6+7
sun.io.unicode.encoding : UnicodeLittle
java.class.version : 65.0

Kondisi berdasarkan Environment Variable

Untuk kondisi nilai dari environment variable, kita bisa menggunakan beberapa annotation @EnabledIfEnvironmentVariable untuk penanda bahwa unit test boleh berjalan jika environment variable sesuai dengan yang ditentukan. @DisabledIfEnvironmentVariable untuk penanda bahwa unit test tidak boleh berjalan jika environment variable sesuai dengan yang ditentukan. Jika kondisinya lebih dari satu, kita bisa menggunakan @EnabledIfEnvironmentVariables dan @DisabledIfEnvironmentVariables.

@Test
@EnabledIfEnvironmentVariables({
@EnabledIfEnvironmentVariable(named = "PROFILES", matches = "DEV")
})
void testEnableOnEnvProfileDev() {

}

@Test
@DisabledIfEnvironmentVariables({
@DisabledIfEnvironmentVariable(named = "PROFILES", matches = "DEV")
})
void testDisabledOnEnvProfileDev() {

}