URL, 파일 시스템, JUnit

HeeJune KIM·2024년 7월 23일
post-thumbnail

1. URL 규격과 형식

URL이란?

URL(Uniform Resource Locator): 웹 리소스의 위치를 지정하는 문자열

URL의 구성 요소

  • 프로토콜: 리소스를 액세스하는 방법을 나타냅니다. 예: http, https, ftp.
  • 호스트: 리소스를 호스팅하는 서버의 도메인 이름이나 IP 주소입니다. 예: www.example.com.
  • 포트 번호: 서버의 특정 포트를 지정합니다. 기본값이 아닌 경우에만 포함됩니다. 예: :8080.
  • 경로: 서버 내에서 리소스의 위치를 지정합니다. 예: /path/to/resource.
  • 쿼리 문자열: 리소스에 대한 추가 매개변수를 전달합니다. 예: ?key=value&key2=value2.
  • 프래그먼트: 리소스 내의 특정 부분을 지정합니다. 예: #section.

URL 형식

URL의 일반적인 형식은 다음과 같습니다:

protocol://host:port/path?query#fragment

예제:

https://www.example.com:8080/path/to/resource?key=value#section

참고 문헌

2. 파일 경로

파일 경로를 URL로 표시하는 방식

파일 경로를 URL로 표시할 때는 파일 프로토콜을 사용
파일 URL은 로컬 파일 시스템 내의 파일 위치를 지정

파일 URL 형식

file:///path/to/file
  • Unix 스타일: file:///home/user/file.txt
  • Windows 스타일: file:///C:/Users/username/file.txt

Unix 스타일 경로 문자열

Unix 스타일 경로는 슬래시(/)를 구분자로 사용합니다. 절대 경로는 루트 디렉토리(/)에서 시작하며, 상대 경로는 현재 디렉토리에서 시작합니다.

Windows 스타일 경로 문자열

Windows 스타일 경로는 백슬래시(\)를 구분자로 사용합니다. 절대 경로는 드라이브 문자로 시작하며, 상대 경로는 현재 디렉토리에서 시작합니다.

3.Kotlin 정규 표현식

기본 문법

  • 문자 클래스: [abc]a, b, c 중 하나의 문자와 매칭됩니다.
  • 문자 범위: [a-z]a부터 z까지의 모든 소문자와 매칭됩니다.
  • 반복: *는 0회 이상, +는 1회 이상, ?는 0회 또는 1회를 나타냅니다.
  • 그룹화: ()를 사용하여 부분 문자열을 그룹화할 수 있습니다.
  • 경계: ^는 문자열의 시작, $는 문자열의 끝을 나타냅니다.

정규 표현식 생성

Kotlin에서 정규 표현식을 생성하려면 Regex 클래스를 사용합니다. 패턴 문자열을 Regex 객체로 변환하여 사용합니다.

val regex = Regex("[a-zA-Z]+")

문자열 검색

정규 표현식을 사용하여 문자열에서 특정 패턴을 검색할 수 있습니다. find 메서드는 첫 번째 매칭 결과를 반환합니다.

val matchResult = regex.find("Kotlin123")
println(matchResult?.value) // Output: Kotlin

모든 매칭 결과 검색

findAll 메서드는 문자열 내의 모든 매칭 결과를 시퀀스로 반환합니다.

val matches = regex.findAll("Kotlin123 and Java456")
matches.forEach { match ->
    println(match.value)
}
// Output:
// Kotlin
// Java

문자열 대체

replace 메서드는 매칭된 부분을 다른 문자열로 대체합니다.

val result = regex.replace("Kotlin123 and Java456", "Language")
println(result) // Output: Language123 and Language456

문자열 분리

split 메서드는 정규 표현식을 기준으로 문자열을 분리합니다.

val result = regex.split("Kotlin123 and Java456")
result.forEach { part ->
    println(part)
}
// Output:
// (빈 문자열)
// 123 and 
// 456

이메일 유효성 검사

val emailRegex = Regex("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$")
val email = "test@example.com"
println(emailRegex.matches(email)) // Output: true

전화번호 형식 변환

val phoneRegex = Regex("(\\d{3})(\\d{3})(\\d{4})")
val phone = "1234567890"
val formattedPhone = phoneRegex.replace(phone, "$1-$2-$3")
println(formattedPhone) // Output: 123-456-7890

참고 문헌

5. JUnit 4

JUnit 4의 주요 어노테이션

@Test

  • 설명: 테스트 메서드를 정의합니다. 이 어노테이션이 붙은 메서드는 테스트 실행 시 호출됩니다.

@Before

  • 설명: 각 테스트 메서드 실행 전에 실행됩니다. 공통된 초기화 코드가 있을 때 사용합니다.

@After

  • 설명: 각 테스트 메서드 실행 후에 실행됩니다. 테스트 실행 후 정리 작업이 필요할 때 사용합니다.

@BeforeClass

  • 설명: 클래스의 모든 테스트 메서드 실행 전에 한 번만 실행됩니다. 클래스 레벨의 초기화 코드에 사용합니다.

@AfterClass

  • 설명: 클래스의 모든 테스트 메서드 실행 후에 한 번만 실행됩니다. 클래스 레벨의 정리 코드에 사용합니다.

@Ignore

  • 설명: 특정 테스트 메서드를 실행하지 않도록 설정합니다.

JUnit 4의 활용 예제

Calculator 클래스

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }
}

CalculatorTest 클래스

import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class CalculatorTest {

    private Calculator calculator;
    @Before
    public void setUp() {
        calculator = new Calculator();
    }

    @Test
    public void testAdd() {
        assertEquals(5, calculator.add(2, 3));
    }

    @Test
    public void testSubtract() {
        assertEquals(1, calculator.subtract(3, 2));
    }
}

테스트 수트 구성

여러 테스트 클래스를 그룹화하여 한 번에 실행할 수 있습니다.

TestSuite 클래스

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
    CalculatorTest.class,
    AnotherTest.class
})
public class TestSuite {
    // 이 클래스는 빈 클래스로 유지하며, 어노테이션을 통해 테스트 수트를 구성합니다.
}

예외 상황 테스트

특정 메서드가 예외를 던지는지 확인할 수 있습니다.

예제

import org.junit.Test;
import static org.junit.Assert.assertThrows;

public class ExceptionTest {

    @Test
    public void testException() {
        assertThrows(IllegalArgumentException.class, () -> {
            throw new IllegalArgumentException("Invalid argument");
        });
    }
}

시간 제한 테스트

특정 메서드가 지정된 시간 내에 실행되는지 확인할 수 있습니다.

예제

import org.junit.Test;
import static org.junit.Assert.assertTimeout;
import java.time.Duration;

public class TimeoutTest {

    @Test
    public void testTimeout() {
        assertTimeout(Duration.ofMillis(100), () -> {
            // 실행 시간이 100ms를 넘지 않아야 하는 코드
        });
    }
}

참고 문헌

5. Kotlin의 Kotest

Kotest란?

Kotest는 Kotlin을 위한 강력한 테스트 프레임워크로, BDD와 TDD 스타일을 모두 지원합니다. 풍부한 DSL을 제공하여 읽기 쉽고 작성하기 쉬운 테스트 코드를 작성할 수 있습니다.

주요 기능

  • 다양한 스타일 지원: StringSpec, ShouldSpec, BehaviorSpec 등.
  • 풍부한 매처 제공: 다양한 조건을 쉽게 테스트할 수 있음.
  • 확장 가능: 쉽게 확장할 수 있는 구조.

예제

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe

class ExampleTest : StringSpec({
    "value should be 5" {
        val value = 5
        value shouldBe 5
    }
})

참고 문헌


6. 소프트웨어 테스트 종류: 단위 테스트, 통합 테스트, 시스템 테스트, 인수 테스트

단위 테스트 (Unit Test)

단위 테스트란?

단위 테스트는 소프트웨어의 가장 작은 단위(일반적으로 함수나 메서드)를 테스트하는 것입니다.

주요 특징

  • 목적: 개별 함수나 메서드의 정확성을 검증.
  • 범위: 코드의 작은 단위.
  • 작성 시점: 개발 초기 단계, 코드 작성 직후.
  • 도구: JUnit, NUnit, TestNG 등.
  • 장점: 빠른 피드백, 문제를 조기에 발견 및 수정 가능, 리팩토링 시 안정성 제공.

통합 테스트 (Integration Test)

통합 테스트란?

통합 테스트는 개별 단위가 결합된 후, 모듈 간의 인터페이스와 상호 작용을 테스트하는 것입니다.
단위 테스트로 검증된 각 모듈이 함께 잘 작동하는지 확인합니다.

주요 특징

  • 목적: 모듈 간의 상호 작용을 검증.
  • 범위: 여러 모듈의 조합.
  • 작성 시점: 모듈 통합 시점.
  • 도구: Spring Test, TestContainers 등.
  • 장점: 모듈 간의 인터페이스 문제를 조기에 발견, 통합 시 발생하는 문제 최소화.

시스템 테스트 (System Test)

시스템 테스트란?

시스템 테스트는 완전한 소프트웨어 시스템을 대상으로 하여, 요구사항이 충족되는지 확인하는 테스트입니다.

주요 특징

  • 목적: 전체 시스템의 동작을 검증.
  • 범위: 전체 소프트웨어 시스템.
  • 작성 시점: 개발 완료 후, 배포 전.
  • 도구: Selenium, Cucumber 등.
  • 장점: 시스템의 전반적인 품질 검증, 실사용 환경과 유사한 테스트 가능.

인수 테스트 (Acceptance Test)

인수 테스트란?

인수 테스트는 최종 사용자의 관점에서 시스템의 요구사항이 충족되는지 확인하는 테스트입니다.
주로 비즈니스 요구사항을 기반으로 작성되며, 사용자 스토리나 시나리오를 중심으로 진행됩니다.

주요 특징

  • 목적: 비즈니스 요구사항 충족 여부를 검증.
  • 범위: 전체 시스템 또는 주요 기능.
  • 작성 시점: 시스템 개발 완료 후, 고객 승인 전.
  • 도구: Cucumber, FitNesse 등.
  • 장점: 실제 사용자 관점에서 테스트 가능, 고객 요구사항과 일치하는지 확인.


참고 문헌

0개의 댓글