로컬에서 함수 실행

함수를 프로덕션 단계로 배포하기 전에 로컬에서 실행하여 테스트할 수 있습니다. 함수를 로컬에서 실행하려면 다음 중 하나를 사용합니다.

  • Cloud Functions 셸. 이 도구는 모든 유형의 함수 트리거를 에뮬레이션하고 테스트 데이터로 함수를 호출하는 대화형 셸을 제공합니다.
  • Firebase CLI의 firebase serve 명령. 이 도구는 로컬 함수를 트리거하는 URL을 제공하여 HTTPS 함수를 에뮬레이션합니다.

어떤 도구를 사용하든 활성 세션 중에 변경한 코드를 에뮬레이터에서 자동으로 다시 로드합니다. 코드를 변환 컴파일(TypeScript, React)해야 하는 경우 에뮬레이터를 실행하기 전에 컴파일해야 합니다.

관리자 인증 정보 설정(선택사항)

Firebase Admin SDK를 통해 함수가 Google API 및 다른 Firebase API와 상호작용하는지 테스트하기 위해서는 관리자 인증 정보를 설정해야 할 수도 있습니다. 다음을 참고하세요.

  • Cloud Firestore 및 실시간 데이터베이스 트리거의 사용자 인증 정보가 이미 충분한 경우에는 추가 설정이 필요 없습니다.
  • Firebase API(예: Authentication API, FCM API) 또는 Google API(예: Cloud Translation API, Cloud Speech API)를 포함한 기타 모든 API에는 이 섹션에 설명된 설정 단계가 필요합니다. 함수 셸을 사용하든 firebase serve를 사용하든 상관없이 적용되는 사항입니다.

Cloud Firestore 및 실시간 데이터베이스 외의 에뮬레이션된 함수에 관리자 인증 정보를 설정하는 방법은 다음과 같습니다.

  1. Google Cloud Console의 서비스 계정 창을 엽니다.
  2. App Engine 기본 서비스 계정이 선택되어 있는지 확인하고 오른쪽에 있는 옵션 메뉴에서 키 만들기를 선택합니다.
  3. 메시지가 나타나면 키 유형으로 JSON을 선택하고 만들기를 클릭합니다.
  4. Google 기본 사용자 인증 정보가 다운로드된 키를 가리키도록 설정합니다.

    Unix

    $ export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    
    $ firebase functions:shell
    
    OR
    
    $ firebase serve --only functions
    

    Windows

    $ set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    
    $ firebase functions:shell
    
    OR
    
    $ firebase serve --only functions
    

이 단계를 완료하면 함수 테스트에서 Admin SDK를 사용하여 Firebase 및 Google API에 액세스할 수 있습니다. 예를 들어 인증 트리거를 테스트하는 경우 에뮬레이션된 함수에서 admin.auth().getUserByEmail(email)을 호출할 수 있습니다.

명령줄에서 HTTP 함수 제공

Firebase CLI를 사용하여 로컬에서 HTTP 함수를 제공하고 실행할 수 있습니다. 이렇게 하면 Firebase 프로젝트를 프로덕션 환경에 배포하기 전에 확인하고 테스트할 수 있습니다.

  1. Firebase CLI 및 firebase-functions SDK가 모두 최신 버전이어야 합니다. 둘 다 업데이트하려면 로컬 프로젝트의 functions 디렉토리에서 다음 두 명령어를 실행합니다.

    npm install -g firebase-tools
    npm install --save firebase-functions@latest
  2. 프로젝트 디렉토리의 루트에서 다음 명령어를 실행하여 Firebase 프로젝트를 로컬에서 제공합니다.

    이 명령어는 로컬에서 호스팅되는 URL에서 호스팅 및 함수를 에뮬레이션합니다.

    firebase serve
Cloud Functions를 사용하여 Firebase 호스팅을 위한 동적 콘텐츠를 생성하는 경우 기본적으로 firebase serve에서 로컬 HTTP 함수를 호스팅용 프록시로 사용합니다. Firebase 호스팅 및 Cloud Functions용 추가 구성 옵션은 Firebase CLI 참조를 확인하세요.

Cloud Functions 셸을 사용하여 함수 제공

Cloud Functions 셸은 모든 유형의 함수 트리거를 에뮬레이션하는 대화형 셸로서 테스트 데이터로 함수를 호출합니다. 옵션은 함수 유형에 따라 다르지만 기본 사용 형식은 다음과 같습니다.

myFunctionName(data, options)

data 매개변수는 실시간 데이터베이스 및 PubSub 트리거에는 필수 항목이며, 다른 모든 함수 유형에는 선택 항목입니다. 또한 선택사항인 options 매개변수는 실시간 데이터베이스 함수에만 유효합니다.

선택적으로 파일을 변수로 저장하고 이 변수로 함수를 호출하여 로컬 파일에서 테스트 데이터를 로드할 수도 있습니다.

var data = require('./path/to/testData.json');
myFunction(data);

Cloud Functions 셸 설치 및 구성

이 기능을 사용하려면 firebase-tools 버전이 3.11.0 이상이고 firebase-functions SDK 버전이 0.6.2 이상이어야 합니다. 둘 다 업데이트하려면 프로젝트의 functions/ 디렉토리에서 다음 명령어를 실행합니다.

npm install --save firebase-functions@latest
npm install -g firebase-tools

커스텀 함수 구성 변수를 사용하지 않는 경우 다음 명령어로 셸을 실행하세요.

firebase functions:shell

커스텀 함수 구성 변수를 사용하는 경우 우선 functions 디렉토리 내에서 다음 명령어를 실행하여 커스텀 구성을 가져온 후에 셸을 실행하세요.

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json
firebase functions:shell

HTTPS 함수 호출

셸에서 HTTPS 함수를 호출하는 경우 사용법은 request NPM 모듈과 동일하지만 request를 에뮬레이션할 함수의 이름으로 바꿔야 합니다. 예를 들면 다음과 같습니다.

# invoke
myHttpsFunction()
myHttpsFunction.get()
myHttpsFunction.post()

# invoke at sub-path
myHttpsFunction('/path')
myHttpsFunction.get('/path')
myHttpsFunction.post('/path')

# send POST request with form data
myHttpsFunction.post('/path').form( {foo: 'bar' })

HTTPS 호출 가능 함수 호출

HTTPS 호출 가능 함수를 로컬에서 호출할 때 적절한 테스트 데이터를 제공해야 합니다.

# invoke
myCallableFunction('test data')
myCallableFunction({'foo': 'bar'})

원하는 경우 Firebase-Instance-ID-token을 두 번째 매개변수로 전달할 수 있습니다. 이 값은 문자열이어야 합니다.

# invoke with Instance ID token
myCallableFunction('test data', {instanceIdToken: 'sample token'})

context.auth의 에뮬레이션은 현재 사용할 수 없습니다.

실시간 데이터베이스 함수 호출

실시간 데이터베이스 함수를 로컬에서 실행하는 경우 적절한 테스트 데이터를 제공해야 합니다. 일반적으로 onCreate 작업의 경우 새로운 테스트 데이터, onDelete 작업의 경우 이전 데이터 및 삭제된 데이터, onUpdate 또는 onWrite 함수의 경우 이전 및 새 테스트 데이터를 제공합니다.

# invoke onCreate function
myDatabaseFunction('new_data')

# invoke onDelete function
myDatabaseFunction('old_data')

# invoke onUpdate or onWrite function
myDatabaseFunction({before: 'old_data', after: 'new_data' })

셸은 before/after 옵션 외에도 경로의 와일드 카드를 모사하는 데 사용되는 params 옵션을 제공합니다.

# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})

기본적으로 셸은 실시간 데이터베이스 함수를 관리자 권한으로 실행합니다. 함수를 특정한 최종 사용자 또는 인증되지 않은 사용자 권한으로 실행하려면 auth 옵션을 사용하세요.

# to mock unauthenticated user
myDatabaseFunction('data', {authMode: 'USER'})
# to mock end user
myDatabaseFunction('data', {auth: {uid: 'abcd'}})

Firestore 함수 호출

Firestore 함수를 로컬에서 실행할 때 적절한 테스트 데이터를 제공해야 합니다. 일반적으로 onCreate 작업의 경우 새로운 테스트 데이터, onDelete 작업의 경우 이전 데이터 및 삭제된 데이터, onUpdate 또는 onWrite 함수의 경우 이전 데이터와 새 데이터를 모두 제공합니다. Firestore 데이터는 키-값 쌍이어야 합니다. 지원되는 데이터 유형을 참조하세요.

# invoke onCreate function
myFirestoreFunction({foo: ‘new’})

# invoke onDelete function
myFirestoreFunction({foo: ‘old’})

# invoke onUpdate or onWrite function
myFirestoreFunction({before: {foo: ‘old’}, after: {foo: ‘new’} })

셸은 before/after 옵션 외에도 문서 이름의 와일드 카드를 모사하는 데 사용되는 params 옵션을 제공합니다.

# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})

셸은 Firestore 함수를 항상 관리자 권한으로 실행합니다. 따라서 관리 사용자가 할 때와 동일하게 생성/업데이트/삭제 이벤트를 모사합니다.

PubSub 함수 호출

PubSub 함수의 경우 Buffer 인스턴스에 메시지 페이로드를 삽입하고 다음과 같이 선택적으로 데이터 속성을 추가합니다.

// invokes a function with the JSON message { hello: 'world' } and attributes { foo: 'bar' }
myPubsubFunction({data: new Buffer('{"hello":"world"}'), attributes: {foo: 'bar'}})

애널리틱스 함수 호출

셸에서 myAnalyticsFunction()을 실행하여 데이터 없이 애널리틱스 함수를 호출할 수 있습니다. 테스트 데이터로 함수를 실행하려면 함수에 필요한 특정 이벤트 데이터 필드에 대한 변수를 정의하는 것이 좋습니다.

var data = {
  eventDim: [{
    // populates event.data.params
    params:{foo:'bar'},
    // populates event.data.name
    name: 'event_name',
    // populates event.data.logTime, specify in microseconds
    timestampMicros: Date.now() * 1000,
    // populates event.data.previousLogTime, specify in microseconds
    previousTimestampMicros: Date.now() * 1000,
    // populates event.data.reportingDate, specify in 'YYYYMMDD' format
    date: '20170930',
    // populates event.data.valueInUSD
    valueInUsd: 230
  }],
  userDim: userDim
};

myAnalyticsFunction(data);

Storage, 인증, Crashlytics 함수 호출

Storage, 인증, Crashlytics 함수의 경우 함수 내부에 포함하려는 테스트 데이터로 로컬 함수를 호출하세요. 테스트 데이터는 다음 데이터 형식을 따라야 합니다.

코드에서 실제로 사용하는 필드만 지정하거나, 함수만 실행하려는 경우 필드를 지정하지 마세요.

로깅

두 가지 도구, 즉 firebase serve 및 Cloud Functions 셸은 자신이 실행되는 터미널 창으로 함수의 로그를 스트리밍합니다. 또한 함수에 포함된 console.log(), console.info(), console.error(), console.warn() 문의 출력을 모두 표시합니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.