대화형으로 함수 테스트

Cloud Functions 셸은 대화형 셸을 제공하여 테스트 데이터로 함수를 호출합니다. 이 셸은 모든 트리거 유형을 지원합니다.

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

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

  • Cloud FirestoreRealtime Database 트리거의 사용자 인증 정보가 이미 충분한 경우에는 추가 설정이 필요 없습니다.
  • Firebase API(예: Authentication, FCM) 또는 Google API(예: Cloud Translation API, Cloud Speech API)를 포함한 모든 API는 여기에서 설명하고 있는 설정 단계를 따라야 합니다. 이는 Cloud Functions 셸 또는 firebase emulators:start 사용 여부에 상관없이 적용되는 사항입니다.

에뮬레이션된 함수에 관리자 인증 정보를 설정하는 방법:

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

    Unix

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    firebase functions:shell
    

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    firebase functions:shell
    

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

Cloud Functions 셸을 사용하여 함수 처리

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

myFunctionName(data, options)

data 매개변수는 실시간 데이터베이스, Cloud Firestore, PubSub 트리거에는 필수사항이지만 그 밖의 다른 함수 유형에서는 선택사항입니다. 또한 선택적 options 매개변수는 실시간 데이터베이스와 Cloud Firestore 함수에서만 유효합니다.

필요에 따라 파일을 변수로 저장하고 이 변수로 함수를 호출하여 로컬 파일에서 테스트 데이터를 로드할 수 있습니다.

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

커스텀 함수 구성 변수를 사용할 경우 먼저 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 FCM registration 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’} })

data 객체의 before/after 필드 외에도 options 객체의 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: {stringValue: 'bar'} },
    // Also valid:
    //   {intValue: '10'}, {floatValue: '1.0'}, {doubleValue: '1.0'}
    // 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 및 인증 함수 호출

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

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