يتم إجراء الاختبارات المتوافقة مع الأجهزة الجوّالة على أجهزة Android، سواء كانت هذه الاختبارات مادية أو تمت محاكاتها. وبالتالي، يمكنهم الاستفادة من واجهات برمجة التطبيقات لإطار عمل Android. لذلك توفر الاختبارات الآلية دقة أكثر من الاختبارات المحلية، على الرغم من أنها تعمل بشكل أبطأ.
لا ننصح باستخدام الاختبارات المعدّة إلا في الحالات التي يجب فيها إجراء اختبار مقابل سلوك جهاز حقيقي. يوفّر اختبار AndroidX العديد من المكتبات التي تسهّل كتابة الاختبارات المساعِدة عند الضرورة.
إعداد بيئة الاختبار
في مشروع استوديو Android، يتم تخزين ملفات المصدر للاختبارات
المدفوعة في module-name/src/androidTest/java/
. يوجد هذا الدليل بالفعل عند إنشاء مشروع جديد ويحتوي على مثال اختبار مسند.
قبل البدء، يجب إضافة واجهات برمجة التطبيقات AndroidX Test API التي تتيح لك إنشاء رمز اختبار موجَّه لتطبيقاتك وتشغيله بسرعة. يتضمّن اختبار AndroidX
مشغّل اختبار JUnit 4 وAndroidJUnitRunner
وواجهات برمجة تطبيقات لإجراء اختبارات وظيفية لواجهة المستخدم
مثل Espresso وUI Automator وCompose test.
يجب أيضًا إعداد تبعيات الاختبار على Android لمشروعك من أجل استخدام مشغّل الاختبار وواجهات برمجة التطبيقات للقواعد التي يوفّرها AndroidX Test.
في ملف build.gradle
ذي المستوى الأعلى في تطبيقك، عليك تحديد هذه المكتبات
على أنّها تبعيات:
dependencies {
androidTestImplementation "androidx.test:runner:$androidXTestVersion"
androidTestImplementation "androidx.test:rules:$androidXTestVersion"
// Optional -- UI testing with Espresso
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
// Optional -- UI testing with UI Automator
androidTestImplementation "androidx.test.uiautomator:uiautomator:$uiAutomatorVersion"
// Optional -- UI testing with Compose
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
}
يمكنك العثور على أحدث الإصدارات في ملاحظات إصدار AndroidX وملاحظات إصدار واجهة المستخدم.
لاستخدام فئات اختبار JUnit 4 والحصول على إمكانية الوصول إلى ميزات مثل فلترة الاختبار،
احرص على تحديد AndroidJUnitRunner كمشغّل
أدوات الاختبار التلقائي في مشروعك من خلال تضمين الإعداد التالي في ملف build.gradle
على مستوى الوحدة
الخاص بتطبيقك:
android {
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
}
إنشاء صف اختبار مُعدّ للأجهزة
يجب أن تكون فئة الاختبار المعدّة هي فئة اختبار JUnit 4 تكون مشابهة للفئة الموضحة في القسم المتعلق بكيفية إنشاء اختبارات محلية.
لإنشاء فئة اختبار JUnit 4 المزوّدة بأدوات، حدِّد AndroidJUnit4
كمشغّل الاختبار التلقائي.
يوضِّح المثال التالي طريقة كتابة اختبار موجَّه للتحقّق من تنفيذ واجهة القابل للتقسيم بشكل صحيح للفئة LogHistory
:
Kotlin
import android.os.Parcel import android.text.TextUtils.writeToParcel import androidx.test.filters.SmallTest import androidx.test.runner.AndroidJUnit4 import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith const val TEST_STRING = "This is a string" const val TEST_LONG = 12345678L // @RunWith is required only if you use a mix of JUnit3 and JUnit4. @RunWith(AndroidJUnit4::class) @SmallTest class LogHistoryAndroidUnitTest { private lateinit var logHistory: LogHistory @Before fun createLogHistory() { logHistory = LogHistory() } @Test fun logHistory_ParcelableWriteRead() { val parcel = Parcel.obtain() logHistory.apply { // Set up the Parcelable object to send and receive. addEntry(TEST_STRING, TEST_LONG) // Write the data. writeToParcel(parcel, describeContents()) } // After you're done with writing, you need to reset the parcel for reading. parcel.setDataPosition(0) // Read the data. val createdFromParcel: LogHistory = LogHistory.CREATOR.createFromParcel(parcel) createdFromParcel.getData().also { createdFromParcelData: List<Pair<String, Long>> -> // Verify that the received data is correct. assertThat(createdFromParcelData.size).isEqualTo(1) assertThat(createdFromParcelData[0].first).isEqualTo(TEST_STRING) assertThat(createdFromParcelData[0].second).isEqualTo(TEST_LONG) } } }
Java
import android.os.Parcel; import android.util.Pair; import androidx.test.runner.AndroidJUnit4; import com.google.common.truth.Truth.assertThat; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; // @RunWith is required only if you use a mix of JUnit3 and JUnit4. @RunWith(AndroidJUnit4.class) public class LogHistoryAndroidUnitTest { public static final String TEST_STRING = "This is a string"; public static final long TEST_LONG = 12345678L; private LogHistory mLogHistory; @Before public void createLogHistory() { mLogHistory = new LogHistory(); } @Test public void logHistory_ParcelableWriteRead() { // Set up the Parcelable object to send and receive. mLogHistory.addEntry(TEST_STRING, TEST_LONG); // Write the data. Parcel parcel = Parcel.obtain(); mLogHistory.writeToParcel(parcel, mLogHistory.describeContents()); // After you're done with writing, you need to reset the parcel for reading. parcel.setDataPosition(0); // Read the data. LogHistory createdFromParcel = LogHistory.CREATOR.createFromParcel(parcel); List<Pair<String, Long>> createdFromParcelData = createdFromParcel.getData(); // Verify that the received data is correct. assertThat(createdFromParcelData.size()).isEqualTo(1); assertThat(createdFromParcelData.get(0).first).isEqualTo(TEST_STRING); assertThat(createdFromParcelData.get(0).second).isEqaulTo(TEST_LONG); } }
إجراء الاختبارات المؤدّية إلى الأجهزة
ويمكن إجراء الاختبارات الآلية على أجهزة حقيقية أو أدوات محاكاة. في دليل "استوديو Android"، يمكنك تعلُّم كيفية تنفيذ ما يلي:
مراجع إضافية
عادةً ما تكون اختبارات واجهة المستخدم عبارة عن اختبارات معدّلة تتحقّق من السلوك الصحيح لواجهة المستخدم. وتستخدم أطر عمل مثل Espresso أو Compose Test. لمعرفة المزيد من المعلومات، اطّلِع على دليل اختبار واجهة المستخدم.
لمزيد من المعلومات حول استخدام اختبارات القياس، راجع الموارد التالية.