it-swarm.dev

تشغيل اختبارات JUnit البسيطة على Android Studio (IntelliJ) عند استخدام تكوين يستند إلى Gradle

أستخدم Android Studio/IntelliJ للبناء على مشروع Android حالي وأرغب في إضافة بعض اختبارات وحدة JUnit البسيطة. ما هو المجلد الصحيح لإضافة مثل هذه الاختبارات؟

يعرّف المكون الإضافي Android Gradle بنية الدليل بـ src/main/Java لرمز المصدر الرئيسي و src/instrumentTest/Java لاختبارات Android.

محاولة إضافة اختبارات JUnit الخاصة بي في أداة الاختبار لم تنجح بالنسبة لي. يمكنني تشغيله كاختبار Android (هذا ما يبدو عليه هذا الدليل) ولكن هذا ليس ما أبحث عنه - أريد فقط تشغيل اختبار JUnit بسيط. لقد حاولت إنشاء تكوين تشغيل JUnit لهذه الفئة ، لكن هذا لم ينجح أيضًا - أفترض لأنني أستخدم دليلًا يتم وضع علامة عليه كـ Android اختبار بدلاً من المصدر.

إذا قمت بإنشاء مجلد مصدر جديد ووضع علامة عليه في بنية المشروع ، فسيتم مسح هذا في المرة القادمة IntelliJ بتحديث تكوين المشروع من ملفات إنشاء gradle.

ما هي الطريقة الأكثر ملاءمة لتكوين اختبارات JUnit في مشروع أندرويد قائم على gradle على IntelliJ؟ أي بنية الدليل لاستخدامها لهذا؟

78
Julian Cerruti

اعتبارًا من Android Studio 1.1 ، أصبحت الإجابة بسيطة الآن: http://tools.Android.com/tech-docs/unit-testing-support

22
Erik B

عادة ، لا يمكنك ذلك. مرحبًا بك في عالم Android ، حيث يجب تشغيل جميع الاختبارات على جهاز (باستثناء Robolectric).

السبب الرئيسي هو أنه ليس لديك بالفعل مصادر إطار العمل - حتى إذا كنت تقنع IDE بإجراء الاختبار محليًا ، فستحصل على الفور على استثناء "Stub! لم يتم التنفيذ". "لماذا ا؟" قد تتساءل؟ لأن Android.jar التي يمنحك SDK تم حذفها فعليًا - كل الفئات والأساليب موجودة ولكنهم جميعًا يرفضون استثناء. هناك لتقديم API ولكن ليس هناك لمنحك أي تنفيذ الفعلي.

هناك مشروع رائع يسمى Robolectric الذي ينفذ الكثير من الإطار فقط حتى تتمكن من إجراء اختبارات ذات مغزى. إلى جانب إطار عمل وهمي جيد (على سبيل المثال ، Mockito) ، فإنه يجعل عملك يمكن التحكم فيه.

المكوّن الإضافي المساعد: https://github.com/robolectric/robolectric-gradle-plugin

36
Delyan

مقدمة

لاحظ أنه عند كتابة robolectric 2.4 هو أحدث إصدار وليس لديه دعم لمكتبة appcompat v7. تتم إضافة دعم wil في إصدار robolectric 3.0 ( لا يوجد ETA بعد ). أيضا ActionBar Sherlock يمكن أن يسبب مشاكل مع robolectric.

لاستخدام Robolectric داخل Android Studio ، لديك خياران:

(الخيار 1) - تشغيل اختبارات JUnit باستخدام Android Studio باستخدام وحدة Java

تستخدم هذه التقنية وحدة جافا لجميع الاختبارات الخاصة بك مع تبعية لوحدة أندرويد الخاصة بك وعداء اختبار مخصص مع بعض السحر:

يمكن العثور على التعليمات هنا: http://blog.blundellapps.com/how-to-run-robolectric-junit-tests-in-Android-studio/

تحقق أيضًا من الرابط في نهاية هذا المنشور لإجراء الاختبارات من Android studio.

(الخيار 2) - تشغيل اختبارات JUnit باستخدام Android Studio باستخدام المكون الإضافي robolectric-gradle-plugin

لقد صادفت بعض المشكلات في إعداد اختبارات junit للتشغيل من gradle في Android Studio.

هذا مشروع نموذج أساسي لتشغيل اختبارات junit من مشروع قائم على أساس في Android Studio: https://github.com/hanscappelle/Android-studio-junit-robolectric تم اختبار هذا باستخدام Android Studio 0.8.14 و JUnit 4.10 و plugin grapplect 0.11+ و robolectric 2.3

Buildscript (مشروع/build.gradle)

البرنامج النصي للبناء هو ملف build.gradle في جذر مشروعك. هناك اضطررت إلى إضافة المساعد graolectric gradle إلى classpath

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:0.13.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'org.robolectric:robolectric-gradle-plugin:0.13.+'

    }
}

allprojects {
    repositories {
        jcenter()
    }
}

مخطط البناء (التطبيق/build.gradle)

في البرنامج النصي للبناء بوحدة التطبيق الخاصة بك ، استخدم المكوّن الإضافي robolectric ، وأضف robolectric config وأضف تبعيات androidTestCompile.

apply plugin: 'com.Android.application'
apply plugin: 'robolectric'

Android {
    // like any other project
}

robolectric {
    // configure the set of classes for JUnit tests
    include '**/*Test.class'
    exclude '**/espresso/**/*.class'

    // configure max heap size of the test JVM
    maxHeapSize = '2048m'

    // configure the test JVM arguments
    jvmArgs '-XX:MaxPermSize=512m', '-XX:-UseSplitVerifier'

    // configure whether failing tests should fail the build
    ignoreFailures true

    // use afterTest to listen to the test execution results
    afterTest { descriptor, result ->
        println "Executing test for {$descriptor.name} with result: ${result.resultType}"
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    androidTestCompile 'org.robolectric:robolectric:2.3'
    androidTestCompile 'junit:junit:4.10'
}

إنشاء فئات اختبار JUnit

الآن ضع فئات الاختبار في الموقع الافتراضي (أو قم بتحديث تهيئة gradle)

app/src/androidTest/Java

وقم بتسمية فصول الاختبارات الخاصة بك التي تنتهي بـ Test (أو تحديث التهيئة مرة أخرى) ، وتمديد junit.framework.TestCase وتعليق طرق الاختبار بـ @Test.

package be.hcpl.Android.mytestedapplication;

import junit.framework.TestCase;
import org.junit.Test;

public class MainActivityTest extends TestCase {

    @Test
    public void testThatSucceeds(){
        // all OK
        assert true;
    }

    @Test
    public void testThatFails(){
        // all NOK
        assert false;
    }
}

تنفيذ الاختبارات

بعد ذلك ، قم بتنفيذ الاختبارات باستخدام gradlew من سطر الأوامر (اجعلها قابلة للتنفيذ باستخدام chmod +x إذا لزم الأمر)

./gradlew clean test

إخراج العينة:

Executing test for {testThatSucceeds} with result: SUCCESS
Executing test for {testThatFails} with result: FAILURE

Android.hcpl.be.mytestedapplication.MainActivityTest > testThatFails FAILED
    Java.lang.AssertionError at MainActivityTest.Java:21

2 tests completed, 1 failed                                  
There were failing tests. See the report at: file:///Users/hcpl/Development/git/MyTestedApplication/app/build/test-report/debug/index.html
:app:test                      

BUILD SUCCESSFUL

استكشاف الأخطاء وإصلاحها

الدلائل مصدر بديل

مثلما يمكنك الحصول على ملفات مصدر Java في مكان آخر ، يمكنك نقل ملفات مصدر الاختبار الخاصة بك. فقط قم بتحديث التهيئة sourceSets config.

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            Java.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        androidTest {
            setRoot('tests')
        }
    }

الحزمة org.junit غير موجود

نسيت إضافة تبعية اختبار junit في البرنامج النصي لإنشاء التطبيق

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    androidTestCompile 'org.robolectric:robolectric:2.3'
    androidTestCompile 'junit:junit:4.10'
}

Java.lang.RuntimeException: كعب الروتين!

أنت تجري هذا الاختبار باستخدام تكوينات التشغيل من Android Studio بدلاً من سطر الأوامر (علامة تبويب المحطة الطرفية في Android Studio). لتشغيله من Android Studio ، يجب عليك تحديث ملف app.iml ليتم إدراج إدخال jdk في الأسفل. انظر مثال deckard-gradle للحصول على تفاصيل.

مثال الخطأ الكامل:

!!! JUnit version 3.8 or later expected:

Java.lang.RuntimeException: Stub!
    at junit.runner.BaseTestRunner.<init>(BaseTestRunner.Java:5)
    at junit.textui.TestRunner.<init>(TestRunner.Java:54)
    at junit.textui.TestRunner.<init>(TestRunner.Java:48)
    at junit.textui.TestRunner.<init>(TestRunner.Java:41)
    at com.intellij.rt.execution.junit.JUnitStarter.junitVersionChecks(JUnitStarter.Java:190)
    at com.intellij.rt.execution.junit.JUnitStarter.canWorkWithJUnitVersion(JUnitStarter.Java:173)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.Java:56)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.Java:134)

خطأ: تم تعيين Java_HOME إلى دليل غير صالح

انظر هذا SO السؤال للحصول على حل. أضف التصدير أدناه لك bash profile:

export Java_HOME=`/usr/libexec/Java_home -v 1.7`  

سجل الأخطاء الكامل:

ERROR: Java_HOME is set to an invalid directory: export Java_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home

Please set the Java_HOME variable in your environment to match the
location of your Java installation.

اختبار فئة غير موجود

إذا كنت ترغب في تشغيل الاختبارات الخاصة بك من عداء Android Studio Junit Test ، فستضطر إلى توسيع ملف build.gradle أكثر قليلاً حتى يتمكن Android Studio من العثور على فئات الاختبار المترجمة:

sourceSets {
    testLocal {
        Java.srcDir file('src/test/Java')
        resources.srcDir file('src/test/resources')
    }
}

Android {

    // tell Android studio that the instrumentTest source set is located in the unit test source set
    sourceSets {
        instrumentTest.setRoot('src/test')
    }
}

dependencies {

    // Dependencies for the `testLocal` task, make sure to list all your global dependencies here as well
    testLocalCompile 'junit:junit:4.11'
    testLocalCompile 'com.google.Android:android:4.1.1.4'
    testLocalCompile 'org.robolectric:robolectric:2.3'

    // Android Studio doesn't recognize the `testLocal` task, so we define the same dependencies as above for instrumentTest
    // which is Android Studio's test task
    androidTestCompile 'junit:junit:4.11'
    androidTestCompile 'com.google.Android:android:4.1.1.4'
    androidTestCompile 'org.robolectric:robolectric:2.3'

}

task localTest(type: Test, dependsOn: assemble) {
    testClassesDir = sourceSets.testLocal.output.classesDir

    Android.sourceSets.main.Java.srcDirs.each { dir ->
        def buildDir = dir.getAbsolutePath().split('/')
        buildDir =  (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')

        sourceSets.testLocal.compileClasspath += files(buildDir)
        sourceSets.testLocal.runtimeClasspath += files(buildDir)
    }

    classpath = sourceSets.testLocal.runtimeClasspath
}

check.dependsOn localTest

من: http://kostyay.name/Android-studio-robolectric-gradle-getting-work/

بعض المزيد من الموارد

أفضل المقالات التي وجدت حولها هي:

32
hcpl

يتم دعم هذا الآن في Android Studio بدءًا من Android Gradle plugin 1.1.0 ، تحقق من ذلك:

https://developer.Android.com/training/testing/unit-testing/local-unit-tests.html

نموذج التطبيق مع اختبارات الوحدة المحلية على جيثب:

https://github.com/googlesamples/Android-testing/tree/master/unittesting/BasicSample

4
Lorenzo Polidori

لـ Android Studio 1.2+ / إعداد مشروع لـ JUnit بسيط جدًا حاول اتباع هذا البرنامج التعليمي:

هذا هو أبسط جزء إعداد مشروع لـ JUnit:

https://io2015codelabs.appspot.com/codelabs/Android-studio-testing#1

اتبع الرابط السابق حتى " تشغيل اختباراتك "

الآن إذا كنت تريد الاندماج مع اختبار intrumentation ، فاتبع من هنا:

https://io2015codelabs.appspot.com/codelabs/Android-studio-testing#6

1
CommonSenseCode

يرجى الاطلاع على هذا البرنامج التعليمي من الموقع الرسمي لمطوري Android. يوضح هذا المقال أيضًا كيفية إنشاء نماذج للاختبار.

بالمناسبة ، يجب أن تلاحظ أن نطاق التبعيات لاختبار JUnit البسيط يجب أن يكون "testCompile".

0
BlueMice