티스토리 뷰

TIL

TIL('21.03.29) - Unit Test / TDD

learner._.Kio 2021. 3. 30. 00:33

그만놀고 TIL 작성하자...

학습내용

1. 야곰의 잔소리 🐻

  • 왜 이런 어려운 계산기 프로젝트를 주었을까?
    • 앞으로 필드에서 하다보면 내 실력이 쓰레기구나 많이 느낄 날이 있을 것이다.
    • 리드할 줄 아는 방법도 필요하고, 끌려갈 수 있는 방법도 알아야 한다.
    • 지금이 아니면 옆에 있는 동료와 어떻게 협동할 수 있는가 를 해볼 수 없다.
    • 프로젝트는 후에 다시 볼 껀덕지가 생겼다.
    • 1차 고비가 될 거다. 때려칠까.....?

 

2. Kahoot

  • 딜리게이션 디자인 패턴을 구현하기 위해 필요한 스위프트 언어의 기능은? → 프로토콜
  • SOLID 원칙
    1. SRP (Single-Responsiblility Principle)
    2. OCP (Open-Close Principle)
    3. LSP (Liskov Substitution Principle)
    4. DIP (Dependency-Inversion Principle)
    5. ISP (Interface-Segregation Principle)
  • UML - Unified Modeling Language(통합 모델링 언어)
  • Swift의 모든 언어 기능을 UML로 표현할 수 있다 ❌
  • UML 관계를 표현하는 방식

 

3. Unit Test / TDD

TDD 정의

  • TDD(Test Driven Development) by Kent Beck
  • 테스트 주도 개발: 테스트가 개발을 주도한다.[=이끌어간다.]

 

TDD 과정

  1. Add a test.
  2. 테스트 작성.
  3. Run all tests. The new test should fail for expected reasons.
  4. 테스트를 실행한다. 새로 작성한 테스트는 예상된 결과로 실패해야한다. (기능을 추가할 땐 fail부터 작성한다.)
  5. Write the simplest code that passes the new test.
  6. pass할 새 테스트를 간단한 코드로 작성한다.
  7. All tests should now pass.
  8. 모든 테스트가 통과해야한다.
  9. Refactor as needed, using tests after each refactor to ensure that functionality is preserved
  10. 필요하면 리팩토링하고, 각각 리팩토링 후에 테스트하여 기능이 되는지 확인한다.
  11. 1~5 Repeat
  12. 1~5번 반복

[참고사이트]

 

Clean Code That Works

  • 기능을 추가할 때마다 TDD!
  • → test를 통과하면 보증할 수 있다.
  • 코드를 기능단위로 구현해야 TDD를 잘 할 수 있다.
  • → 한번에 성공하는 게 아니라, 작은 실패들을 여러번 해야 한다.
  • 테스트를 하면 코드를 작성하는 데 자신감이 생긴다.
  • → 테스트를 하지 않으면 코드를 수정(리팩토링)하기 어렵고 두려워진다.

 

Unit Test 정의

  • 유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다. 즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다. 이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다. 이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를 위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다. 유닛 테스트는 (일반적인 테스트와 달리) 개발자(developer) 뿐만 아니라 보다 더 심도있는 테스트를 위해 테스터(tester)에 의해 수행되기도 한다.

[참고사이트]

 

어떤 테스트들을 작성해야할까?

  • 윗분들이 보면 이것도 비용
  • GREEN에서 만족
  • 그냥 동작하면 다음꺼 하면 되지, 무슨 test야
  • 하지만 code가 쌓이면 하루 6줄, 한달 180줄, 1년 2160줄...😱

 

객체지향 생활 체조 훈련법 9가지

  1. 한 메서드에 오직 한 단계의 들여쓰기만 한다.
  2. else 예약어(keyword)를 쓰지 않는다.
  3. 모든 원시값과 문자열을 포장(wrap)한다.
  4. 한 줄에 점을 하나만 찍는다.
  5. 줄여쓰지 않는다(축약금지).
  6. 모든 엔티티(entity)를 작게 유지한다.
  7. 2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
  8. 제일 클래스(first-class) 콜렉션을 쓴다.
  9. 게터(getter)/세터(setter)/프로퍼티(property)를 쓰지 않는다.
극단적으로 연습해봐야 클린코드를 잘 할 수 있다.

 

테스트 관련 용어

  • SUT
  • Test Doubles
    • dummy
    • stub
    • fake
    • spy
  • Mock

 

4. 프로젝트

1. 10진수 계산기(iPhone 기준)

  • 마지막 입력이 연산자라면 출력되는 숫자가 다름
2+3+ -> 5
2x3+ -> 6
2x3x -> 6
2+3x5+ -> 17
2+3x5x -> 15

 

2. 세 자리수마다 콤마(,) 넣기

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 4
let price = 12345678
let price2 = 1234.56789
let result = numberFormatter.string(for: price)!

print(result)  // 12,345,678
print(result2) // 1,234.5678 - 9 탈락
  • NumberFormatter() 객체를 numberStyle을 .decimal 로 지정해주면 콤마를 찍을 수 있다.
  • maximumFractionDigits 를 사용하면 최대로 표현되는 소수점 자리수를 정할 수 있다.
    • 지정하지 않으면 기본 소수점 3번째자리까지만 표시한다.

[참고사이트]

 

3. String값을 아스키코드를 통해 숫자가 있는지 확인하기!

var temp = "123.456"
var Count = 0

for number in temp {
    let characterValue = number as Character // Character을 통해서만 확인가능!
    if (characterValue.isNumber) {
       Count += 1
    }
}

print(Count) // 6

[참고사이트]

 

4. 주석처리 TODO

// TODO: 해야할일!

 

주석처리로 TODO를 작성하면 위에서 확인할 수 있다! (Feat. Steven의 꿀팁!)

 

문제점/고민한점 → 해결방안

  1. 변수명을 짓는건지, 영어공부를 하는 건지... 😱 → 생각하고 검색하자 🤯
  2. 연산자와 피연산자의 입력개수가 같을 때, = 를 누를 때 결과 값 출력하는 방법에 대한 고민
  3. → 마지막 연산자와 마지막 피연산자를 전역에 선언하여 저장하면 될 것 같긴 한데 이것은 추후 To Do List로 남겨두기로 함!
  4. 친구 이진수 가 연락왔는데 왠지 기분 나쁨 → 차단

'TIL' 카테고리의 다른 글

[공지] Kio는 블로그 이사  (0) 2021.12.20
TIL ('21.03.30) - 비트연산자, 오버플로우 연산자, 우선순위와 결합성  (0) 2021.03.31
TWL ('21.03.21~26)  (0) 2021.03.27
TIL ('21.03.25)  (0) 2021.03.26
TIL ('21.03.23)  (0) 2021.03.26
댓글