본문 바로가기
안드로이드(kotlin)

안드로이드 Broadcast Receiver 테스트 하기

by 기계공학 주인장 2023. 3. 16.
반응형

안드로이드 Broadcast Receiver 테스트하기

Broadcast Receiver를 테스트하는 방법에는 아래의 두 방법이 있습니다.

  1. ADB로 직접 Bradcast Receiver에 신호 주기
  2. Instrumented Unit Test를 사용해서 애뮬레이터로 테스트해보기

둘 다 장단점이 있으며 어떻게 사용할 수 있는지 알아보겠습니다.

 


ADB로 안드로이드 Broadcast Receiver 테스트하기

먼저 ADB로 테스트하기 위해선 다음과 같이 테스트 환경을 만들어야 합니다.

 

  1. Android 디바이스를 컴퓨터에 연결합니다.
  2. ADB를 사용하여 디바이스와 연결되어 있는지 확인합니다.
    • adb devices 명령어를 입력하고 연결된 디바이스가 표시되는지 확인합니다.
  3. 브로드캐스트 이벤트를 보내기 위해 ADB 셸을 엽니다.
    • adb shell 명령어를 입력합니다.
  4. 브로드캐스트 이벤트를 발송합니다.
    • am broadcast 명령어를 사용합니다. 이 명령어는 브로드캐스트 인텐트를 발생시킵니다.
    • 예를 들어, am broadcast -a android.intent.action.BOOT_COMPLETED 명령어를 입력하여 부팅 완료 이벤트를 시뮬레이트할 수 있습니다.
  5. 이벤트 수신을 확인합니다.
    • 브로드캐스트 수신을 확인하는 앱을 실행하여 이벤트가 전송되었는지 확인할 수 있습니다.
    • 예를 들어, 부팅 완료 이벤트를 확인하려면, 디바이스를 다시 시작한 후 로그인하고 앱을 실행하여 확인할 수 있습니다.

 

androidManifest 수정

다음과 같이 androidManifest에서 <receiver>를 등록하여하고

 

exported를 true로 해야 외부에서 broadCast를 수신할 수 있습니다.

 

<receiver
    android:name=".mybroadcast.MyReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

 

또한 리시버에 테스트를 위한 리시버 필터를 정의해줘야합니다.

 

다음과 같은 방법으로 정의할 수 있습니다.

 

 <receiver
    android:name=".broadcast.MyReceiver"
    android:exported="true">
    <intent-filter>

        <action android:name="com.my.packageName" />

    </intent-filter>

 

주의사항

android.intent.action.BOOT_COMPLETED 같은 시스템 명령어는 

 

안드로이드 26 (Oreo) 이상에서 외부에서 호출할 수 없습니다.

 

그렇기 때문에 따로 커스텀한 액션이나 다음과 같이 패키지, 클래스명을 지정한 방법으로만 테스트할 수 있습니다.

 

adb shell am broadcast -n your.package.name/your.package.name.braodcastClassName -e ACTION_BUTTON "action1"

 

참고로 

-n 은 패키지명/브로드캐스트 클래스 이름이며

-e 는 같이 보낼 데이터입니다. (예를 들면 여기선 ACTION_BUTTON 라는 이름에 "action1" 넣어서 보냄)


AndroidJUnit4으로 테스트하기

먼제 브로드캐스트 테스트를 하기 전에 위에서 androidManifest에 필터를 정의했는지 확인하시길 바랍니다.

 

androidTest 패키지 안에 파일을 만들고

 

다음과 같이 입력하면 쉽게 테스트할 수 있습니다.

@RunWith(AndroidJUnit4::class)
class AlarmBroadCastTest {
    private val context = InstrumentationRegistry.getInstrumentation().context
    private lateinit var receiver: AlarmReceiver

    @Before
    fun setup() {
        receiver = AlarmReceiver()
        val intentFilter = IntentFilter().apply {
            addAction(context.packageName)
        }
        // 브로드캐스트를 등록한다
        InstrumentationRegistry.getInstrumentation().targetContext.registerReceiver(
            receiver,
            intentFilter
        )
    }

    @Test
    fun test_MY_PACKAGE_REPLACED_OnReceive() {
        val intent = Intent(context.packageName)
        // 브로드캐스트에 신호를 보낸다.
        context.sendOrderedBroadcast(intent, null)
        // wait for onReceive() in Receive class
        Thread.sleep(2000)
        // 리시버 안에 정의해놓은 값이 true가 되었는지 확인한다.
        assertTrue(receiver.broadcastCalled)
    }

    @After
    fun tearDown() {
        // 테스트가 끝났으니 브로드캐스트 등록을 해제한다.
        InstrumentationRegistry.getInstrumentation().targetContext.unregisterReceiver(receiver)
    }
}

 

참고로 Receiver 안에는 다음과 같이 정의되어 있습니다.

 

override fun onReceive(context: Context?, intent: Intent?) {
    println("Broadcast is called")
    
    // 최초에 broadcastCalled는 false로 정의되어있다.
    // 그렇게 때문에 onReceiver가 호출되었을 때만 broadcastCalled가 true가 된다.
    broadcastCalled = true
}

 

그렇기 때문에 broadcastCalled 변수를 확인해서 실제로 브로드캐스트가 호출되었는지 확인할 수 있습니다.

반응형


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


댓글