속성 기반 테스트 소개
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을 확인하십시오.
Reference
이 문제에 관하여(속성 기반 테스트 소개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gcanti/introduction-to-property-based-testing-17nk텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)