테스트 구동의 6분계 개발

테스트 구동의 6분계 개발


TL;DR: 6분계를 사용하여 테스트 드라이브 개발(TDD)을 하는 것은 정말 터무니없는 말이다.업무 수요를 시각적으로 기획하고 기록하며 아날로그 장치를 생성하고 코드 줄이 아닌 기능에 따라 커버율 보고서를 받을 수 있습니다.

6분의 1은 무엇입니까?


Sextant는 응용 프로그램을 기획하고 이 계획에 따라 코드를 생성할 수 있는 도구입니다.이것은 응용 프로그램 개발을 더욱 빠르게 하고 최신 문서를 확보하며 재구성을 간단하고 시각적으로 한다.
본 논문에서, 우리는Auth 서버에서 사용자를 얻는 데 사용할 간단한 함수를 구축할 것이다.우리는 TypescriptJest를 사용할 것이다.
보기Sextant docs 육분기 기능에 대한 더 많은 정보를 얻을 수 있습니다.

우리는 무엇을 짓고 있습니까?


Auth 서버에서 사용자를 가져오는 함수를 구축합니다.Auth 서버Cognito와 함수Lambda를 호출합니다.
우리의 lambda는 세 가지 상황을 처리해야 한다.
  • Cognito
  • 에서 사용자를 성공적으로 얻었습니다.
  • 사용자를 찾을 수 없음
  • 캡처 중인 사용자에게 권한이 없음
  • 설치 프로그램

  • Typescript 및 Jest 설정을 사용하여 선택한 항목을 만듭니다.create-react-app는 괜찮은 선택이다.
  • 실행 yarn add sextant @sextant-tools/plugin-jest 6분기 설치 및 Jest용 플러그인
  • 실행yarn sextant ./srchttp://localhost:3000에서 6분기 GUI를 시작합니다.
  • 이것은 sextant.config.js 디렉터리에 ./src 파일을 만들 것입니다.파일을 다음과 같이 변경합니다.
    // sextant.config.js
    
    module.exports = {
      plugins: ['@sextant-tools/plugin-jest'],
    };
    
  • 터미널 실행 취소yarn sextant ./src 및 재부팅
  • 축하합니다!너는 이미 건설을 시작할 준비가 되어 있다.

    테스트 계획


    이제 6분기 GUI에서 "사용자 확보"기능을 계획해야 합니다.

    성공 사례


    lambda가cognito에 GET_USER 이벤트를 보내면cognito가 USER 이벤트로 응답할 때 성공적인 호출이 발생합니다.우리는 이렇게 그릴 수 있다.

    병례가 발견되지 않았다


    그러나 일이 항상 성공하는 것은 아니다.때때로 Google은 부정확한 정보를 제공합니다. Cognito는 NOT_FOUND 이벤트에 회답합니다.

    You can press the Duplicate button at the top right of the "Success" panel to quickly duplicate a scenario.



    무허가 사례


    일은 또 다른 방식으로 실패할 수도 있다.정보를 얻으려는 사용자는 이렇게 할 권한이 없을 수도 있습니다.이 경우 Cognito는 NO_PERMISSION 이벤트를 사용하여 응답합니다.

    이벤트


    6분의에서 사건은 정보를 휴대할 수 있다.우리의 GET_USER 이벤트는 특정한 사용자를 요청해야 하기 때문에, 이 문제를 id 부하로 처리하도록 합니다.이것들은 GraphQL syntax 오른쪽 이벤트 유효 하중 패널에서 정의됩니다.
    type GET_USER {
      id: ID!
    }
    
    DellUSER 활동에는 사용자가 얻은 정보에 대한 응답도 필요합니다.
    type USER {
      id: ID!
      name: String!
      email: String!
    }
    

    테스트 설정


    TDD가 코드를 작성하기 전에 테스트를 작성하는 것에 관한 것이니 여기서부터 시작합시다.
  • 파일을 만듭니다.
  • 6분기가 ./src/__tests__/getUser.test.ts 디렉터리에 몇 개의 파일을 생성하고 있음을 알 수 있습니다.이름src에 포함된 파일을 찾아 테스트 파일로 가져옵니다.
  • // getUser.test.ts
    import { describeSextantFeature } from '../sextant-jest.generated';
    
  • 우리는 이 함수로 우리의 6분계 기능을 묘사하고 성공 사례의 테스트를 유도한다.
  • // getUser.test.ts
    import { describeSextantFeature } from '../sextant-jest.generated';
    
    describeSextantFeature('getUser', (feature) => {
      feature.test('success', () => {
        // We'll test the success case in here
      });
    
      feature.test('notFound', () => {
        // We'll test the notFound case in here
      });
    
      feature.test('noPermission', () => {
        // We'll test the noPermission case in here
      });
    
      feature.testCoverage();
    });
    

    직물의 특징을 묘사하다.

    jest 마치 describe block가 농담하는 것 같다.그 중에서 테스트의 모든 내용은 기술한 기능과 상응한다.describeSextantFeature 제공된 feature 대상은 몇 가지 테스트 방법과 테스트 범위율을 제공했다.describeSextantFeature의 작업 원리는 test block와 유사하다.묘사한 장면이 예상대로 작동할 수 있도록 내부에서 단언할 수 있습니다.feature.test() 6분의에서 기술한 내용에 따라 보도합니다.6분기에서 테스트에 포함되지 않은 장면이 검출되면 이 동작은 실패합니다.

    우리의 기능을 비웃다


    우리들은 우리의 함수를 신속하게 모의합시다. 그러면 우리는 테스트할 것이 좀 있습니다.feature.testCoverage()에 다음을 포함하는 파일을 만듭니다.
    // src/getUser.ts
    
    const getUser = () => {};
    
    우리는 Typescript로 파일을 입력해서 우리의 함수가 6분계에서 설명한 함수와 상응할 수 있도록 할 수 있다../src/getUser.ts에서 내보낸 SextantHandler 형식을 사용하겠습니다.
    // src/getUser.ts
    import { SextantHandler } from './sextant-types.generated';
    
    const getUser: SextantHandler<'getUser', 'lambda', 'cognito'> = () => {};
    
    sextant-types.generated.d.ts는 세 가지 범주를 포함하는 유형이다.SextantHandler 그것에 대응하는 기능.마지막 두 범형은 사건이 getUser에서 lambda로 흐르는 곳이다.
    다시 말하면 getUser 함수는 cognito에서 lambda까지의 이벤트를 처리하고 마지막에 cognito에서 cognito까지의 응답을 되돌려준다.

    mockSextantEvent 사용


    우리는 6분계가 생성한 장치를 사용하여 우리의 함수를 시뮬레이션할 수 있다.이제 반환lambda 이벤트를 통해 아날로그 함수는 항상 성공적입니다.
    // src/getUser.ts
    import { SextantHandler } from './sextant-types.generated';
    import { mockSextantEvent } from './sextant-fixture-mock.generated';
    
    const getUser: SextantHandler<'getUser', 'lambda', 'cognito'> = () => {
      return mockSextantEvent('getUser', 'USER');
    };
    
    USER 6분기 GUI의 이벤트 유효 부하에 대한 자바스크립트 대상을 되돌려줍니다.예를 들어, 이 유효 로드 선언은 다음과 같습니다.
    type USER {
      id: ID!
      name: String!
      email: String!
    }
    
    이 객체가 생성됩니다.
    {
      "type": "USER",
      "id": "d99c9580-cb80-4518-9d2c-5472fd4ff675",
      "name": "random-string",
      "email": "another-random-string"
    }
    
    mockSextantEvent는 귀하가 6분의에서 신고한 내용과 최신을 유지하기 때문에 매우 유용합니다.클러치 파일을 유지하는 것이 아니라 프로그램이 어떻게 작동하는지에 집중할 수 있다는 뜻이다.

    작성 테스트


    이제 함수가 시뮬레이션되었으므로 테스트를 시작할 수 있습니다.
    // getUser.test.ts
    import { describeSextantFeature } from '../sextant-jest.generated';
    import { getUser } from './getUser';
    
    describeSextantFeature('getUser', (feature) => {
      feature.test('success', async () => {
        const result = await getUser(feature.mockEvent('GET_USER'));
    
        // Expect that the event is of type USER
        expect(result.type).toEqual('USER');
      });
    
      feature.test('notFound', async () => {
        const result = await getUser(
          feature.mockEvent('GET_USER', { id: 'an-id-which-does-not-exist' }),
        );
    
        // Expect that the event is of type NOT_FOUND
        expect(result.type).toEqual('NOT_FOUND');
      });
    
      feature.test('noPermission', async () => {
        const result = await getUser(
          feature.mockEvent('GET_USER', {
            id: 'an-id-which-you-do-not-have-permission-to-view',
          }),
        );
    
        // Expect that the event is of type NO_PERMISSION
        expect(result.type).toEqual('NO_PERMISSION');
      });
    
      feature.testCoverage();
    });
    
    mockSextantEventnotFound 사례는 함수에서 시뮬레이션 noPermission 이벤트를 되돌려주고 있기 때문에 실패할 것입니다.만약 우리가 이 기능을 계속 개발하려고 한다면, 우리는 유사 jest.mock 의 아날로그 프로그램을 사용하여 고장이 났을 때 함수의 실행 상황을 테스트해야 한다.하지만 우리는 지금 그것을 여기에 남겨 두자.

    클로즈업시뮬레이션 이벤트

    USERfeature.mockEvent는 완전히 같지만 범위는 이 기능의 이벤트에 한정된다.또한 두 번째 매개변수를 사용하여 이벤트의 특정 속성을 덮어씁니다. mockSextantEvent

    다음 단계


    우리의 기능은 이제 실현될 수 있다!
  • 테스트 파일 목록
  • 테스트가 필요한 사례를 해결했습니다
  • .
  • 성공적인 사례
  • 로 우리의 기능을 시뮬레이션합니다.
    그러나 더 중요한 것은 우리가 왜 모든 병례를 테스트해야 하는지 정확히 알고 있으며, 우리는 이미 6분계에 그것을 직관적으로 기록했다.

    저희가 배웠어요.


    6분계는 여러 방면에서 너의 테스트 방법을 강화할 수 있다.

    테스트는 자기기록이에요.


    6분계가 있으면, 네가 쓴 모든 테스트는 특정하고 기록된 목적이 있다.이것은 작성할 테스트의 범위를 정하는 데 도움이 된다. 모든 테스트는 특정한 장면에 적용되어야 하기 때문에 쓸모없거나 중복된 테스트를 작성할 수 없다.

    의미 있는 덮어쓰기 지표


    사용{ id: 'a-specific-id' }은 기록이 없는 장면에서 테스트에 실패했다는 것을 의미한다.이것은 당신의 응용 프로그램의 모든 행위가 상정된 규범에 따라 기록되고 테스트되며 실현된다는 것을 믿게 한다.

    테스트는 업무 수요와 관계가 있다


    만약 당신의 업무 수요에 변화가 발생한다면, 당신의 테스트도 바뀌어야 합니다.6분계가 없으면 추적이 어려울 수도 있고 수동 유지보수가 필요할 수도 있다.
    6분계가 생기면 이 과정은 자동이다.장면을 삭제하면 장면을 지정하는 블록feature.testCoverage()이 실패합니다.하나를 추가하거나 업데이트하면 feature.test 기능이 실패합니다.

    읽어주셔서 감사합니다!


    6분의는 아직 초기 단계에 있지만, 나는 당신들에게 그것을 어떻게 사용하는지에 관한 더 많은 글을 가져다 줄 수 있어서 매우 기쁩니다.응용 프로그램 그래프를 가져와 유형 보안 코드로 바꾸는 능력은 큰 잠재력을 가지고 있다.너는 어떻게 하는지 배울 수 있다build your own plugins here.
    계속GitHub 또는 보기live demo of Sextant.나는 지체없이 네가 그것을 써서 무엇을 하는지 보고 싶다.

    좋은 웹페이지 즐겨찾기