اختبارات قياس حالة التطبيق

يُرجى أولاً قراءة مقالة اختبار تطبيقك على موقع developer.android.com. يُرجى العِلم أنّ هناك بعض الاختلافات في طريقة استخدام اختبارات الأجهزة في اختبار المنصّة.

باختصار، يوفّر اختبار الأجهزة بيئة خاصة لتنفيذ الاختبار يتم تشغيلها من خلال الأمر am instrument، حيث تتم إعادة تشغيل عملية التطبيق المستهدَف وتهيئتها باستخدام سياق التطبيق الأساسي، ويتم بدء سلسلة تعليمات خاصة بالأجهزة داخل الجهاز الافتراضي لعملية التطبيق. يبدأ تنفيذ رمز الاختبار في سلسلة التنفيذ هذه، ويتم تزويده بنسخة من Instrumentation تتيح الوصول إلى سياق التطبيق وواجهات برمجة التطبيقات لمعالجة عملية التطبيق قيد الاختبار.

المفاهيم الرئيسية

  • يجب تعريف أداة القياس في حزمة تطبيق، مع تضمين علامة <instrumentation> ضمن علامة <manifest> في بيان حزمة التطبيق.
  • قد يحتوي بيان حزمة التطبيق من الناحية الفنية على علامات <instrumentation> متعددة، على الرغم من أنّه لا يتم استخدامها عادةً بهذه الطريقة.
  • يجب أن يحتوي كل <instrumentation> على ما يلي:
    • سمة android:name: يجب أن تكون اسم فئة فرعية من Instrumentation المضمّنة في تطبيق الاختبار، وهي عادةً أداة تشغيل الاختبار المستخدَمة، مثلاً: android.support.test.runner.AndroidJUnitRunner
    • يجب تحديد السمة android:targetPackage. يجب ضبط قيمته على حزمة التطبيق قيد الاختبار.

ملخّص الخطوات

  1. في ما يلي بعض الوجهات الشائعة للاختبارات المحكمة ضد خدمات إطار العمل:

    frameworks/base/core/tests/coretests
    frameworks/base/services/tests/servicestests
    

    إذا كنت بصدد إضافة وحدة جديدة تمامًا لأدوات القياس إلى مكوّنك، يُرجى الاطّلاع على

  2. اتّبِع الاصطلاح الحالي إذا كنت تضيف اختبارات إلى أحد المواقع الجغرافية المذكورة أعلاه. إذا كنت بصدد إعداد وحدة اختبار جديدة، يُرجى اتّباع خطوات إعداد AndroidManifest.xml وAndroid.mk في أحد المواقع الجغرافية المذكورة أعلاه.

  3. يمكنك الاطّلاع على frameworks/base/core/tests/coretests/ للحصول على مثال. يُرجى العِلم أنّ هذه الأسطر تثبّت تطبيقات إضافية:

    <option name="test-file-name" value="FrameworksCoreTests.apk" />
    <option name="test-file-name" value="BstatsTestApp.apk" />
    
  4. لا تنسَ وضع علامة @SmallTest أو @MediumTest أو @LargeTest على اختبارك

  5. أنشئ وحدة الاختبار باستخدام m، على سبيل المثال:

    m FrameworksCoreTests
    
  6. إجراء الاختبارات:

    • أبسط حلّ هو استخدام Atest على النحو التالي:

      atest FrameworksCoreTests
      
    • أو لإجراء اختبارات أكثر تعقيدًا، استخدِم أداة اختبار Trade Federation:

    m tradefed-all
    tradefed.sh run template/local_min --template:map test=FrameworksCoreTests
    
  7. في حال عدم استخدام Tradefed، ثبِّت الاختبارات وشغِّلها يدويًا:

    1. ثبِّت حزمة APK التي تم إنشاؤها:
    adb install -r ${OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
    
    1. أجرِ الاختبارات باستخدام خيارات مختلفة:

      1. جميع الاختبارات في حزمة APK

        adb shell am instrument -w com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      2. جميع الاختبارات ضمن حزمة Java معيّنة

        adb shell am instrument -w -e package android.animation \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      3. جميع الاختبارات ضمن فئة معيّنة

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        
      4. طريقة اختبار محدّدة

        adb shell am instrument -w -e class \
          android.animation.AnimatorSetEventsTest#testCancel \
          com.android.frameworks.coretests\
          /android.support.test.runner.AndroidJUnitRunner
        

يمكن أن يقدّم الاختبار تأكيدًا صريحًا على النجاح أو الفشل باستخدام واجهات برمجة التطبيقات JUnit، بالإضافة إلى أنّ أي استثناءات غير معالَجة ستؤدي أيضًا إلى حدوث خطأ وظيفي.

لإصدار مقاييس الأداء، يمكن لرمز الاختبار استدعاء Instrumentation#sendStatus لإرسال قائمة بأزواج المفتاح/القيمة. من المهم ملاحظة ما يلي:

  1. يمكن أن تكون المقاييس أعدادًا صحيحة أو أعدادًا عشرية
  2. سيتم تجاهل أي قيم غير رقمية
  3. يمكن أن يكون ملف APK للاختبار إما اختبارات وظيفية أو اختبارات مقاييس، ولكن لا يمكن حاليًا الجمع بين النوعين.