2015-05-08 119 views
2

我已經查看了堆棧上的所有問題,我發現有類似的問題,但沒有人給我一個實際可行的答案(https://stackoverflow.com/search?q=espresso+empty+test+suite)。Espresso 2.1沒有找到我的測試

我有一個簡單的項目,我想嘗試意式濃縮咖啡。我的類文件看起來是這樣的:

package com.example.myapplication; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class FirstActivity extends Activity implements View.OnClickListener { 

    Button mClickMeButton; 
    TextView mHelloWorldTextView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 

     setupView(); 
    } 

    private void setupView() { 
     mHelloWorldTextView = (TextView) findViewById(R.id.helloWorldTextView); 
     mHelloWorldTextView.setText(getTitleText()); 
     mClickMeButton = (Button) findViewById(R.id.clickMeBtn); 
     mClickMeButton.setOnClickListener(this); 
    } 

    private String getTitleText() { 
     return "First Activity"; 
    } 

    @Override 
    public void onClick(View v) { 
     Intent intent = new Intent(this, SecondActivity.class); 
     startActivity(intent); 
    } 
} 

我的測試文件是這樣的:

package com.example.myapplication.test; 

import android.graphics.Bitmap; 
import android.test.ActivityInstrumentationTestCase2; 
import android.test.suitebuilder.annotation.LargeTest; 
import android.test.suitebuilder.annotation.SmallTest; 

import static android.support.test.espresso.Espresso.onView; 
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; 
import static android.support.test.espresso.matcher.ViewMatchers.withText; 

import com.example.myapplication.BuildConfig; 
import com.example.myapplication.FirstActivity; 

@RunWith(AndroidJUnit4.class) 
@SmallTest 
public class FirstActivityTest extends ActivityInstrumentationTestCase2<FirstActivity> { 

    public FirstActivityTest() { 
     super(FirstActivity.class); 
    } 

    @Override 
    public void setUp() throws Exception { 
     super.setUp(); 
     getActivity(); 
    } 

    @Test 
    public void testListGoesOverTheFold() { 
     onView(withText("First Activity")).check(matches(isDisplayed())); 
    } 
} 

和像這樣的build.gradle:

apply plugin: 'com.android.application' 
apply plugin: 'jacoco' 
apply plugin: "sonar-runner" 
apply plugin: 'spoon' 

android { 
    compileSdkVersion 21 
    buildToolsVersion '22.0.1' 

    packagingOptions { 
     exclude 'LICENSE.txt' 
    } 

    defaultConfig { 
     applicationId "com.example.myapplication" 
     minSdkVersion 14 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 

     testApplicationId "com.example.myapplication.test" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 

    buildTypes { 
     debug { 
      testCoverageEnabled true 
     } 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    dependencies { 
     testCompile 'org.easytesting:fest:1.0.16' 
     testCompile 'junit:junit:4.12' 
     testCompile 'org.robolectric:robolectric:2.4' 
     testCompile 'com.squareup:fest-android:1.0.8' 

     androidTestCompile 'com.squareup.spoon:spoon-client:1.1.9' 
     androidTestCompile 'com.android.support.test:runner:0.2' 
     androidTestCompile 'com.android.support.test:rules:0.2' 
     androidTestCompile('com.android.support.test.espresso:espresso-core:2.1') { 
      exclude group: 'javax.inject' 
     } 
    } 

    spoon { 
     debug = true 
     //devices = ['333236E9AE5800EC'] 
     if (project.hasProperty('spoonClassName')){ 
      className = project.spoonClassName 
     } 
    } 
} 

def coverageSourceDirs = [ 
     '../app/src/main/java', 'src/gen' 
] 


task jacocoTestReport(type: JacocoReport, dependsOn: "testDebug") { 
    group = "Reporting" 
    description = "Generate Jacoco coverage reports after running tests." 
    reports { 
     xml.enabled = true 
     html.enabled = true 
    } 

    classDirectories = fileTree(
      dir: './build/intermediates/classes/debug', 
      excludes: ['**/R.class', 
         '**/R$*.class' 
      ]) 
    sourceDirectories = files(coverageSourceDirs) 
    executionData = files('build/jacoco/testDebug.exec') 
} 
} 

每次我嘗試運行它,我得到:

Testing started at 16:57 ... 
Target device: genymotion-google_nexus_5___5_0_0___api_21___1080x1920-192.168.56.101:5555 
Uploading file 
    local path: /Users/pernillauhlin/development/pingdom/android-robolectric-test/app/build/outputs/apk/app-debug.apk 
    remote path: /data/local/tmp/com.example.myapplication 
No apk changes detected. Skipping file upload, force stopping package instead. 
DEVICE SHELL COMMAND: am force-stop com.example.myapplication 
Uploading file 
    local path: /Users/pernillauhlin/development/pingdom/android-robolectric-test/app/build/outputs/apk/app-debug-androidTest-unaligned.apk 
    remote path: /data/local/tmp/com.example.myapplication.test 
No apk changes detected. Skipping file upload, force stopping package instead. 
DEVICE SHELL COMMAND: am force-stop com.example.myapplication.test 
Running tests 
Test running startedTest running failed: Unable to find instrumentation info for: ComponentInfo{com.example.myapplication.test/android.test.InstrumentationTestRunner} 
Empty test suite. 

我的結構是:

enter image description here

此外,從命令運行勺子給我相同的結果。所以,我的問題是:

  • 我錯過了什麼?
  • 測試註釋;在測試之前,我已經看到了許多變化,上課時間,等等。什麼是正確的方法?或者你可以在課前指定@LargeTest,在實際的測試方法之前指定@SmallTest?

編輯:

我的運行配置是這樣的:

它看起來像android.support.test.runner.AndroidJUnitRunner不存在。

構建變量:

enter image description here

+1

在Android Studio中,轉到'Build Variants'並在'Test Artifact'中選擇'Android Instrumentation Tests'。 –

+0

我已經有選擇。 – peuhse

回答

4

我設法通過在測試配置設置錯誤android.test.InstrumentationTestRunner重現你的情況。

我建議檢查一下您是否有正確的 - android.support.test.runner.AndroidJUnitRunner - (或無)在中指定運行菜單|編輯配置。另外,你的問題的標題有點令人困惑,因爲從構建gradle依賴關係,我的理解是,你實際上是爲了Espresso 2.1。如果是這樣,請注意:

像ActivityInstrumentationTestCase2或ServiceTestCase這樣的測試用例已被棄用,以支持ActivityTestRule或ServiceTestRule。

,因爲它也可以看出herehere,註釋在以下方式中使用:更多關於(將調整過時的測試類只是因爲我很漂亮)

//annotate JUnit4 test classes with 
@RunWith(AndroidJunit4.class) 
@LargeTest 
public class FirstActivityTest { 

//use the following annotation and declare an ActivityTestRule for your activity under test 
@Rule 
public ActivityTestRule<FirstActivity> mActivityRule = new ActivityTestRule(FirstActivity.class); 

//use @Before to setup your test fixture 
@Before 
public void setUp() { ... } 

//annotate all test methods with 
@Test 
public void testHelloWorld() { ... } 

//release resources by using 
@After 
public void tearDown() { ... } 
} 

Rules

其他偉大的地方,瞭解更多關於test size annotations

+0

我確實有正確的一個,即使它看起來無效('runner'變紅,就像它不能識別跑步者一樣),請參閱上面的Edit。還更新了標題。我要去遵守規則,我只是希望它在我做之前就開始工作。偶爾也會發生在我身上的 – peuhse

+0

。 嘗試重新啓動AS或無效緩存/重新啓動。 – appoll

+0

這也沒有效果。我已經在這裏上傳了這個項目:https://www.dropbox.com/s/0majnbk2ebgor91/android-robolectric-test.zip?dl=0如果你想看看它。 Android Studio項目。 – peuhse

0

也許這將幫助別人的未來:如果安裝Android系統時出現「設備上沒有剩餘空間」的錯誤,則必須重新安裝所有設備。

(如果在安裝過程中您的磁盤不是滿快滿的,不讀它。)

我也有類似的問題,在測試中無法運行。原因是宣佈的Android工作室內存需求不包括測試所需的組件。 (順便說一句,你不僅需要2G,而且還需要在主目錄中的/tmp 2G中使用2G)。現在,當磁盤內存耗盡時,會得到一個不起作用的安裝。清除一些額外的空間並重新運行安裝程序後,它仍然不起作用。你必須刪除所有東西,清除~/.AndroidStudio1.5(因爲刪除軟件後它只會浪費寶貴的空間),然後重新安裝。 (很可能,他們下載.zip文件並且不檢查結果,即使他們認爲md5檢查過於複雜,他們仍然可以檢查文件的長度!但它們不會)

要在目錄中打印內存使用情況在Linux下,使用du -h -d 1(或du -h -d 2爲2個目錄級別,-h代表人類可讀)。

相關問題