Property based testing을 시작하려고 합니다.

개시하다


학습 커뮤니티Property based testing에서 화제가 됐지만, 실제로 시도해 본 줄은 전혀 몰랐기 때문이다.그리고 제가 학습 내용을 총결하는 것을 허락해 주십시오.
설치된 코드가 여기 있습니다.
https://github.com/knj-labo/learn_property-based-testing

Propertybased testing이란 무엇입니까?


무작위 반자동 테스트 데이터 생성.생성된 모든 값에 대해 만족해야 할 성질을 충족시키는지 테스트한다.
프로그램 라이브러리를 사용하니 실현될 것 같군.이번에는 패스트체크를 이용해서
참고 자료
https://medium.com/criteo-engineering/introduction-to-property-based-testing-f5236229d237

주요 대표 라이브러리

  • Haskell : QuickCheck
  • Scala : scalaprops / ScalaCheck
  • TypeScripr : fast-check
  • 참고 자료
    https://jessitron.com/2013/04/25/property-based-testing-what-is-it/

    Property based testing이 있는 이유는 무엇입니까?


    단일 테스트를 실시하는 상황에서 경계치를 우려하기 때문에 개발자는 테스트에서 보증해야 할 처리를 미리 고려해야 한다. 테스트가 더욱 복잡한 기능을 실시하는 상황에서 테스트 용례를 망라하는 것은 매우 어렵다.
    거기서 역할을 할 수 있는 건Propert based testingProperty based testing는 경계치 테스트로 유효하며 충분한 테스트 커버를 유지하는 동시에 테스트 용례를 관리 가능한 수량으로 줄인다.

    실천해 보다


    그럼 바로 시작해 볼게요.
    설치 참조여기..fc.property()의 첫 번째 파라미터fc.string()에서 최저 문자수와 최고 문자수를 입력하여 무작위 데이터를 생성하고 두 번째 파라미터로 받은 데이터를 테스트한다.
    example
    import fc from 'fast-check';
    
    ...
    
    describe('パスワードは必ず8文字以上で20文字以下でならなければならない場合で', () => {
        it('パスワードの値が8文字未満の場合は、falseを返す', () => {
            fc.assert(
                fc.property(fc.string({minLength: 0, maxLength: 7}),(password: string) => {
                    expect(validatePassword(password)).toBe(false)
                })
            )
        })
        it('パスワードの値が21文字以上の場合は、falseを返す', () => {
            fc.assert(
                fc.property(fc.string({minLength: 21, maxLength: 100}),(password:string) => {
                    expect(validatePassword(password)).toBe(false)
                })
            )
        })
    })
    
    출력된 랜덤 데이터는 여기 있습니다.
    example
    ...
     fc.assert(
         fc.property(fc.string({minLength: 0, maxLength: 7}),(password: string) => {
            console.log(password); 
         })
    )
    ...
    // 出力結果
    XC0jf                                                                                                                             
    z@i0]1*
    zPq
    Me3al
    z V,
    z$w`[                                                                                                                               
    W"z%_z
    
    또한 filter() 또는 map()로 무작위로 생성된 수치를 데이터 가공하여 기대하는 데이터를 생성할 수 있다.
    example
    const char = (charCodeFrom:number,charCodeTo: number) => fc.integer().map(String.fromCharCode);
    
    const filteredStrings = (min: number,max: number,filter:RegExp) => {
        return fc.array(
            char(33, //'!'
            126 //'~'
        ).filter(c => filter.test(c)),{minLength: min, maxLength: max}).map(arr => arr.join(''));
    }
    
    const filteredNumber = (min:number,max:number) => filteredStrings(8,20,/^[0-9]$/);
    
    그리고 fc.assert()마다 100번씩 무작위로 생성된 데이터를 테스트하면 망라성이 충분하다.
    참고 자료
    https://github.com/dubzzz/fast-check/blob/main/documentation/HowItWorks.md#runner

    최후


    테스트 용례가 늘어나면서 지금까지 진행된 자동 테스트가 점점 어려워지는 것을 실감했기 때문에 이런 방법에 놀랐다.실제 업무에서도 활용할 수 있는 만큼 적극적으로 시행해달라고 당부했다.

    좋은 웹페이지 즐겨찾기