PBT로 FP 법칙 확인해보기

백근영·2021년 2월 7일
0

Project - FP_PBT

목록 보기
1/5

PBT (Property Based Testing)

Property Based Testing(속성 기반 검사)이란 어떤 함수에 대한 테스트 코드를 작성할 때, 함수를 실행한 결과값을 기반으로 Assert를 하는 것이 아닌 그 함수가 가진 속성을 기반으로 Assert를 하는 테스팅 방식을 의미한다.

예를 들어, List<Int>를 오름차순 정렬하는 함수를 테스트한다고 하면 아래와 같은 값 기반 테스트 코드를 작성할 수 있다. (kotlin + JUnit)

val list1 = listOf()
val list2 = listOf(3, 2, 1, 0)
val list3 = listOf(1)

Assertions.assertEquals(list1, list1.sorted())
Assertions.assertEquals(listOf(0, 1, 2, 3), list2.sorted())
Assertions.assertEquals(list3, lsit3.sorted())

이러한 값 기반의 테스팅은 함수의 근본적인 기능 자체를 테스트하는 것이 아니기 때문에 많은 boundary case들을 놓칠 수 있다.

위의 예시를 속성 기반 테스팅으로 바꾸기 위해서는, 함수를 실행한 결과들이 가지는 공통의 속성을 추출해야 한다. sorted 함수 결과값들의 공통된 속성을 추출해보면 아래와 같다.

  • 원소의 개수가 1개 이하인 배열을 정렬한 결과는 원래 배열과 같다.
  • 원소의 개수가 2개 이상인 배열을 정렬하면, 매 인접 두 아이템은 앞의 아이템이 뒤의 아이템보다 작거나 같아야한다.

이러한 속성들을 코드로 표현해서 Assert를 수행하면 값 기반의 테스트보다 훨씬 강력하고 견고한 테스트가 만들어진다.

Kotest-property

kotest는 Kotlin의 테스팅 프레임워크이며, kotest가 제공해주는 여러 라이브러리 중 kotest-property는 PBT 기반으로 테스트를 작성할 수 있게 도와주는 라이브러리이다. 링크

FP laws

함수형 프로그래밍 패러다임에는 Functor, Monad, Applicative 등 함수적 설계에서 공통으로 활용될 수 있는 성질을 일반화한 특질(trait)이 존재하는데, 이 각각의 특질은 저마다의 법칙들을 가지고 있다. 예를 들어 Functor라고 하는 것은 map 함수를 가지고 있는 특질을 뜻하여, functor는 다음과 같은 항등 법칙이 성립한다.

map(x)(a => a) == x

이렇게 각 특질마다 존재하는 법칙들에 대해 kotest-property를 이용한 PBT를 진행함으로써 실제로 법칙들이 성립하는지 확인해보는 실습을 진행할 것이다.

실습 목표

이 실습을 진행하면서 이루고자 하는 목표는 크게 다음과 같다.

  • FP 특질(Monoid, Functor, Monad, Applicative, Traversable, ...)에 대한 이해
  • arrow library를 이용해 kotlin syntax로 직접 FP 특질을 구현하고 다뤄보기
  • PBT(Property Based Testing)에 대한 이해
  • Kotest-property를 이용한 pbt 기반 테스트 코드 작성 방법 익히기
profile
서울대학교 컴퓨터공학부 github.com/BaekGeunYoung

0개의 댓글