Unit Test #
Unit testing adalah metode pengujian perangkat lunak di mana unit terkecil dari kode, biasanya sebuah metode atau fungsi, diuji untuk memastikan bahwa ia berfungsi sebagaimana mestinya. Di Java, unit testing umumnya dilakukan menggunakan pustaka seperti JUnit dan TestNG. JUnit adalah salah satu pustaka paling populer untuk unit testing di Java dan menyediakan berbagai fitur untuk menulis dan menjalankan tes.
JUnit #
JUnit adalah framework testing untuk Java yang memungkinkan pengembang menulis dan menjalankan tes unit secara otomatis.
Menambahkan Dependensi #
Untuk menggunakan JUnit, Anda perlu menambahkan dependensi ke dalam file build Anda.
Gradle:
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
Maven:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
Menulis Test Unit #
Contoh Kelas yang Diuji:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
}
Contoh Tes Unit dengan JUnit:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
@Test
void testAdd() {
Calculator calculator = new Calculator();
assertEquals(5, calculator.add(2, 3), "2 + 3 should equal 5");
}
@Test
void testSubtract() {
Calculator calculator = new Calculator();
assertEquals(1, calculator.subtract(3, 2), "3 - 2 should equal 1");
}
}
Penjelasan:
- @Test: Menandai metode sebagai metode tes.
- assertEquals(expected, actual, message): Memeriksa apakah nilai yang diharapkan sama dengan nilai aktual yang dihasilkan oleh metode yang diuji.
Lifecycle Test #
JUnit menyediakan anotasi untuk mengelola siklus hidup tes, seperti:
- @BeforeAll: Menjalankan kode sebelum semua tes dalam kelas dijalankan.
- @BeforeEach: Menjalankan kode sebelum setiap tes.
- @AfterEach: Menjalankan kode setelah setiap tes.
- @AfterAll: Menjalankan kode setelah semua tes dalam kelas dijalankan.
Contoh:
import org.junit.jupiter.api.*;
public class CalculatorTest {
private Calculator calculator;
@BeforeAll
static void setupBeforeAll() {
System.out.println("Setup before all tests");
}
@BeforeEach
void setupBeforeEach() {
calculator = new Calculator();
System.out.println("Setup before each test");
}
@Test
void testAdd() {
assertEquals(5, calculator.add(2, 3));
}
@Test
void testSubtract() {
assertEquals(1, calculator.subtract(3, 2));
}
@AfterEach
void teardownAfterEach() {
System.out.println("Teardown after each test");
}
@AfterAll
static void teardownAfterAll() {
System.out.println("Teardown after all tests");
}
}
TestNG #
TestNG adalah framework testing lain yang sering digunakan sebagai alternatif JUnit. Ia menyediakan fitur tambahan seperti testing paralel, dependensi antar tes, dan lebih banyak kontrol atas konfigurasi tes.
Menambahkan Dependensi #
Gradle:
testImplementation 'org.testng:testng:7.4.0'
Maven:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.4.0</version>
<scope>test</scope>
</dependency>
Menulis Test Unit #
Contoh Tes dengan TestNG:
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class CalculatorTest {
private Calculator calculator;
@BeforeClass
public void setup() {
calculator = new Calculator();
}
@Test
public void testAdd() {
Assert.assertEquals(calculator.add(2, 3), 5, "2 + 3 should equal 5");
}
@Test
public void testSubtract() {
Assert.assertEquals(calculator.subtract(3, 2), 1, "3 - 2 should equal 1");
}
}
Mocking Unit Test #
Untuk pengujian yang melibatkan dependensi atau layanan eksternal, Anda bisa menggunakan pustaka mocking seperti Mockito untuk mensimulasikan perilaku dependensi.
Contoh:
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.mockito.Mockito.*;
public class ServiceTest {
@Test
void testServiceMethod() {
Dependency mockDependency = Mockito.mock(Dependency.class);
when(mockDependency.getData()).thenReturn("mock data");
Service service = new Service(mockDependency);
String result = service.processData();
assertEquals("Processed: mock data", result);
}
}
Kesimpulan #
Unit testing di Java adalah praktik penting untuk memastikan bahwa setiap unit kode bekerja sebagaimana mestinya. Framework seperti JUnit dan TestNG memudahkan penulisan, eksekusi, dan pemeliharaan tes unit. Menggunakan anotasi untuk mengelola siklus hidup tes, dan pustaka mocking untuk menangani dependensi eksternal, membantu memastikan bahwa kode Anda berfungsi dengan baik dan memudahkan pengembangan perangkat lunak yang handal dan berkualitas.