Cast ডেভেলপমেন্ট প্রসেসের একটি প্রয়োজনীয় অংশ হল আপনার অ্যাপ পরীক্ষা করা। ব্যবহারকারীরা যাতে কাস্ট করার সময় একই ধরনের অভিজ্ঞতা পান, তা নিশ্চিত করতে আপনার অ্যাপকে Cast UX নির্দেশিকা এবং ডিজাইন চেকলিস্ট মেনে চলতে হবে।
Android অ্যাপের ক্ষেত্রে, আপনার অ্যাপে ব্যবহারকারীর ইন্টার্যাকশন সিমুলেট করতে এবং অটোমেটিক ও রিপিট করার মতো উপায়ে আপনার UI টেস্ট রান করতে, UI Automator এবং Espresso টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করুন। অটোমেটেড UI টেস্ট সম্পর্কে আরও জানতে, ব্যবহারকারীর ইন্টারফেস টেস্ট অটোমেট করা দেখুন।
আপনার Android প্রেরক অ্যাপে কীভাবে অটোমেটেড UI টেস্ট যোগ করবেন তা এই নির্দেশিকায় বর্ণনা করা হয়েছে।
টেস্ট এনভায়রনমেন্ট সেট-আপ করা
আপনার অ্যাপ ও টেস্ট তৈরি ও চালানোর জন্য Android Studio সাজেস্ট করা হয়।
পরীক্ষার জন্য ব্যবহৃত ফিজিক্যাল ডিভাইসে, সেটিংস > ডেভেলপার বিকল্প-এর অধীনে, নিম্নলিখিত সিস্টেম অ্যানিমেশন বন্ধ করুন:
- উইন্ডো অ্যানিমেশন স্কেল
- ট্র্যানজিশন অ্যানিমেশন স্কেল
- অ্যানিমেটর সময়কাল স্কেল
উদাহরণ Gradle বিল্ড ফাইল
apply plugin: 'com.android.application'
android {
compileSdkVersion 35
defaultConfig {
applicationId "com.example.package"
minSdkVersion 24
targetSdkVersion 35
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'
}
প্রথম Cast UI টেস্ট যোগ করুন
সাধারণত, Android Studio আপনার ইন্সট্রুমেন্টেড ও UI টেস্ট রাখার জন্য
src/androidTest/java/-এ একটি সোর্স কোড ডিরেক্টরি প্রদান করে। আরও
তথ্যের জন্য, পরীক্ষার ধরন ও
লোকেশন দেখুন।
অ্যাপে Cast আইকন দেখা যাচ্ছে কিনা তা পরীক্ষা করতে:
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 কানেকশন পরীক্ষা করুন
এই উদাহরণে দেখানো হয়েছে কীভাবে কোনও 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);
}
}
অ্যাপ্লিকেশনের মূল থ্রেডে কল এক্সিকিউট করে কাস্ট সেশন এবং কানেকশন স্টেট ফিরিয়ে আনা যেতে পারে:
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);
}
}