يتم إجراء الاختبارات المضبوطة على الأجهزة التي تعمل بنظام التشغيل 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 Release Notes وCompose UI Release Notes.
لاستخدام صفوف اختبار JUnit 4 والحصول على ميزات مثل فلترة الاختبار، احرص على تحديد AndroidJUnitRunner كأداة الاختبار التلقائية
في مشروعك من خلال تضمين الإعداد التالي في ملف build.gradle
على مستوى الوحدة في تطبيقك:
android {
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
}
إنشاء صف اختبار قياسي
يجب أن تكون فئة الاختبار المضبوطة على مستوى فئة JUnit 4 مشابهة للفئة الموضحة في القسم الخاص بكيفية إنشاء اختبارات محلية.
لإنشاء فئة اختبار JUnit 4 المستخدمة، حدِّد AndroidJUnit4
كمشغّل الاختبار التلقائي.
يوضِّح المثال التالي كيف يمكنك كتابة اختبار قياسي للتحقّق من تنفيذ واجهة Parcelable بشكل صحيح لفئة 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) } } }
جافا
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. لمعرفة المزيد من المعلومات، يُرجى الاطّلاع على دليل اختبار واجهة المستخدم.
لمزيد من المعلومات حول استخدام اختبارات قياس حالة التطبيق، ارجع إلى الموارد التالية.