การทดสอบแอปเป็นส่วนที่จำเป็นในกระบวนการพัฒนา Cast แอปของคุณควรเป็นไปตามหลักเกณฑ์ UX ของ Cast และรายการตรวจสอบการออกแบบเพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งาน Cast ที่สอดคล้องกัน
สำหรับแอป Android ให้ใช้ประโยชน์จากเฟรมเวิร์กการทดสอบ UI Automator และ Espresso เพื่อจำลองการโต้ตอบของผู้ใช้ในแอป และเรียกใช้การทดสอบ UI ในลักษณะอัตโนมัติและทำซ้ำได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบ UI อัตโนมัติได้ที่ทดสอบอินเทอร์เฟซผู้ใช้โดยอัตโนมัติ
คู่มือนี้อธิบายวิธีเพิ่มการทดสอบ UI อัตโนมัติลงในแอปตัวส่ง Android
ตั้งค่าสภาพแวดล้อมการทดสอบ
เราขอแนะนำให้ใช้ Android Studio ในการสร้างและเรียกใช้แอปและการทดสอบ
ในอุปกรณ์จริงที่ใช้สำหรับการทดสอบ ให้ไปที่การตั้งค่า > ตัวเลือกสำหรับนักพัฒนาแอป แล้วปิดภาพเคลื่อนไหวของระบบต่อไปนี้
- อัตราการเคลื่อนไหวของหน้าต่าง
- อัตราการเคลื่อนไหวของการเปลี่ยนภาพ
- อัตราความเร็วตามตัวสร้างภาพเคลื่อนไหว
ตัวอย่างไฟล์บิลด์ Gradle
apply plugin: 'com.android.application'
android {
    compileSdkVersion 34
    defaultConfig {
        applicationId "com.example.package"
        minSdkVersion 23
        targetSdkVersion 34
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
}
dependencies {
    ...
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test:rules:1.1.1'
}
เพิ่มการทดสอบ UI ของ Cast รายการแรก
โดยค่าเริ่มต้น Android Studio จะมีไดเรกทอรีซอร์สโค้ดที่
src/androidTest/java/ เพื่อวางการทดสอบที่ใช้เครื่องมือและการทดสอบ UI ดูข้อมูลเพิ่มเติมได้ที่ประเภทการทดสอบและ
สถานที่
วิธีทดสอบว่าไอคอนแคสต์แสดงในแอปหรือไม่
package com.example.package;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import androidx.mediarouter.app.MediaRouteButton;
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
import androidx.test.rule.ActivityTestRule;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
@RunWith(AndroidJUnit4ClassRunner.class)
public class MyCastUITest {
    @Rule
    public ActivityTestRule<MainActivity> mActivityRule =
            new ActivityTestRule<>(MainActivity.class);
    @Test
    public void testCastButtonDisplay() throws InterruptedException {
        // wait for Cast button
        Thread.sleep(2000);
     onView(isAssignableFrom(MediaRouteButton.class)).check(matches(isDisplayed()));
    }
}
ทดสอบการเชื่อมต่อ Cast
ตัวอย่างนี้แสดงวิธีจำลองการดำเนินการของผู้ใช้ที่เชื่อมต่อกับอุปกรณ์แคสต์
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.uiautomator.UiDevice;
import androidx.test.uiautomator.UiObjectNotFoundException;
import androidx.test.uiautomator.UiSelector;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
@RunWith(AndroidJUnit4ClassRunner.class)
public class MyCastUITest {
    @Rule
    public ActivityTestRule<MainActivity> mActivityRule =
            new ActivityTestRule<>(MainActivity.class);
    /**
     * Connecting to Cast device
     *  - Open Cast menu dialog when tapping the Cast icon
     *  - Select target Cast device and connect
     *  - Assert the Cast state is connected
     */
    @Test
    public void testConnectToCastDevice()
             throws InterruptedException, UiObjectNotFoundException {
        // wait for Cast button ready
        Thread.sleep(2000);
        // click on Cast icon and show a dialog
        onView(isAssignableFrom(MediaRouteButton.class))
                .perform(click());
        onView(withId(R.id.action_bar_root))
                .check(matches(isDisplayed()));
        // select target Cast device to connect
        UiDevice mDevice = UiDevice.getInstance(
                InstrumentationRegistry.getInstrumentation());
        mDevice.findObject(new UiSelector().text(TARGET_DEVICE)).click();
        // assert the Cast state is connected
        assertCastStateIsConnected(MAX_TIMEOUT_MS);
    }
}
คุณเรียกข้อมูลสถานะเซสชันและการเชื่อมต่อ Cast ได้โดยการเรียกใช้ใน เธรดหลักของแอปพลิเคชัน
import android.content.Context;
import android.os.SystemClock;
import com.google.android.gms.cast.framework.CastContext;
import com.google.android.gms.cast.framework.CastSession;
import com.google.android.gms.cast.framework.SessionManager;
import static org.junit.Assert.assertTrue;
@RunWith(AndroidJUnit4ClassRunner.class)
public class MyCastUITest {
    private CastContext mCastContext;
    private CastSession mCastSession;
    private SessionManager mSessionManager;
    private boolean isCastConnected;
    @Rule
    public ActivityTestRule<MainActivity> mActivityRule =
            new ActivityTestRule<>(MainActivity.class);
    /**
     * Connecting to Cast device
     */
    @Test
    public void testConnectToCastDevice()
             throws InterruptedException, UiObjectNotFoundException {
        ......
        // assert the Cast state is connected
        assertCastStateIsConnected(MAX_TIMEOUT_MS);
    }
    /**
     * Check connection status from Cast session
     */
    private void assertCastStateIsConnected(long timeout)
              throws InterruptedException {
        long startTime = SystemClock.uptimeMillis();
        isCastConnected = false;
        while (!isCastConnected && SystemClock.uptimeMillis() - startTime < timeout) {
            Thread.sleep(500);
            // get cast instance and cast session from the app's main thread
            InstrumentationRegistry.getInstrumentation().runOnMainSync(
                    new Runnable() {
                        @Override
                        public void run() {
                            Context mTargetContext =
                                InstrumentationRegistry.getInstrumentation().getTargetContext();
                            mCastContext =
                                CastContext.getSharedInstance(mTargetContext);
                            mSessionManager = mCastContext.getSessionManager();
                            mCastSession =
                                mSessionManager.getCurrentCastSession();
                            isCastConnected = mCastSession.isConnected();
                        }
                    }
            );
        }
        assertTrue(isCastConnected);
    }
}