Home > Java > Javaๅคš่ญ˜ > ๐Ÿ“[Post] ์ž๋ฐ”๋‹ค์‹(Javaๅคš่ญ˜) - 1

๐Ÿ“[Post] ์ž๋ฐ”๋‹ค์‹(Javaๅคš่ญ˜) - 1
Post Backend

์ž๋ฐ”๋‹ค์‹(Javaๅคš่ญ˜) 1ํŽธ.

1. โ€˜mainClassNameโ€™ ์†์„ฑ ์ถ”๊ฐ€.

๋ฉ”์ธ ํด๋ž˜์Šค์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ดˆ๊ธฐ ์ง„์ž…์ ์„ ์ง€์ •ํ•ด์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • application ๋ธ”๋ก ์•ˆ์— ๋ฉ”์ธ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฉ”์ธ ํด๋ž˜์Šค๊ฐ€ com.example.Main ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” bundle.gradle ํŒŒ์ผ ๋‚ด๋ถ€์—์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
plugins {
    id 'java'
    id 'application'
}

application {
    mainClassName = 'com.example.Main' // ์—ฌ๊ธฐ์— ๋ฉ”์ธ ํด๋ž˜์Šค์˜ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    applicationDefaultJvmArgs = [
        "-XX:+EnableDynamicAgentLoading",
        "-Djdk.instrument.traceUsage"
    ]
}

repositories {
    mavenCentral()
}

dependencies {
    // Your dependencies here
}

๋ฉ”์ธ ํด๋ž˜์Šค ์˜ˆ์‹œ

  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฉ”์ธ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฒผ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
package com.example;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

2. @ExtendWith ์–ด๋…ธํ…Œ์ด์…˜.

  • @ExtendWith ์–ด๋…ธํ…Œ์ด์…˜์€ Junit 5์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ์— ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.
  • JUnit 5์˜ ํ™•์žฅ ๋ชจ๋ธ์€ ๋‹ค์–‘ํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์‹คํ–‰์˜ ํŠน์ • ์ง€์ ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

@ExtendWith ์–ด๋…ธํ…Œ์ด์…˜์˜ ์—ญํ• 

  1. ํ™•์žฅ ํด๋ž˜์Šค ์ง€์ • : @ExtendWith ์–ด๋…ธํ…Œ์ด์…˜์€ ํ™•์žฅ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์ •๋œ ํ™•์žฅ ํด๋ž˜์Šค๋Š” ํ…Œ์ŠคํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด์˜ ํŠน์ • ์ง€์ ์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ „ํ›„, ๊ฐ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์ „ํ›„ ๋“ฑ ๋‹ค์–‘ํ•œ ์‹œ์ ์—์„œ ํŠน์ • ๋™์ž‘์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ปจํ…์ŠคํŠธ ์„ค์ • ๋ฐ ์ฃผ์ž… : ํ™•์žฅ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ปจํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ , ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ์— ํ•„์š”ํ•œ ๊ฐ์ฒด๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ชจ๋“ˆํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์กฐ๊ฑด๋ถ€ ์‹คํ–‰ : ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ํ™˜๊ฒฝ ์„ค์ •์ด๋‚˜ ์‹œ์Šคํ…œ ์ƒํƒœ์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์ปค์Šคํ…€ ์–ด์„œ์…˜ ๋ฐ ๋ณด๊ณ  : ํ™•์žฅ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์–ด์„œ์…˜ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์ปค์Šคํ…€ ๋ฐฉ์‹์œผ๋กœ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ

์•„๋ž˜๋Š” @ExtendWith ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.Test;

class MyExtension implements BeforeEachCallback {
    @Override
    public void beforeEach(ExtensionContext context) {
        System.out.println("Before each test method");
    }
}

@ExtendWith(MyExtension.class)
public class MyTest {
    
    @Test
    void testMethod1() {
        System.out.println("Test method 1");
    }
    
    @Test
    void testMethod2() {
        System.out.println("Test method 2");
    }
}
  • ์œ„ ์ฝ”๋“œ์—์„œ MyExtension ํด๋ž˜์Šค๋Š” BeforeEachCallback ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๊ฐ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • @ExtendWith(MyExtension.class) ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด MyTest ํด๋ž˜์Šค์— ์ด ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ ๊ฐ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „์— โ€œBefore each test methodโ€ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ด์ฒ˜๋Ÿผ @ExtendWith ์–ด๋…ธํ…Œ์ด์…˜์€ JUnit 5์˜ ํ™•์žฅ ๋ชจ๋ธ์„ ํ™œ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

3. ์–ด์„œ์…˜(Assertion)

  • ์–ด์„œ์…˜(Assertion)์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐ ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ์—์„œ ์ฝ”๋“œ์˜ ํŠน์ • ์ƒํƒœ๋‚˜ ์กฐ๊ฑด์ด ์ฐธ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์žฅ์ด๋‚˜ ๋ช…๋ น๋ฌธ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์–ด์„œ์…˜์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ์  ์ผ๊ด€์„ฑ๊ณผ ์ •ํ™•์„ฑ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฃผ๋กœ ๋””๋ฒ„๊น…๊ณผ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ๋ชฉ์ .

  1. ์กฐ๊ฑด ๊ฒ€์ฆ : ์–ด์„œ์…˜(Assertion)์€ ํŠน์ • ์กฐ๊ฑด์ด ์ฐธ์ธ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ด๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ ์ฆ‰์‹œ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋””๋ฒ„๊น… ๋„๊ตฌ : ์–ด์„œ์…˜(Assertion)์€ ๊ฐœ๋ฐœ ์ค‘์— ์ฝ”๋“œ์˜ ์˜ค๋ฅ˜๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ๊ฐ€์ •์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์–ด์„œ์…˜์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ๋นจ๋ฆฌ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๋ฌธ์„œํ™” : ์–ด์„œ์…˜(Assertion)์€ ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ์  ์ „์ œ ์กฐ๊ฑด์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜์—ฌ, ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์ƒํƒœ์— ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์–ด์„œ์…˜(Assertion)์˜ ์˜ˆ

  1. ์ž๋ฐ”(Java)
    public void setAge(int age) {
     assert age > 0 : "Age must be positive";
     this.age = age;
    }
    
  2. JUnit (Java)
    ```java
    import static org.junit.jupiter.api.Assertions.assertEquals;
    import org.junit.jupiter.api.Test;

public class MyTest {

@Test
void testAddition() {
    int result = 2 + 3;
    assertEquals(5, result, "2 + 3 should equal 5");
} } ```

์–ด์„œ์…˜ ์‚ฌ์šฉ ์‹œ๊ธฐ

  • ๊ฐœ๋ฐœ ์ค‘ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ์  ์ผ๊ด€์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ณดํ†ต ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ : ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ(JUnit, TestNG ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ํŠน์ • ์กฐ๊ฑด์ด ๊ธฐ๋Œ€ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜ ์‚ฌํ•ญ

  • ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ์˜ ์‚ฌ์šฉ : ์–ด์„œ์…˜์€ ์ฃผ๋กœ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋น„ํ™œ์„ฑํ™”๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์กฐ๊ฑด ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ€์ž‘์šฉ ์—†๋Š” ์ฝ”๋“œ : ์–ด์„œ์…˜ ๋‚ด๋ถ€์—์„œ๋Š” ๋ถ€์ž‘์šฉ์ด ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์–ด์„œ์…˜์€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์กฐ๊ฑด๋งŒ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝ.

  • ์–ด์„œ์…˜์€ ์ฝ”๋“œ์˜ ํŠน์ • ์กฐ๊ฑด์ด ์ฐธ์ž„์„ ๊ฒ€์ฆํ•˜๋Š” ๋„๊ตฌ๋กœ, ๋””๋ฒ„๊น…๊ณผ ํ…Œ์ŠคํŠธ ๊ณผ์ •์—์„œ ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ์  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š”๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ์˜ ๊ฐ€์ •๊ณผ ์‹ค์ œ ๋™์ž‘์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋ฌธ์ œ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.