속성 기반 테스트 소개

9876 단어 functionaltypescript
, 및 에 대한 지난 게시물에서 인스턴스가 일부 법률을 준수해야 함을 확인했습니다.

그렇다면 우리의 인스턴스가 합법적인지 어떻게 확인할 수 있습니까?

속성 기반 테스트



속성 기반 테스트는 고전적인 단위 테스트 방법을 보완하는 코드를 테스트하는 또 다른 방법입니다.

여러 생성된 임의 항목에 대해 테스트하여 속성이 거짓이 되도록 하는 입력을 검색하려고 시도합니다. 실패의 경우 속성 기반 테스트 프레임워크는 반례와 생성을 유발하는 시드를 모두 제공합니다.

속성 기반 테스트를 Semigroup 법칙에 적용해 보겠습니다.

연관성 : concat(concat(x, y), z) = concat(x, concat(y, z))
TypeScript로 작성된 속성 기반 테스트 프레임워크인 fast-check을 사용하겠습니다.

Semigroup 인스턴스 테스트



세 가지 재료가 필요합니다
  • Semigroup<A> 유형에 대한 A 인스턴스
  • 결합 법칙을 인코딩하는 속성
  • 유형의 임의 값을 생성하는 방법 A

  • 사례



    예를 들어 다음을 사용할 것입니다.

    import { Semigroup } from 'fp-ts/Semigroup'
    
    const S: Semigroup<string> = {
      concat: (x, y) => x + ' ' + y
    }
    


    재산



    속성은 술어일 뿐입니다. 즉, boolean 를 반환하는 함수입니다. 조건자가 true 를 반환하면 속성이 유지된다고 말합니다.

    따라서 우리의 경우 associativity 속성을 다음과 같이 정의할 수 있습니다.

    const associativity = (x: string, y: string, z: string) =>
      S.concat(S.concat(x, y), z) === S.concat(x, S.concat(y, z))
    


    임의<A>


    Arbitrary<A>A 유형의 임의 값을 생성합니다. 우리는 Arbitrary<string> 가 필요합니다. 다행히 fast-check는 많은 내장 임의 항목을 제공합니다.

    import * as fc from 'fast-check'
    
    const arb: fc.Arbitrary<string> = fc.string()
    


    모두 함께 포장합시다

    it('my semigroup instance should be lawful', () => {
      fc.assert(fc.property(arb, arb, arb, associativity))
    })
    

    fast-check 오류가 발생하지 않으면 인스턴스가 잘 정의되어 있다고 더 확신할 수 있습니다.

    Monoid 인스턴스 테스트



    인스턴스가 무법 상태일 때 어떤 일이 발생하는지 봅시다!

    예를 들어 다음을 사용할 것입니다.

    import { Monoid } from 'fp-ts/Monoid'
    
    const M: Monoid<string> = {
      ...S,
      empty: ''
    }
    

    Monoid 법칙을 속성으로 인코딩해야 합니다.

  • 권리 아이덴티티 : concat(x, empty) = x

  • 왼쪽 아이디 : concat(empty, x) = x

  • const rightIdentity = (x: string) => M.concat(x, M.empty) === x
    
    const leftIdentity = (x: string) => M.concat(M.empty, x) === x
    


    그리고 마지막으로 테스트를 작성

    it('my monoid instance should be lawful', () => {
      fc.assert(fc.property(arb, rightIdentity))
      fc.assert(fc.property(arb, leftIdentity))
    })
    


    우리가 테스트를 실행할 때 우리는

    Error: Property failed after 1 tests
    { seed: -2056884750, path: "0:0", endOnFailure: true }
    Counterexample: [""]
    


    훌륭합니다. fast-check 심지어 반례를 제공합니다. ""
    M.concat('', M.empty) = ' ' // should be ''
    


    자원



    유형 클래스 법칙을 쉽게 테스트할 수 있는 라이브러리는 fp-ts-laws을 확인하십시오.

    좋은 웹페이지 즐겨찾기