Android Firebase 에뮬레이터 키트 시작

더 많은 가시성을 얻기 위해 dev.to에 발표하십시오.original의 글이 나의 website에 발표되었다.시작하겠습니다:)
당신은 생산 환경에서 직접 응용 프로그램을 테스트하는 친구/동료를 아십니까?

네, 이것은 나쁜 방법입니다.우리는 코드를 테스트한 후에 생산에 투입할 수 있는 현지나 무대 환경이 있어야 한다.이것이 바로 Firebase 시뮬레이터가 나타난 곳이다.Firebase emulator는 로컬 환경에서 다양한 Firebase 서비스를 테스트하는 데 도움을 주는 도구입니다.

Firebase Emulator란 무엇입니까?


공식 문서에 의하면

The Firebase Local Emulator Suite consists of individual service emulators built to accurately mimic the behavior of Firebase services. This means you can connect your app directly to these emulators to perform integration testing or QA without touching production data.



현재,emulator에는 5가지 서비스가 사용 가능합니다.
  • 클라우드 Firestore
  • 실시간 데이터베이스
  • 클라우드 기능
  • 위탁관리
  • 클라우드 발표/구독
  • 참고: 단, 아날로그를 사용할 수 없거나 설정하지 않았을 때, 응용 프로그램은 Firebase 생산 서비스와 계속 통신할 것입니다.

    왜 우리는 Firebase Emulator가 필요합니까?그것은 어떤 문제를 해결했습니까?


    Firestore 시뮬레이터가 테스트 중에 안전하게 문서를 읽고 써야 합니다.모든 서비스가 로컬 환경에 연결되어 있기 때문에 서로 서비스의 이벤트를 촉발합니다.
    예를 들어 실시간 데이터베이스 쓰기는 시뮬레이터의 구름 함수를 촉발할 수 있다.
    테스트 부족으로 우리는 다음과 같은 문제에 직면했다.

    1. 시간 소모


    첫 번째 시도에서 완벽한 코드를 쓸 수 있는 사람은 없다.이것은 교체 과정이다.우리는 신속한 피드백 회로가 필요하다.예를 들어 만약에 우리가 시뮬레이터가 없는 상황에서 구름 함수를 작성한다면 우리가 변경할 때마다 서버로 전송해야 한다. 이것은 약 20-30초가 걸릴 것이다. 이것은 시간을 낭비하는 것이고 주의력을 분산시키고 생산력을 방해할 것이다.

    2. 디버깅


    개발 과정에서 우리는 많은 가설과 오류를 만들었는데, 이러한 가설과 오류는 디버깅을 통해 복구될 수 있다.로컬 설정 없이 서버에서 직접 디버깅하는 것은 악몽이다.아니오, 줄마다 console.log()이 있는 것도 좋은 해결 방안이 아닙니다.로컬 환경이 있으면 가장 좋아하는 IDE를 사용하여 디버깅을 더욱 효과적으로 할 수 있습니다.

    3. 데이터 모델링


    Firebase에서 가장 흔히 볼 수 있는 문제는 데이터베이스에 대한 데이터 모델링이다.우리는 데이터베이스의 구조를 시험해 왔다. 만약에 로컬 환경이 없다면 테스트 데이터와 생산 데이터 사이에 명확한 경계를 정의하기 어렵다.
    입력 오류, 잘못된 키 사용, 문서 삭제 오류로 인해 생산 데이터가 흐트러질 가능성이 높습니다.
    나는 다음 절에서 해결 방법을 토론할 것이다.

    4. 통합 테스트를 위해 CI/CD 사용


    에뮬레이터 키트의 모든 제품 에뮬레이터는 Firebase 서비스를 생산하는 것처럼 SDK와 REST API 호출에 응답합니다.따라서 CI/CD에 통합된 테스트 도구를 사용하여 포함된 통합 테스트를 작성하고 로컬 시뮬레이터 세트를 백엔드로 사용할 수 있습니다.

    5. 실제 비용


    우리가 검사해야 할 첫 번째 일은 가격을 정하는 것이다.나는 네가 이미 화재 현장을 검사했으면 좋겠다.없으면 pricing을 방문하십시오.
    만약 당신이 프로젝트를 진정한 사용자가 없는 여가 취미로 삼는다면, 정가는 어떤 문제도 일으키지 않을 것이다.그러나 만약 당신이 진정한 고객/사용자를 위해 계획을 세운다면, 예를 들어 10000명의 사용자에 도달할 것이다.사용자 수의 증가로 인해 서비스의 사용은 비례에 따라 증가할 것이다.
    실시간 데이터베이스는 동시에 1000개의 연결이 있을 것이다.Firestore는 더 많은 읽기/쓰기/삭제를 제공합니다.구름 함수는 높은 사용률을 가지게 될 것이다. 이것은 결국 너에게 많은 돈을 들일 것이다.
    따라서 우리는 Firebase에서 불필요한 읽기와 다운로드에 주의해야 한다. 특히 테스트를 할 때, 우리는 과거에 각종 쓰레기 데이터를 전송하여 각종 장면을 테스트했기 때문이다.
    나는 이 동영상을 보고 Firestore의 가격을 이해할 것을 건의한다.
    인도어:

    6. 여러 프로젝트와 협력


    프로젝트마다 데이터베이스가 있기 때문에 대부분의 개발자들은 여러 개의 프로젝트를 만들어서 각각 생산과 테스트 환경을 처리한다.
    예를 들어, 나는'My Prod App'이라는 Firebase 프로젝트를 만들고 패키지 com.burhanrashid52.firebase.sampleapp으로 나의 응용 프로그램을 추가한 다음에 나는'My Test App'이라는 다른 프로젝트를 만들 것이다. 패키지 이름은 com.burhanrashid52.firebase.sampleapp.testing이다.
    이것은 문제를 피하는 데 도움이 될 것이다. 왜냐하면 Firebase pricing is project-based, not account-based이기 때문이다.

    어떻게 시작합니까?


    내가 이 절의 초고를 썼을 때.나는 Firebaseemulator 세트를 설정하기 위해 모든 단계 명령을 작성했다. Firebase 문서에서 이 세트를 제공했다.그렇다면 왜 바퀴를 재발명해야 합니까?공식 documentation을 통해 설치하세요.만약 당신이 사물을 더욱 직관적으로 이해할 수 있는 사람이라면.이 동영상을 보십시오.
    다음은 주어진 명령이 포함된 간단한 버전입니다.
  • CLI 설정→ npm install -g firebase-tools
  • Firebase 계정 로그인→ firebase login
  • 선택 항목.
  • 프로젝트 초기화 Firebase→ firebase init
  • 원하는 제품을 선택하십시오.
  • 시동 시뮬레이터→ firebase emulators:start
  • (옵션) Rum 특정 기능 -
  • 만 사용
  • Firestore:firebase emulators:start --only firestore
  • 실시간 데이터베이스: firebase emulators:start --only database
  • 구름 함수: firebase emulators:start --only functions

  • 7. 브라우저에서 localhost: 4000을 실행하면 emulator suite 컨트롤러를 볼 수 있습니다.

    추가 정보 here
    대시보드는 각 서비스 시뮬레이터의 상태를 포트 번호로 표시합니다(켜기/끄기).우리는 클라이언트 응용 프로그램을 이 포트 번호에 연결합니다.(이에 대한 자세한 내용은 나중에 참조).
    기본 포트가 사용되면 change 포트를 사용할 수 있습니다.

    Firebase emulator에 Android(클라이언트) 연결


    우리의 Firebase emulator 세트가 시작되고 실행되었습니다.현재 우리는 클라이언트를 emulator 세트에 연결해야 합니다.이후 클라이언트는 이 시뮬레이터의 데이터를 끌어당길 수 있고 시뮬레이터 UI 페이지에서 변화를 관찰할 수 있습니다.
    나는 이곳에서 안드로이드를 클라이언트로 사용한다.iOS 또는 웹을 클라이언트로 사용하는 경우 공식 document을 참조하십시오.
    "android emulator"에서android를 실행하기 때문에, 호스트로 localhost:8080을 사용할 수 없습니다.우리는 10.0.2.2:8080을 "android emulator"IP로 사용해야 한다.우리는androidemulator 브라우저에서 10.0.2.2:8080을 실행하여 이 점을 테스트하고 Firebaseemulator UI가androidemulator 브라우저에 표시되는지 검증할 수 있습니다.
    다음은 호스트를 설정하는 코드 세그먼트입니다.서비스마다 포트가 다릅니다.

    1.Android Firestore


        val instance = FirebaseFirestore.getInstance()
        val settings = FirebaseFirestoreSettings.Builder()
                .setHost("10.0.2.2:8080")
                .setSslEnabled(false)
                .setPersistenceEnabled(false)
                .build()
    
        instance.firestoreSettings = settings
    

    2. Android 실시간 데이터베이스


    실시간 데이터베이스에 대해 URL에 프로젝트 id를 추가해야 합니다.Firebase 프로젝트 설정에서 이 점을 찾거나 Firebase emulator UI의 실시간 데이터베이스 옵션 카드에서 직접 복사할 수 있습니다.
    val instance = FirebaseDatabase.getInstance("http://10.0.2.2:9000?ns=projectId")
    

    3. Android의 클라우드 기능


    만약 manually이 클라이언트에서 클라우드 함수를 호출한다면.
    val instance = FirebaseFunctions.getInstance();
    instance.useEmulator("10.0.2.2", 5001)
    

    We just need to make sure that we operating on the created instance. Otherwise it will get connect to the production firebase db. A better practice would be to injecting a singleton class which provide the same instance throughout the application.


    4. Koin 의존 주입


    우리는 koin 모듈을 사용하고 single {} Lamba를 사용하여 모든 의존항을 하나의 예로 삼아 사용해야 할 곳에 같은 실례를 주입하고 있습니다
    val firebaseModule = module {
    
        single {
            val instance = FirebaseFirestore.getInstance()
    
            val settings = if (isFirebaseLocal) {
                FirebaseFirestoreSettings.Builder()
                        .setHost("10.0.2.2:8080")
                        .setSslEnabled(false)
                        .setPersistenceEnabled(false)
                        .build()
            } else {
                FirebaseFirestoreSettings.Builder()
                        .setSslEnabled(false)
                        .setPersistenceEnabled(false)
                        .build()
            }
            instance.firestoreSettings = settings
            instance
    
        }
    
        single {
            if (isFirebaseLocal) {
                FirebaseDatabase.getInstance("http://10.0.2.2:9000?ns=projectId")
            } else {
                FirebaseDatabase.getInstance()
            }
        }
    
        single {
            val instance = FirebaseFunctions.getInstance()
            if (isFirebaseLocal) {
                instance.useEmulator("10.0.2.2", 5001)
            }
            instance
        }
    }
    
    var isFirebaseLocal = false
    
    우리는 로고 isFirebaseLocal을 사용하고 MyApp류로 설정했다.그것은 로컬 데이터베이스와 생산 데이터베이스 사이를 전환하는 데 도움이 된다.우리도 이 로고를gradle 설정에 놓을 수 있습니다.
    우리는 코인으로 주사할 수 있다.
    val firestore by inject<FirebaseFirestore>()
    

    5, 릴리즈 버전


    버전을 발표할 때, 나는 항상 이 로고를false로 설정합니다.그래서 나는 이런 일을 했다.이렇게 하면 나는 의외로 발표 버전에서 실현될 수 없다.이 정도는 할 수 있는 더 좋은 방법이 있다.그러나 간단하게 보기 위해서, 나는 이 점에 동의한다.
    class MyApp : Application() {
    
        override fun onCreate() {
            super.onCreate()
    
            if (BuildConfig.DEBUG) {
                isFirebaseLocal = false
            }
            // Start Koin
            startKoin {
                androidLogger()
                modules(firebaseModule)
            }
        }
    }
    

    기억해야 할 중요한 사항.

  • 클라이언트에서 호스트 IP 및 포트를 자세히 확인합니다.나는 왜 나의 클라이언트 응용 프로그램이 아날로그 세트에 연결되지 않았는지 디버깅하는 데 3시간을 낭비했다.
  • Firebase emulator는 로컬에 데이터를 저장하지 않습니다.서버를 재부팅하면 모든 데이터가 지워집니다.Firestore 옵션 카드의clear 데이터 (데이터 삭제) 단추를 누르면 비슷한 동작을 할 수 있습니다.만약 우리가 대량의 데이터와 각종 장면을 테스트해야 한다면 이것은 고통스러울 것이다.나는'이미 알고 있는 문제'부분에서 복구 프로그램을 인용했다.
  • 만약 우리가 클라우드 함수를 사용하여 실시간 데이터베이스를 업데이트하려고 시도한다면, 우리는 이 오류를 볼 수 있습니다.
  • 클라우드 기능에서 실시간 데이터베이스에 대한 작업을 수행하려면 응용 프로그램을 초기화할 때 실시간 데이터베이스의 로컬 URL을 설정해야 합니다.더 많은 정보 here.배포할 때 운영 URL로 전환하는 것을 잊지 마십시오.
  •    admin.initializeApp({
            credential: admin.credential.applicationDefault(),
            databaseURL: 'http://localhost:9000?ns=projectId'
        });
    
    5. 우리가 Firestore와 실시간으로 사용하는 열쇠를 자세히 검사한다.타자 실수는 당신의 모든 정신적, 신체적, 정신적 에너지를 소모시킬 것이다.

    이미 알고 있는 문제


    Firebase emulator 세트는 완전히 새로운 완벽한 상태에 이르지 못한 소프트웨어로 때때로 버그가 발생할 수 있다.

  • Firestore UI bug: 클라이언트를 사용하여 데이터를 전송할 때 Firestore emulator 페이지에서 데이터를 볼 수 없습니다.그러나 우리의 데이터는 클라이언트로부터 정확하게 전송되고 기능은 예상대로 작동한다.나는 이미 이곳에서 문제를 하나 제기했다.만약 당신이 같은 상황을 발견한다면, 위로 투표하세요.

  • Persist data locally: 이미 지난 절에서 이 점을 토론하였다.UI의 가져오기/내보내기 버튼은 JSON 파일을 사용하여 실시간으로 작업하는 것처럼 도움이 될 수 있습니다.
  • 인증은 locally을 사용할 수 없습니다.
  • 결론


    나는 이전에 Firebase로 응용 프로그램을 개발한 적이 있는데, 이 기능은 많은 시간과 정력을 절약했다고 믿는다.
    지금 당신의 친구/동료에게 말하지만, 우리는 생산 환경에서 테스트하는 것이 아니라, Firebase 시뮬레이터 테스트 코드를 사용하는 더 좋은 방법이 있습니다.이제 막 시작했어.
    더 많은 기능과 오류 복구를 기대합니다.Firebase 팀에 감사드립니다.
    시간을 내서 본문을 읽어 주셔서 감사합니다.만약 당신이 이 글을 좋아한다면, 당신의 친구/동료와 공유하고, 나의 블로그를 구독하여 수시로 이런 게시물을 업데이트하세요.질문/질문이 있으면 소셜 미디어 플랫폼에서 저에게 물어보세요.

    좋은 웹페이지 즐겨찾기