Câu hỏi Chạy thử nghiệm JUnit đơn giản trên Android Studio (IntelliJ) khi sử dụng cấu hình dựa trên Gradle


tôi đang dùng Android Studio/IntelliJ để xây dựng trên một Android dự án và muốn thêm một số đơn giản JUnit kiểm tra đơn vị. Thư mục thích hợp để thêm các bài kiểm tra như vậy vào là gì?

Android Gradle trình cắm thêm định nghĩa cấu trúc thư mục với src/main/java cho mã nguồn chính và src/instrumentTest/java cho Android kiểm tra.

Cố gắng thêm các bài kiểm tra JUnit của tôi vào instrumentTest không hiệu quả với tôi. Tôi có thể chạy nó như một Android kiểm tra (đó là những gì mà thư mục có vẻ cho) nhưng đó không phải là những gì tôi đang tìm kiếm - Tôi chỉ muốn chạy một đơn giản JUnit kiểm tra. Tôi đã thử tạo cấu hình chạy JUnit cho Lớp này nhưng cũng không hoạt động - tôi giả sử vì tôi đang sử dụng thư mục được gắn cờ là Android Kiểm tra thay vì Nguồn.

Nếu tôi tạo một thư mục nguồn mới và đánh dấu nó như vậy trong Cấu trúc dự án, điều này sẽ bị xóa sổ lần sau IntelliJ làm mới cấu hình dự án từ các tệp xây dựng gradle.

Cách nào phù hợp hơn để cấu hình các bài kiểm tra JUnit trong một dự án android dựa trên gradle trên IntelliJ? Cấu trúc thư mục nào để sử dụng cho điều này?


76
2017-07-24 21:16


gốc


Thật không may tôi không thể giúp bạn với các bài kiểm tra như tôi vẫn đang đấu tranh với điều này bản thân mình, nhưng bạn có thể sử dụng điều này để ngăn chặn IntelliJ xóa các thư mục nguồn: java.srcDirs = ['src/main/java','src/instrumentTest/java'] bên trong sourceSets phần của build.gradle - Rob Holmes
Nó không vui vẻ để thiết lập, cũng không đơn giản để duy trì, nhưng tôi bằng cách nào đó có nó chạy bằng cách sử dụng mặc định /src/androidTest/java thư mục với các bài kiểm tra JUnit robolectric, xem: stackoverflow.com/a/25473702/1406325 - Flo
Android Studio hiện hỗ trợ Kiểm tra đơn vị cục bộ với JUnit 4: stackoverflow.com/a/30273301/885464 - Lorenzo Polidori
Cập nhật @Julian Cerruti: Android Studio Demo về cách chạy testcase goo.gl/ac06C0 và ví dụ để chạy kiểm tra cuộc gọi mạng goo.gl/bQFlmU - nitesh
Các cấu trúc thư mục cho các bài kiểm tra và các lớp thử nghiệm phải phù hợp. Dưới đây là cách thực hiện dễ dàng: stackoverflow.com/a/36057080/715269 - Gangnus


Các câu trả lời:


Kể từ Android Studio 1.1, câu trả lời giờ đây đơn giản: http://tools.android.com/tech-docs/unit-testing-support


22
2018-02-11 20:53



Điều này có nghĩa là Robolectric không còn hữu ích nữa? Điều này về cơ bản sẽ làm điều tương tự? - David Argyle Thacker
Lưu ý: Kể từ Android Studio 2.0 Beta5, trong liên kết mô tả công cụ chọn "Thử nghiệm tạo tác" bị thiếu và cả hai chế độ (junit & insttrumentation) được bật đồng thời theo mặc định. Xem ở đây để biết thêm stackoverflow.com/questions/35708263/… - for3st


Thông thường, bạn không thể. Chào mừng bạn đến với thế giới của Android, nơi tất cả các bài kiểm tra phải chạy trên một thiết bị (ngoại trừ Robolectric).

Lý do chính là bạn không thực sự có các nguồn của khung công tác - ngay cả khi bạn thuyết phục IDE chạy thử nghiệm cục bộ, bạn sẽ ngay lập tức nhận được một ngoại lệ "Stub! Not implemented". "Tại sao?" bạn có thể tự hỏi? Bởi vì android.jar mà SDK cung cấp cho bạn thực sự là tất cả được đưa ra - tất cả các lớp và các phương thức đều có nhưng tất cả chúng chỉ là một ngoại lệ. Nó có để cung cấp một API nhưng không có để cung cấp cho bạn bất kỳ thực hiện thực tế.

Có một dự án tuyệt vời được gọi là Robolectric thực hiện rất nhiều khung làm việc để bạn có thể chạy thử nghiệm có ý nghĩa. Cùng với một khuôn mẫu giả tốt (ví dụ: Mockito), nó giúp bạn quản lý công việc của mình.

Plugin Gradle: https://github.com/robolectric/robolectric-gradle-plugin


36
2017-07-24 22:01



Cảm ơn, Deylan. Tôi là những thử nghiệm đơn giản không sử dụng bất kỳ cơ sở hạ tầng Android nào, do đó, việc tạo dự án mới như bạn đề xuất hoặc chỉnh sửa cấu hình Android Gradle để phù hợp với kiểm tra thường xuyên sẽ là tuyến đường để đi. Thật không may tôi vẫn không thể làm cho nó hoạt động được - nó vẫn không thành công vì lý do này hay lý do khác - nhưng sẽ đăng kết quả nếu tôi làm cho nó hoạt động - Julian Cerruti
Trong trường hợp đó, bạn muốn tạo một dự án Gradle plain java mới (tức là apply plugin: 'java'), thêm nó vào 'settings.gradle', có nó như là một phụ thuộc vào dự án Android của bạn (compile project(':plainJavaProjectName')) và chỉ cần chạy test bài tập. (Chưa được kiểm tra nhưng chắc chắn nên hoạt động!) - Delyan
Các thử nghiệm trong một dự án gradle java đơn giản hoạt động tốt với dòng lệnh, nhưng không phải bên trong Android Studio, nơi tôi nhận được lỗi "class not found MyTestClass". Đó là lạ bởi vì AS và dòng lệnh nên sử dụng gradle theo cùng một cách. - lukas
Tránh gradle nếu bạn muốn sử dụng thử nghiệm JUnit, maven là một lựa chọn tốt hơn. - Jeroen
Bạn có thể biện minh cho tuyên bố đó không? Tại sao Maven tốt hơn? - RichieHH


Giới thiệu

Lưu ý rằng tại thời điểm viết robolectric 2.4 là phiên bản mới nhất và không hỗ trợ appcompat v7 thư viện. Hỗ trợ wil được thêm vào trong phiên bản robolectric 3.0 (chưa có ETA). Cũng thế ActionBar Sherlock có thể gây ra vấn đề với robolectric.

Để sử dụng Robolectric trong Android Studio, bạn có 2 tùy chọn:

(Tùy chọn 1) - Chạy thử nghiệm JUnit bằng Android Studio bằng mô-đun Java

Kỹ thuật này sử dụng một mô-đun java cho tất cả các bài kiểm tra của bạn với sự phụ thuộc vào mô-đun android của bạn và một người chạy thử nghiệm tùy chỉnh với một số phép thuật:

Hướng dẫn có thể được tìm thấy ở đây: http://blog.blundellapps.com/how-to-run-robolectric-junit-tests-in-android-studio/

Ngoài ra, hãy kiểm tra liên kết ở cuối bài đăng đó để chạy thử nghiệm từ studio android.

(Tùy chọn 2) - Chạy thử nghiệm JUnit bằng Android Studio bằng cách sử dụng trình bổ sung robolectric-gradle

Tôi đã gặp phải một số sự cố khi thiết lập các kiểm tra junit để chạy từ chế độ gradle trong Android Studio.

Đây là một dự án mẫu rất cơ bản để chạy thử nghiệm junit từ dự án dựa trên gradle trong Android Studio: https://github.com/hanscappelle/android-studio-junit-robolectric Điều này đã được thử nghiệm với Android Studio 0.8.14, JUnit 4.10, plugin khóa học robolectric 0.13+ và robolectric 2.3

Buildscript (project / build.gradle)

Kịch bản xây dựng là tệp build.gradle trong thư mục gốc của dự án của bạn. Tôi phải thêm trình cắm bổ sung robolectric đến 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()
    }
}

Project buildscript (Ứng dụng / build.gradle)

Trong tập lệnh xây dựng của mô-đun ứng dụng của bạn, hãy sử dụng robolectric plugin, thêm robolectric cấu hình và thêm androidTestCompile phụ thuộc.

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'
}

Tạo các lớp thử nghiệm JUnit

Bây giờ đặt các lớp thử nghiệm ở vị trí mặc định (hoặc cập nhật cấu hình gradle)

app/src/androidTest/java

Và đặt tên cho các lớp kiểm tra của bạn kết thúc bằng Test (hoặc một lần nữa cập nhật cấu hình), mở rộng junit.framework.TestCase và chú thích các phương pháp thử với @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;
    }
}

Thực hiện kiểm tra

Tiếp theo thực hiện các phép thử bằng cách sử dụng gradlew từ dòng lệnh (làm cho nó thực thi bằng cách sử dụng chmod +x Nếu cần thiết)

./gradlew clean test

Đầu ra mẫu:

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

Xử lý sự cố

thư mục nguồn thay thế

Cũng giống như bạn có thể có các tệp nguồn java của bạn ở một nơi khác, bạn có thể di chuyển các tệp nguồn thử nghiệm của mình. Chỉ cần cập nhật gradle sourceSets config.

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

        androidTest {
            setRoot('tests')
        }
    }

gói org.junit không tồn tại

Bạn quên thêm phụ thuộc kiểm tra junit trong tập lệnh xây dựng ứng dụng

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

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

java.lang.RuntimeException: Stub!

Bạn đang chạy thử nghiệm này với các cấu hình chạy từ Android Studio thay vì dòng lệnh (tab Thiết bị đầu cuối trong Android Studio). Để chạy ứng dụng từ Android Studio, bạn sẽ phải cập nhật app.iml tệp để có mục nhập jdk được liệt kê ở dưới cùng. Xem ví dụ điển hình để biết chi tiết.

Ví dụ về lỗi hoàn chỉnh:

!!! 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)

L ERI: JAVA_HOME được đặt thành thư mục không hợp lệ

Xem câu hỏi SO này cho một giải pháp. Thêm xuất dưới đây vào hồ sơ bash của bạn:

export JAVA_HOME=`/usr/libexec/java_home -v 1.7`  

Nhật ký lỗi hoàn chỉnh:

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.

Không tìm thấy lớp thử nghiệm

Nếu bạn muốn chạy thử nghiệm của mình từ Android Studio Junit Test runner thay vào đó, bạn sẽ phải mở rộng tệp build.gradle thêm một chút để studio android có thể tìm thấy các lớp thử nghiệm đã biên dịch của bạn:

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

từ: http://kostyay.name/android-studio-robolectric-gradle-getting-work/

Một số tài nguyên khác

Các bài viết hay nhất tôi tìm thấy xung quanh đây là:


32
2017-11-03 15:18





Tính năng này hiện được hỗ trợ trong Android Studio bắt đầu bằng plugin Android Gradle 1.1.0, hãy kiểm tra điều này:

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

Ứng dụng mẫu với các bài kiểm tra đơn vị cục bộ trên GitHub:

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


4
2018-05-16 08:07



Liên kết github không khả dụng - Rahul Hawge


Dành cho Android Studio 1.2+ thiết lập một dự án cho JUnit khá đơn giản cố gắng làm theo hướng dẫn này:

Đây là phần đơn giản nhất thiết lập một dự án cho JUnit:

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

Theo dõi liên kết trong quá khứ cho đến khi "Chạy thử nghiệm của bạn"

Bây giờ nếu bạn muốn tích hợp với thử nghiệm intrumentation theo dõi từ đây:

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


1
2017-09-09 00:50





Xin vui lòng xem này hướng dẫn từ trang web chính thức của Nhà phát triển Android. Bài viết này cũng cho thấy cách tạo mô hình cho thử nghiệm của bạn.

Nhân tiện, bạn nên lưu ý rằng phạm vi của các phụ thuộc cho thử nghiệm JUnit đơn giản nên là "testCompile".


0
2017-12-09 01:36