를 GitHub 사용하여 에서 Node.js 애플리케이션에 대한 단위 테스트 실행 AWS CodeBuild - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

를 GitHub 사용하여 에서 Node.js 애플리케이션에 대한 단위 테스트 실행 AWS CodeBuild

작성자: Thomas Scott(AWS) 및 Jean-Baptiste Guillois(AWS)

코드 리포지토리: 노드 JS 테스트 샘플

환경: 프로덕션

기술: 웹 및 모바일 앱

AWS 서비스: AWS CodeBuild

요약

이 패턴은 Node.js 게임 에 대한 샘플 소스 코드 및 키 단위 테스트 구성 요소를 제공합니다API. 또한 지속적 통합 및 지속적 전달(CI/CD) 워크플로의 AWS CodeBuild일부로 를 사용하여 GitHub 리포지토리에서 이러한 단위 테스트를 실행하는 방법에 대한 지침도 포함되어 있습니다.

유닛 테스트는 유닛이라고 하는 애플리케이션의 여러 부분이 올바르게 작동하는지 개별적으로 독립적으로 테스트하는 소프트웨어 개발 프로세스입니다. 테스트를 통해 코드의 품질을 검증하고 예상대로 작동하는지 확인합니다. 다른 개발자들도 테스트를 참조하여 코드 베이스에 쉽게 익숙해질 수 있습니다. 유닛 테스트는 향후 리팩토링 시간을 줄이고, 엔지니어가 코드 베이스를 더 빠르게 파악하도록 지원하며, 예상되는 동작에 대한 확신을 심어줍니다.

단위 테스트에는 AWS Lambda 함수를 포함한 개별 함수 테스트가 포함됩니다. 유닛 테스트를 생성하려면 테스트 프레임워크와 테스트(어설션)를 검증하는 방법이 필요합니다. 이 패턴의 코드 예제는 Mocha 테스트 프레임워크와 Chai 어설션 라이브러리를 사용합니다. 

유닛 테스트 및 테스트 구성 요소 예제에 대한 자세한 내용은 추가 정보 섹션을 참조하십시오.

사전 조건 및 제한 사항

  • 올바른 CodeBuild 권한이 있는 활성 AWS 계정

  • GitHub 계정(가입 지침 참조)

  • Git(설치 지침 참조)

  • 변경하고 코드를 에 푸시할 코드 편집기 GitHub

아키텍처

다음 다이어그램은 이 패턴이 구축하는 아키텍처를 보여줍니다.

AWS CodeBuild 및 GitHub 리포지토리를 사용하여 단위 테스트를 실행하기 위한 클라우드 아키텍처

도구

도구

  • Git은 코드 개발에 사용할 수 있는 버전 제어 시스템입니다.

  • AWS CodeBuild 는 소스 코드를 컴파일하고, 테스트를 실행하고, 배포할 준비가 된 소프트웨어 패키지를 생성하는 완전 관리형 지속적 통합 서비스입니다. 를 사용하면 자체 빌드 서버를 프로비저닝, 관리 및 확장할 필요가 CodeBuild없습니다. 는 지속적으로 CodeBuild 확장되고 여러 빌드를 동시에 처리하므로 빌드가 대기열에 대기 상태로 남아 있지 않습니다. 사전 패키징된 빌드 환경을 사용하면 신속하게 시작할 수 있으며 혹은 자체 빌드 도구를 사용하는 사용자 지정 빌드 환경을 만들 수 있습니다. 를 사용하면 사용하는 컴퓨팅 리소스에 대해 분 단위로 CodeBuild요금이 부과됩니다.

코드

이 패턴의 소스 코드는 샘플 게임 유닛 테스트 애플리케이션 리포지토리 GitHub의 에서 사용할 수 있습니다. 이 샘플에서 자체 GitHub 리포지토리를 생성하거나(옵션 1) 이 패턴에 샘플 리포지토리를 직접 사용할 수 있습니다(옵션 2). 다음 단원의 각 옵션에 대한 지침을 참조하십시오. 선택한 옵션은 사용 사례에 따라 다릅니다.

에픽

작업설명필요한 기술

샘플 프로젝트를 기반으로 자체 GitHub 리포지토리를 생성합니다.

  1. 에 로그인합니다 GitHub.

  2. 새 리포지토리를 생성합니다. 지침은 GitHub 설명서 를 참조하세요.

  3. 샘플 리포지토리 계정의 새 리포지토리에 복제하고 푸시합니다.

앱 개발자, AWS 관리자, AWS DevOps

새 CodeBuild 프로젝트를 생성합니다.

  1. AWS 관리 콘솔에 로그인하고 https://console.aws.amazon.com/codesuite/codebuild/home 에서 CodeBuild 콘솔을 엽니다.

  2. 빌드 프로젝트 생성을 선택합니다.

  3. 프로젝트 구성 섹션의 프로젝트 이름에 aws-tests-sample-node-js를 입력합니다.

  4. 소스 섹션의 소스 공급자 에서 를 선택합니다GitHub.

  5. 리포지토리 의 경우 내 GitHub 계정에서 리포지토리를 선택한 다음 새로 생성된 리 GitHub 포지토리URL에 붙여넣습니다.

  6. 기본 소스 웹후크 이벤트 섹션에서 코드 변경이 이 리포지토리로 푸시될 때마다 다시 빌드를 선택합니다. 

  7. 이벤트 유형에서 를 선택합니다PUSH. 

  8. 환경 섹션에서 관리형 이미지 , Amazon Linux 및 최신 이미지를 선택합니다.

  9. 기타 모든 옵션에 대해 기본 설정을 사용하고 빌드 프로젝트 생성을 선택합니다.

앱 개발자, AWS 관리자, AWS DevOps

빌드를 시작합니다.

검토 페이지에서 빌드 시작을 선택하여 빌드를 실행합니다.

앱 개발자, AWS 관리자, AWS DevOps
작업설명필요한 기술

새 CodeBuild 빌드 프로젝트를 생성합니다.

  1. AWS 관리 콘솔에 로그인하고 https://console.aws.amazon.com/codesuite/codebuild/home 에서 CodeBuild 콘솔을 엽니다.

  2. 빌드 프로젝트 생성을 선택합니다.

  3. 프로젝트 구성 섹션의 프로젝트 이름 aws-tests-sample-node-js 를 입력합니다.

  4. 소스 섹션의 소스 공급자 에서 를 선택합니다GitHub.

  5. 리포지토리 의 경우 퍼블릭 리포지토리 선택한 다음 URL를 붙여넣습니다https://github.com/aws-samples/node-js-tests-sample.

  6. 환경 섹션에서 관리형 이미지 , Amazon Linux 및 최신 이미지를 선택합니다.

  7. 기타 모든 옵션에 대해 기본 설정을 사용하고 빌드 프로젝트 생성을 선택합니다.

앱 개발자, AWS 관리자, AWS DevOps

빌드를 시작합니다.

검토 페이지에서 빌드 시작을 선택하여 빌드를 실행합니다.

앱 개발자, AWS 관리자, AWS DevOps
작업설명필요한 기술

테스트 결과를 보십시오.

CodeBuild 콘솔에서 CodeBuild 작업의 단위 테스트 결과를 검토합니다. 추가 정보 섹션에 표시된 결과와 일치해야 합니다.

이러한 결과는 와의 GitHub 리포지토리 통합을 검증합니다 CodeBuild. 

앱 개발자, AWS 관리자, AWS DevOps

웹후크를 적용합니다.

이제 웹후크를 적용할 수 있으므로 코드 변경 사항을 리포지토리의 기본 브랜치에 푸시할 때마다 자동으로 빌드를 시작할 수 있습니다. 지침은 CodeBuild 설명서 섹션을 참조하세요.

앱 개발자, AWS 관리자, AWS DevOps

관련 리소스

추가 정보

유닛 테스트 결과

CodeBuild 콘솔에서 프로젝트가 성공적으로 빌드된 후 다음 테스트 결과를 볼 수 있습니다. 

유닛 테스트의 예상 결과

유닛 테스트 컴포넌트 예시

이 섹션에서는 유닛 테스트에 사용되는 네 가지 유형의 테스트 구성 요소인 어설션, 스파이, 스텁, 모의 객체에 대해 설명합니다. 여기에는 각 구성 요소에 대한 간략한 설명과 코드 예제가 포함되어 있습니다. 

어설션

어설션은 예상 결과를 확인하는 데 사용됩니다. 이는 주어진 함수의 예상 응답을 검증하기 때문에 중요한 테스트 구성 요소입니다. 다음 샘플 어설션은 새 게임을 초기화할 때 반환된 ID가 0에서 1000 사이인지 확인합니다.

const { expect } = require('chai'); const { Game } = require('../src/index'); describe('Game Function Group', () => { it('Check that the Game ID is between 0 and 1000', function() { const game = new Game(); expect(game.id).is.above(0).but.below(1000) }); });

스파이

스파이는 함수가 실행될 때 어떤 일이 일어나는지 관찰하는 데 사용됩니다. 예를 들어, 함수가 올바르게 직접 호출되었는지 확인할 수 있습니다. 다음 예제는 Game 클래스 객체에서 시작 및 중지 메서드가 직접 호출되는 것을 보여줍니다.

const { expect } = require('chai'); const { spy } = require('sinon'); const { Game } = require('../src/index'); describe('Game Function Group', () => { it('should verify that the correct function is called', () => { const spyStart = spy(Game.prototype, "start"); const spyStop = spy(Game.prototype, "stop"); const game = new Game(); game.start(); game.stop(); expect(spyStart.called).to.be.true expect(spyStop.called).to.be.true }); });

스텁

스텁은 함수의 기본 응답을 재정의하는 데 사용됩니다. 이는 함수가 외부 요청을 할 때 특히 유용한데, 왜냐하면 유닛 테스트에서 외부 요청을 하지 않도록 하기 위해서입니다. (외부 요청은 서로 다른 구성 요소 간의 요청을 물리적으로 테스트할 수 있는 통합 테스트에 더 적합합니다.) 다음 예제에서는 스터브가 getId 함수에서 반환 ID를 강제로 적용합니다.

const { expect } = require('chai'); const {.stub } = require('sinon'); const { Game } = require('../src/index'); describe('Game Function Group', () => { it('Check that the Game ID is between 0 and 1000', function() { let generateIdStub = stub(Game.prototype, 'getId').returns(999999); const game = new Game(); expect(game.getId).is.equal(999999); generateIdStub.restore(); }); });

모의 객체

모의 객체는 다양한 시나리오를 테스트하기 위해 동작이 미리 프로그래밍된 가짜 메서드입니다. 모의 객체는 스텁의 확장된 형태로 간주될 수 있으며 여러 작업을 동시에 수행할 수 있습니다. 다음 예제에서는 모의 객체를 사용하여 세 가지 시나리오를 검증합니다.

  • 함수가 직접 호출됩니다. 

  • 함수가 인수와 함께 직접 호출됩니다.

  • 함수가 정수 9를 반환합니다.

const { expect } = require('chai'); const {.mock } = require('sinon'); const { Game } = require('../src/index'); describe('Game Function Group', () => { it('Check that the Game ID is between 0 and 1000', function() { let mock = mock(Game.prototype).expects('getId').withArgs().returns(9); const game = new Game(); const id = get.getId(); mock.verify(); expect(id).is.equal(9); }); });