데이터베이스에 테스트 구동 개발 적용

Test-driven development(TDD)은 결함을 줄이고 코드 유지보수의 용이성을 높이기 위해 유행하는 소프트웨어 개발 방법이다.이 글에서는 쿼리 언어(FQL)가 있는 쿼리와 표현식을 작성하는 데 TDD를 적용하는 방법을 배울 것입니다.FQL을 통해 TDD의 일반 모드를 학습한 다음 이 모드를 적용하여 문자열과 구분자 매개 변수를 받아들이고 구분자가 나타날 때마다'분할'하위 문자열 배열을 되돌려주는 Split() 함수를 구현합니다.

예비 지식
이 글을 따라가려면 계좌가 있어야 한다.학습 및 구축 시 register for a free Fauna account을 사용할 수 있으며 업그레이드를 준비하기 전에 결제 정보를 제공하지 않아도 됩니다.
이 글은 Fanous에 대해 충분히 익숙하다고 가정하고 데이터베이스와 클라이언트 키를 만들 수 있습니다.없으면 Fauna’s free tier을 기입하고 이 게시물을 되돌려 주십시오.
본고는 또한 당신의 개발 환경에 client application quick startv12 또는 더 높은 버전이 있다고 가정합니다.이 문서는 Node.js과 JavaScript를 사용하지만, 이러한 원칙을 Jest의 첫 번째 테스트 도구에 적용할 수 있습니다.
본고에서 사용한 원본 코드는 supported language이다.
available in Fauna Labs
TDD 개요
TDD는 실패한 테스트를 작성하는 것부터 시작합니다.예를 들어 Split() 함수를 실현하고 있다면, 이 함수는 문자열과 구분자를 받아들이고, 구분자가 나타날 때마다 문자열 그룹 'split' 를 되돌려줍니다. Split("127.0.0.1", ".")["127", "0", "0", "1"]과 같은지 테스트합니다.테스트 세트를 처음 실행할 때, 테스트가 실패했습니다. Split() 함수를 실현하지 못했기 때문입니다.
다음은 단일 코드'단원'의 기능을 실현하는데 본 예에서 Split() 함수이다.변경을 진행할 때 테스트를 실행합니다. 테스트가 통과되었을 때, 테스트가 지정한 특정한 용례를 덮어쓰는 코드를 실행했습니다.
테스트를 통해 다른 용례를 덮어쓰거나 기존 코드를 재구성해서 성능이나 읽을 수 있도록 더 많은 테스트를 추가할 수 있습니다.테스트가 제자리에 있고 통과되었기 때문에, 코드가 정확한지 더 자신 있게 변경할 수 있습니다.

환경 설정

데이터베이스 설정
계정에 새 데이터베이스를 만들고 서버 역할로 키를 만듭니다.응용 프로그램에 추가할 키를 저장합니다.

농담하다

  • 새 노드를 생성합니다.js 프로그램을 설치하고 을 설치합니다.
    npm init --yes
    npm install faunadb
    

  • 응용 프로그램에 우스갯소리를 추가합니다.
    npm install --save-dev jest babel-jest @babel/core @babel/preset-env
    

  • Fauna JavaScript driver을 편집하여 다음'테스트'와'테스트: 관찰'스크립트를 추가합니다.
    {
      "scripts": {
        "test": "jest",
        "test:watch": "jest --watchAll"
      }
    }
    

  • 프로젝트의 루트 디렉터리에 다음 내용을 포함하는 파일 package.json을 만듭니다.
    module.exports = {
      presets: [['@babel/preset-env', {targets: {node: 'current'}}]],
    };
    

  • 프로젝트의 루트 디렉터리에 다음 내용을 포함하는 파일 babel.config.js을 만듭니다.
    export default {
      collectCoverage: true,
      coverageDirectory: "coverage",
      coverageProvider: "v8",
      setupFiles: ["<rootDir>/.jest/setEnvVars.js"],
    };
    

  • 파일 jest.config.mjs을 만들고 다음 코드를 붙여 관리자 키와 데이터베이스 값으로 바꿉니다.동물군..jest/setEnvVars.js에 문의하십시오.응용 프로그램에 이 파일을 추가합니다.gitignore는 저장소에 기밀을 제출하는 것을 피할 수 있습니다.
    process.env.FAUNADB_ADMIN_KEY = '<secret_key>';
    process.env.FAUNADB_DOMAIN = 'db.fauna.com';
    
  • 에서 npm run test -- --passWithNoTests을 실행하여 Jest를 사용하도록 애플리케이션을 구성했는지 확인합니다."테스트를 찾을 수 없습니다. 종료 중입니다. 코드는 0"이라는 응답을 받을 것입니다.
  • Region Group endpoint

    부분 FQL 표현식 테스트
    FQL 표현식을 생성하는 JavaScript 함수를 작성하여 JavaScript에서 FQL 표현식 일부를 테스트할 수 있습니다.코드와 테스트를 가져오고 사용할 수 있도록 함수를 설정합니다.이것은 FQL 조회에서 소프트웨어 개발의'export'또는'건식'원칙을 지원한다.
    don’t repeat yourself
    일반 모드
    다음 다섯 단계는 테스트 섹션 FQL 표현식의 일반 모드를 구성합니다.
  • 은 표현식의 입력을 하나 이상의 상수로 정의합니다.
  • 은 표현식의 예상 출력을 상수로 정의합니다.
  • FQL 표현식 구성
  • 은 동물군에서의 FQL 표현을 평가하고 실제 출력을 저장한다.
  • 은 실제 출력과 예상 출력을 비교한다.
  • 마지막 단계가 비교적 성공했을 때 테스트가 통과되었다.이런 비교는 상등하거나 불등하거나 테스트 프레임워크가 허용하는 다른 비교일 수 있다.농담으로 이런 비교를 이라고 부른다.테스트 프레임워크에 다른 용어가 있을 수 있습니다.
    matchers
    당신의 테스트 장비를 준비하세요
    fanus/lib/split라는 파일을 만들어서 캐시 루트를 만듭니다.다음 코드를 붙여넣습니다.
    export function Split(str, sep) {
      return undefined;
    };
    
    이것은 테스트에 사용할 수 있는 정의되지 않은 실현을 제공하여 테스트의 실패를 보장합니다.
    다음에 fantaus/test/split 파일을 만듭니다.테스트니 프로젝트에서실제 동물 환경에서 테스트를 실행하기 때문에 을 가져오고 다음 코드를 추가하여 새로운 동물 클라이언트를 만들어야 합니다.
    import faunadb from 'faunadb';
    
    const faunaClient = new faunadb.Client({
      secret: process.env.FAUNADB_ADMIN_KEY,
      domain: process.env.FAUNADB_DOMAIN || "db.fauna.com",
      port: parseInt(process.env.FAUNADB_PORT) || 443,
      scheme: process.env.FAUNADB_SCHEME || "https",
      checkNewVersion: false,
    });
    
    그런 다음 테스트할 Split() 함수 스텁을 가져옵니다.
    import { Split } from '../lib/split';
    
    다음 일반 프레임워크 코드를 복사해서 split에 붙여넣습니다.테스트js.
    test('<description>', async () => {
      // 1. Define the input to your expression as one or more constants.
      const input = ...;
    
      // 2. Define the expected output of your expression as a constant.
      const expected = ...;
    
      // 3. Construct your FQL expression.
      const expr = ...;
    
      // 4. Evaluate your FQL expression in Fauna and save the actual output.
      const actual = await faunaClient.query(expr);
    
      // 5. Compare the actual output to the expected output.
      expect(actual).toEqual(expected);
    });
    
    이 때, 당신은 이미 완전한 테스트 도구를 가지고 있지만, 자리 차지 문자 값 때문에, 테스트가 실행되지 않습니다.다음 절에서는 코드가 지정한 동작에 따라 실제 값으로 이 값을 대체합니다.
    Fauna JavaScript driver
    실패한 테스트 만들기
    다음 예제에서는 Split() 구현에 대한 예상 동작을 지정합니다.
  • Split(ip_address, '.')은 IPv4 주소를 정확하게 8바이트로 구분합니다.
  • 구분자를 찾지 못하면 Split(string, delimiter)은 원소string을 포함하는 그룹을 되돌려줍니다.
  • 문자열이 구분자만 포함될 때 Split(string, delimiter)은 빈 그룹을 되돌려줍니다.
  • 테스트
    꿰미
    정계부
    예기한 결과
    1'127.0.0.1''.'['127', '0', '0', '1']2'Hello, world!''.'['Hello, world!']'................''.'[]첫 번째 테스트를 실현하려면fauna/test/split의 일반적인 프레임워크 코드를 수정하십시오.테스트js와 당신의 첫 번째 규범의 속성입니다.당신의 실현은 다를 수 있지만, 아래 코드와 유사해야 합니다.
    test('Split correctly separates an IPv4 address into four octets', async () => {
      // 1. Define the input to your expression as one or more constants.
      const input = {
        string: '127.0.0.1',
        delimiter: '.',
      };
    
      // 2. Define the expected output of your expression as a constant.
      const expected = ['127', '0', '0', '1'];
    
      // 3. Construct your FQL expression.
      const expr = Split(input.string, input.delimiter);
    
      // 4. Evaluate your FQL expression in Fauna and save the actual output.
      const actual = await faunaClient.query(expr);
    
      // 5. Compare the actual output to the expected output.
      expect(actual).toEqual(expected);
    });
    
    앞의 코드는 Split()이 문자열 ‘127.0.0.1'을 각 소수점/문장에 있는 네 개의 문자열의 수조로 나누어 ['127', ‘0', '0', '1']을 생성하기를 기대한다.Split()을 계속 실시하기 전에 npm run test을 사용하여 실행하는지 확인하십시오.실패해도 상관없어.이것은 당신이 아직 Split()의 기능을 실현하지 못했기 때문에 예상한 행동입니다!
    테스트가 실행되지 않으면 테스트 라인의 모든 부분과 테스트 자체를 포함하는지 확인하십시오.너의 온전한 동물군/테스트/분열.테스트js는 아래와 같아야 한다.
    import faunadb from 'faunadb';
    
    import { Split } from '../lib/split';
    
    const faunaClient = new faunadb.Client({
      secret: process.env.FAUNADB_ADMIN_KEY,
      domain: process.env.FAUNADB_DOMAIN || "db.fauna.com",
      port: parseInt(process.env.FAUNADB_PORT) || 443,
      scheme: process.env.FAUNADB_SCHEME || "https",
      checkNewVersion: false,
    });
    
    test('Split correctly separates an IPv4 address into four octets', async () => {
      // 1. Define the input to your expression as one or more constants.
      const input = {
        string: '127.0.0.1',
        delimiter: '.',
      };
    
      // 2. Define the expected output of your expression as a constant.
      const expected = ['127', '0', '0', '1'];
    
      // 3. Construct your FQL expression.
      const expr = Split(input.string, input.delimiter);
    
      // 4. Evaluate your FQL expression in Fauna and save the actual output.
      const actual = await faunaClient.query(expr);
    
      // 5. Compare the actual output to the expected output.
      expect(actual).toEqual(expected);
    });
    

    구현
    현재 테스트 라인이 설정되어 있습니다. 감시 모드에서 테스트를 실행하십시오.
    npm run test:watch
    

    감시 모드에서 테스트 도구는 원본 파일과 테스트 파일을 감시하고 변경 사항이 검출될 때 관련 테스트 세트를 실행합니다.언제든지 작업을 저장하면 테스트 세트를 실행하는 결과를 즉시 볼 수 있으며 개발자의 피드백 순환을 강화하고 생산성을 높일 수 있습니다.
    감시 모드에서 테스트를 실행할 때 실제 Split() 기능을 실현하여 테스트를 통과할 때가 되었다.fauna/lib/split에서 만든 스텁을 바꿉니다.다음 코드를 사용하십시오.이렇게 하면 내장된 FQL 작업 을 사용하여 FindStrRegex이 나타날 때마다 매개변수 str을 분할할 수 있습니다.
    import faunadb from 'faunadb';
    
    const q = faunadb.query;
    const {
      Concat,
      FindStrRegex,
      Lambda,
      Map,
      Select,
      Var
    } = q;
    
    export function Split(str, sep) {
      return Map(
        FindStrRegex(str, Concat(["[^\\", sep, "]+"])),
        Lambda("res", Select(["data"], Var("res")))
      );
    };
    
    Jest는 파일을 저장할 때 테스트 키트를 자동으로 다시 실행합니다. 이번에는 통과했습니다.축하합니다. 당신의 첫 번째 TDD를 FQL로 썼습니다!
    sep

    검토 및 다음 단계
    이 문서에서 TDD를 사용하여 FQL 표현식을 작성하고 테스트하는 방법을 배웠습니다.Split() 함수에 대한 실패한 테스트를 작성했습니다. 이 함수는 문자열과 구분자 파라미터를 받아들이고, 구분자가 나타날 때마다 '분할' 하위 문자열 그룹을 되돌려줍니다.마지막으로 감시 모드에서 단원 테스트를 실행할 때 Split() 함수를 실현했다.
    당신의 지식을 테스트하기 위해서 나머지 두 가지 규범에 대해 테스트를 시도해 보십시오.이 테스트가 완료되고 통과되면 Split()의 재구성을 시도한다.TDD가 회귀를 도입하지 않고 코드를 안전하게 재구성할 수 있도록 하는 방법을 주의하십시오.
    추가 도구 및 샘플 코드는 GitHub의 을 참조하십시오.우리는 지체없이 네가 테스트하고 무엇을 세웠는지 보고 싶다.

    좋은 웹페이지 즐겨찾기