NMP-Study / FunctionalProgrammingInJavascript

0 stars 0 forks source link

Chapter 6. 빈틈없는 코드 만들기 #5

Open gaepury opened 4 years ago

iknowchang commented 4 years ago

6.1 함수형 프로그래밍과 단위 테스트

테스트 분류

FP 영향력은 unit test > integration test >> acceptance test

image

iknowchang commented 4 years ago

6.2 명령형 프로그램 테스트의 어려움

어려운 이유

iknowchang commented 4 years ago

6.3 함수형 코드를 테스트

함수형 코드를 테스트하면 이로운점 설명

6.3.1 함수를 블랙박스처럼 취급

함수를 독립적으로 작성 => 부수효과 없음 => 임의 순서 결과 동일 예제 : https://jsfiddle.net/d4p86Lgy/1/

6.3.2 제어 흐름 대신 비즈니스 로직에 집중

4.6절 함수 조합기를 사용하여 설계 분해 과정으로 구현 => 주요 로직 개별 함수만 테스트 하면됨 예제 : https://jsfiddle.net/d4p86Lgy/2/ 예제 설명

믿음성 있는 함수에 대한 테스트 : https://jsfiddle.net/d4p86Lgy/4/

findStudent만 남음. 어떻게 테스트? mock object 기법으로 관리

6.3.4 외부 디펜던시를 모의(mocking)

mocking은 외부 디펜던시 제어/단언 하여 모방하는데 쓰임. 부수효과 다루기 좋은 기법 이책에서는 Sinon.js 사용 https://jsfiddle.net/changcc/wcsdh6Lu/

iknowchang commented 4 years ago

6.4 속성기반 테스트로 명시 담기

함수에 어떤 입력을 넣으면 어떤 출력이 나와야 맞는지 성명한다.

JSCheck 소개.

JSC.claim(이름, 술어, 특정자, 분류자)

예제

JSC.clear();
    JSC.on_report((str) => console.log(str));
    JSC.test(
        '평균 학점 계산',
        function (verdict, grades, grade) {
            return verdict(computeAverageGrade(grades) === grade);
        },
        [
            JSC.array(JSC.integer(20), JSC.number(90,100)),
            'A'
        ],
        function (grades, grade) {
            return '평균 ' + grade + ' 학점에 관한 테스트: ' + grades;
        }
    );
    expect(0);

QUnit과 연연동하여 사용

QUnit.test('SSN에 대한 JSCheck 커스텀 특정자', function (assert) {

// 테스트 대상 함수
const validLength = (len, str) => str.length === len;

const find = R.curry((db, id) => db.find(id));

const checkLengthSsn = ssn => {
    return Either.of(ssn)
        .filter(R.partial(validLength, [11]))
        .isRight;
};

JSC.clear();

JSC.on_report((report) => console.log('리포트' + str));

JSC.on_pass((object) => assert.ok(object.pass));

JSC.on_fail((object) =>
    assert.ok(object.pass || object.args.length === 11, '테스트 실패: ' + object.args));

JSC.test(
    'SSN 길이를 체크',
    function (verdict, ssn) {
        return verdict(checkLengthSsn(ssn));
    },
    [
        JSC.SSN(JSC.integer(100, 999), JSC.integer(10, 99),
        JSC.integer(1000, 9999))
    ],
    function (ssn) {
        return '커스텀 SSN 테스트: ' + ssn;
    }
);

expect(0);

});

iknowchang commented 4 years ago

6.5 코드 실행률로 효율 측정

code coverage 측정 Blanket.js 사용 동작 과정

6.5.2 함수형 코드의 복잡도 측정

순환 복잡도 : 함수의 선형 독립적인 경로의 개수를 측정하기 위한 지표

노드 : 더 이상 나눌 수 없는 코드 블록 간선 : A블록 이후에 B블록 실행 가능할 때 연결

M=E-N+P E=간선 개수 N=노드나 블록의 개수 P=출구 있는 노드의 개수

p232 그림 6-16 M=E-N+P=11-10+3=4

함수형 M=E-N+P=0-0+1=1