출력 기반 테스트는 대상 시스템에 입력을 넣고 생성되는 출력을 점검하는 방식이다.
내부 상태를 변경하지 않는 코드이므로 반환 값만 검증하면 된다.
출력 기반 단위 테스트는 함수형이라고도 한다.
부작용이 없는 코드 선호를 강조하는 프로그래밍 방식인 함수형 프로그래밍에서 가져왔다.
작업이 완료된 후 시스템 상태를 확인하는 것이다.
여기에서 상태는 아래와 같은 외부 프로세스 외부 의존성의 상태 등을 의미할 수 있다.
목을 사용해 테스트 대상 시스템과 협력자 간의 통신을 검증한다.
리팩터링 내성은 리팩터링 중에 발생하는 거짓 정보 수에 대한 척도이다.
좋은 순으로 정렬을 하자면 아래와 같다.
출력 기반 > 상태 기반 >= 통신 기반
위의 두개의 특성으로 유지 보수성을 정의 한다.
출력 기반 > 상태 기반 >= 통신 기반
항상 다른 스타일보다 출력 기반 테스트를 선호해야하지만 이를 수행하기는 어렵다.
수학적 함수를 사용한 프로그래밍을 말한다.
즉 수학적 함수는 숨은 입출력이 없는 함수이다.
수학적 함수는 호출 횟수에 상관없이 주어진 입력에 대해 동일한 출력을 만든다.
출력 기반 테스트를 적용할 수 있는 메서드 유형은 수학적 함수 뿐이다.
하지만 숨은 입출력은 코드를 테스트하기 힘들게한다.
숨은 입출력은 아래와 같다
메서드가 수학적 함수인지 판별하는 법은 해당 메서드에 대한 호출을 반환 값으로 대체할 수 있는지 확인한느 것이다.
함수형 프로그래밍의 목표는 부작용을 완전히 제거하는 것이 아닌 비지니스 로직을 처리하는 코드와 부작용을 일으키는 코드를 분리하는 것이다.
코드를 두 부형으로 분류하면
결정을 내리는 코드 -> 함수형 코어
해당 결정에 따라 작용하는 코드 -> 가변 셀
함수형 코어와 가변셀은 다음과 같은 방식으로 협력한다.
이 두 계층으로 잘 분리하려면 가변 셀이 의사 결정을 추가하지 않게끔 결정을 나타내는 클래스에 정보가 충분히 있는지 확인해야 한다.
목표는 출력 기반 테스트로 함수형 코어를 두루 다루고 가변셀을 훨씬 더 적은 수의 통합 테스트에 맡기는 것이다.
아래 두 가지 리팩터링 단계를 따른다.
함수형 아키텍쳐와 전통적인 아키텍쳐 사이의 선택은 성능과 코드 유지 보수성 사이의 절충이고 함수형 아키텍쳐는 유지 보수성 향상을 위해 성능을 희생한다.
모든 코드 베이스를 함수형 아키텍쳐로 전환할 수는 없다. 그렇게에 코드베이스가 단순하거난 그렇게 중요하지 않으면 함수형 아키텍쳐에 필요한 초기 투자는 큰 효과를 가질 수 없다.