[함수형 자바스크립트]6.빈틈없는 코드 만들기
in Devlog on Node.js, JavaScript
함수형 코드와 테스트에 대해 이야기해보자.
명령형 프로그램 테스트의 어려움
단위 테스트의 주요 원칙중 하나는 격리이다. 사이드이펙트로 인해 테스트가 좌지우지 되는 일을 막아야하는것이다. 명령형 테스트는 몇가지 문제가 있다.
- 분해하기 어렵다.
- 공유자원에 의존한다.
- 평가순서를 미리 정해놓아야한다.
함수형 코드를 테스트
함수형 프로그래밍은 입력 매개변수가 명확히 정의되어 있으므로 쉽게 이모저모 살펴볼 수 있다. 불순하다면 모나드로 감싸면 된다. 함수형 코드를 테스트하면 다음이 좋다.
- 함수를 블랙박스처럼 취급
- 비즈니스 로직에 집중
- 모나드 격리를 통해 순수와 불순한 부분 분리
- 외부 디펜던시를 모킹
함수를 블랙박스처럼 취급
함수형프로그래밍에서는 어플리케이션의 다른 부분에 구애받지 않고 느슨하게 입력값을 결합하는 함수를 독립적으로 작성한다. 이런 함수는 사이드이펙트가없고 참조 투명하므로 임의의 순서로 몇 번이고 실행하더라고 결과가 동일하고 예측가능하다.
이처럼 블랙박스로 취급하고 입력에 맞게 결과만 나오는지 테스트할 수 있다.
비즈니스 로직에 집중
함수형 코드를 개발할 때 가장 오랜시간이 걸리는 과정은 문제를 더 작은 부분으로 나누는 일이다. 잘 나누고 비즈니스 로직만 집중해서 코드를 짜면 함수별로 테스트를 만들면 되기 때문에 간단해진다.
모나드 격리를 통해 순수/불순 코드 분리
프로그램은 대부분 순수한 부분과 불순한 부분을 모두 갖고 있다. 클라이언트 자바스크립트라면 DOM 상호작용이 많으니 물론이고, 서버 측에서도 DB나 파일에서 데이터를 읽어오니 마찬가지이다. 합성을 통해 순수/불순함수를 결합하는 걸 해봤지만 그럼에도 여전히 불순한 상태로 남아있다.
불순하면 테스트하기 어렵다. 잘게 쪼개서 불순한 코드를 격리시키면 나머지 순수한 코드를 수월하게 테스트 할 수 있다.
외부 디펜던시를 모킹
불순할 수 있는 데이터를 모킹해서 mock 데이터를 이용해 불순한 부분까지 커버할 수 있다.
속성 기반 테스트로 명세 담기
테스트 시나리오로 명세서를 대체할 수 있다.
- 학생의 평균성적이 90점 이상이면 A
- …
등등을 테스트 코드로 명세화 할 수 있다.
JSCheck라는 라이브러리를 사용해 자동 생성되는 속성 기반 테스트를 관리 할 수 있다.
코드 실행률로 효율 측정
단위 테스트의 효율은 테스트코드 실행률을 나타내므로 적절한 도구 없이 측정하기 어렵다. 기껏 만든 코드가 한번도 쓰이지 않는다면 아쉬우니 커버리지를 높이는게 좋겠다.
함수형 코드 테스트의 효율 측정
명령형 코드에 입력이 올바른 긍정 테스트를 하면 예외처리 로직은 들르지 않아 코드 커버리지는 100%가 될 수 없다. 하지만 함수형은 100%가 가능하다. 예외처리를 모나드로 묶어두기 때문이다.
부정테스트를 하면 명령형의 경우 매우 낮은 커버리지를 보이지만, 함수형은 꽤 높은 커버리지를 보일 수 있다.
함수형 코드의 복잡도 측정
프로그램의 복잡도를 측정하려면 제어 흐름을 잘 들여다봐야한다. 순환복잡도
라는 소프트웨어의 정량적 지표를 이용해 복잡도를 측정할 수 있다.
순환복잡도 M = E - N + P
- E = 간선 개수
- N = 노드나 블록의 개수
- P = 출구 있는 노드의 개수
함수형 프로그래밍은 순환복잡도가 1
에 가깝다.
2023년 새해에는 성장하고 함께하고 싶다면?
Pre A 단계 이상의 스타트업 C 레벨들이 모여서 커뮤니티를 만들었습니다. 같이 스터디하고 친해질 일잘러를 찾습니다.