반응형
안녕하세요 공공돌🧸 입니다!!
이번에는 프리코스를 복기하면서 단위 테스트에 대해 부족함을 깨닫고 공부해봤습니다.
1. 도메인 로직이란?
도메인 로직은 소프트웨어 애플리케이션에서 특정 도메인 또는 문제 영역에 관련된 핵심 비즈니스 규칙과 프로세스를 정의하는 부분을 의미
💡 예시
은행 시스템의 도메인 로직은 계좌 개설, 입금, 출금, 이체 등과 같은 금융 거래에 관련된 규칙을 포함합니다.
이러한 규칙은 사용자가 계좌에서 돈을 인출할 때 잔고를 확인하고,
이체 시에는 수취인 계좌와 송금액을 확인하는 등과 같은 비즈니스 규칙을 말합니다.
2. 도메인 로직의 필요성
- 유지보수성 향상: 도메인 로직을 다른 부분과 분리하면 해당 로직을 독립적으로 변경하고 유지보수할 수 있습니다. 이로써 도메인 로직을 수정할 때 다른 부분에 영향을 미치지 않도록 하며, 코드베이스를 보다 관리하기 쉽게 만듭니다.
- 재사용성 증대: 도메인 로직이 독립적으로 존재하면, 다른 프로젝트나 모듈에서 해당 로직을 재사용할 수 있습니다. 이로써 비슷한 비즈니스 요구사항이 있는 다른 부분에서 동일한 로직을 다시 작성하지 않아도 됩니다.
- 테스트 용이성: 도메인 로직이 다른 부분과 분리되면 테스트가 용이해집니다. 독립적으로 테스트할 수 있기 때문에 특정 비즈니스 규칙이나 프로세스가 예상대로 동작하는지 쉽게 확인할 수 있습니다.
- 확장성 강화: 도메인 로직을 분리하면 향후 시스템의 확장이 용이해집니다. 새로운 비즈니스 규칙이나 요구사항이 추가되더라도 해당 도메인 로직 부분만 수정하면 되므로 전체 시스템에 대한 영향을 최소화할 수 있습니다.
- 관심사의 분리: 소프트웨어 개발에서 관심사의 분리는 중요한 원칙 중 하나입니다. 도메인 로직을 다른 부분과 분리함으로써 비즈니스 로직, 데이터베이스 액세스, 사용자 인터페이스 등 각각의 관심사를 독립적으로 다룰 수 있습니다.
- 프로그래밍 모델의 명확성: 도메인 로직이 별도로 분리되면 프로그래밍 모델이 더 명확해집니다. 코드베이스가 간결하고 읽기 쉬워지며, 전체 시스템의 구조를 이해하기가 더 쉬워집니다.
이러한 이유들로 도메인 로직을 다른 부분과 분리하는 것은 소프트웨어 시스템을 보다 효과적으로 설계하고 유지보수하는 데 도움을 줍니다.
3. 좋은 단위 테스트의 규칙
좋은 단위 테스트는 소프트웨어 개발에서 안정성을 제공하고 코드의 신뢰성을 확보하는 데 중요합니다. 다음은 좋은 단위 테스트를 작성하기 위한 규칙 몇 가지입니다
- 독립성 (Isolation): 각 테스트 케이스는 다른 테스트 케이스와 독립적으로 실행될 수 있어야 합니다. 한 테스트의 실패가 다른 테스트에 영향을 미치지 않도록 보장해야 합니다.
- 반복 가능성 (Repeatability): 어떤 환경에서든 테스트가 반복 가능해야 합니다. 즉, 동일한 입력에 대해 항상 동일한 결과를 제공해야 합니다.
- 빠르게 실행 가능성 (Fast Execution): 단위 테스트는 빠르게 실행되어야 합니다. 빠른 테스트는 빠른 피드백을 제공하므로 문제를 빠르게 식별하고 수정할 수 있습니다.
- 자가 검증성 (Self-Validation): 테스트는 자동으로 실행되며, 테스트가 성공하면 코드가 정확하게 동작함을 보장해야 합니다. 수동 검증이 필요한 테스트는 효과적이지 않습니다.
- 읽기 쉬움 (Readability): 테스트 코드도 다른 코드와 마찬가지로 읽기 쉬워야 합니다. 간결하고 명확한 테스트 코드는 유지보수가 쉽습니다.
- 작은 범위 (Small Scope): 테스트 케이스는 가능한 한 작은 범위의 코드에 집중해야 합니다. 한 번에 많은 기능을 테스트하는 대신, 각 테스트는 특정 기능이나 동작을 검증해야 합니다.
- 가독성 (Clarity): 테스트 코드는 목적과 의도를 명확하게 나타내야 합니다. 테스트가 어떤 상황을 검증하는지 이해하기 쉬워야 합니다.
- 데이터의 정규화와 준비 (Data Normalization and Setup): 테스트 데이터는 테스트 간에 정규화되어야 하며, 테스트 시작 전에 테스트 환경을 정확하게 설정해야 합니다.
- 예외 상황 다루기 (Handle Edge Cases): 테스트는 예외 상황도 다루어야 합니다. 잘못된 입력이나 예상치 못한 상황에 대한 처리가 테스트에 포함되어야 합니다.
- 지속적인 개선 (Continuous Improvement): 테스트 코드도 개선의 대상이므로 지속적으로 리팩토링하고 품질을 향상시키는 노력이 필요합니다.
이러한 규칙을 따르면 좋은 단위 테스트를 작성하고 유지보수하기 쉬운 코드베이스를 유지할 수 있습니다.
예시 코드
Kotlin
// 문자열 조작 함수
fun concatenateStrings(str1: String, str2: String): String {
return str1 + str2
}
fun capitalizeString(str: String): String {
return str.capitalize()
}
// 단위 테스트
fun testConcatenateStrings() {
val result = concatenateStrings("Hello", "World")
assert(result == "HelloWorld")
val emptyResult = concatenateStrings("", "Test")
assert(emptyResult == "Test")
}
fun testCapitalizeString() {
val result = capitalizeString("test")
assert(result == "Test")
val emptyResult = capitalizeString("")
assert(emptyResult == "")
}
// 실행 코드
fun main() {
testConcatenateStrings()
testCapitalizeString()
println("All tests passed!")
}
Switf
// 숫자 계산 함수
func add(_ x: Int, _ y: Int) -> Int {
return x + y
}
func multiply(_ x: Int, _ y: Int) -> Int {
return x * y
}
// 단위 테스트
func testAdd() {
let result = add(3, 5)
assert(result == 8)
let negativeResult = add(-2, 7)
assert(negativeResult == 5)
}
func testMultiply() {
let result = multiply(4, 6)
assert(result == 24)
let zeroResult = multiply(9, 0)
assert(zeroResult == 0)
}
// 실행 코드
func runTests() {
testAdd()
testMultiply()
print("All tests passed!")
}
// 실행
runTests()
공부하는 공돌이, 공공돌입니다🐻
@sheep1sik
반응형
'메모장' 카테고리의 다른 글
MVC 패턴 (1) | 2023.11.07 |
---|---|
Swift 튜플 (2) | 2023.03.29 |
Swift 집합 연산 (2) | 2023.03.28 |
Swift 집합의 동적 추가와 삭제 (3) | 2023.03.24 |
Swift 집합 순회 탐색 (2) | 2023.03.22 |