1

I am trying to add UI test cases in my current working app. For that I have added this in app/src/androidtest/java/com.testapp

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.*
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith

/**
 * Instrumented test, which will execute on an Android device.
 *l
 * See [testing documentation](http://d.android.com/tools/testing).
 */
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {


    @Test
    fun loginActivityTest() {
// Type text and then press the button.
        onView(withId(R.id.editTextUserName)).perform(typeText(STRING_EMAIL),
                closeSoftKeyboard())
        onView(withId(R.id.editTextUserPassword)).perform(typeText(STRING_PASSWORD),
                closeSoftKeyboard())
        onView(withId(R.id.btnLoginSigin)).perform(click())

        // This view is in a different Activity, no need to tell Espresso.
//        onView(withId(R.id.show_text_view)).check(matches(withText(STRING_TO_BE_TYPED)))
    }

    companion object {
        val STRING_EMAIL = "test@test.com"
        val STRING_PASSWORD = "test1234"
    }
}

Added in build.gradle :

// Testing-only dependencies
androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
androidTestImplementation 'androidx.test:core:' + rootProject.coreVersion
androidTestImplementation 'androidx.test:core-ktx:' + rootProject.coreVersion
androidTestImplementation 'androidx.test.ext:junit:' + rootProject.extJUnitVersion
androidTestImplementation 'androidx.test.ext:junit-ktx:' + rootProject.extJUnitVersion
androidTestImplementation 'androidx.test:runner:' + rootProject.runnerVersion
androidTestImplementation 'androidx.test.espresso:espresso-core:' + rootProject.espressoVersion

testImplementation 'androidx.test:core:' + rootProject.coreVersion;
testImplementation 'androidx.test.ext:junit:' + rootProject.extJUnitVersion
testImplementation 'junit:junit:4.12'
testImplementation 'org.robolectric:robolectric:' + rootProject.robolectricVersion
testImplementation 'androidx.test.espresso:espresso-core:' + rootProject.espressoVersion
testImplementation 'androidx.test.espresso:espresso-intents:' + rootProject.espressoVersion
testImplementation 'androidx.test.ext:truth:' + rootProject.extTruthVersion


//Test
buildToolsVersion = "28.0.3"
androidxLibVersion = "1.0.0"
robolectricVersion = "4.3"
extTruthVersion = '1.3.0-alpha02'
coreVersion = "1.2.1-alpha02"
extJUnitVersion = "1.1.2-alpha02"
runnerVersion = "1.3.0-alpha02"
espressoVersion = "3.3.0-alpha02"

But after editing configuration to run test class only. I am getting error :

    Task :app:compileappnameqaDebugAndroidTestJavaWithJavac FAILED
F:\test_project\Android_new\app\build\generated\source\buildConfig\androidTest\debug\com\appname\test\BuildConfig.java:17: error: cannot find symbol
  public static final int appIcon = R.mipmap.ic_launcher;
                                     ^
  symbol:   variable mipmap
  location: class R
F:\test_project\Android_new\app\build\generated\source\buildConfig\androidTest\debug\test\com\appname\test\BuildConfig.java:23: error: cannot find symbol
  public static final int splashImage = R.drawable.splash;
                                         ^
  symbol:   variable drawable
  location: class R
2 errors

Can anyone please help me how to know how to run the UI test case in my app?

Apurva Kolapkar
  • 1,270
  • 2
  • 16
  • 32

2 Answers2

1

After Adding line :

@get:Rule val activityRule = activityScenarioRule<LoginActivity>()

Still I was facing same issue.Then I copied those drawable and mipmap files created res/drawable and res/mipmap and pasted those files in folders. Which in result removed the BuildConfig error. Then I started facing error :

Command line is too long. Shorten command line for 'testconfiguration' or also for Android JUnit default Configuration

To overcome this : select option "classpath file" in test Configuration setup, Which will run the test.

Apurva Kolapkar
  • 1,270
  • 2
  • 16
  • 32
0

From the instrumented test case ExampleInstrumentedTest, I cannot find where you have launched the activity wherein you are simulating user actions. Please try launching the activity first & then execute test case. For example if your activity is LoginActivity

    @RunWith(AndroidJUnit4.class)
    public class SampleTest {

      @Rule
      public ActivityTestRule<LoginActivity> activityRule 
         = new ActivityTestRule<>(
            LoginActivity.class,
            true,     // initialTouchMode
            false);   // launchActivity. False to customize the intent

      @Test
      public void loginActivityTest() {
        Intent intent = new Intent();
        activityRule.launchActivity(intent);

onView(withId(R.id.editTextUserName)).perform(typeText(STRING_EMAIL),
                closeSoftKeyboard())
        onView(withId(R.id.editTextUserPassword)).perform(typeText(STRING_PASSWORD),
                closeSoftKeyboard())
        onView(withId(R.id.btnLoginSigin)).perform(click())
      }
    }
Sushant Somani
  • 1,450
  • 3
  • 13
  • 31
  • @get:Rule val activityRule = activityScenarioRule() Added this. But facing another issue after that "Command line is too long. Shorten command line for 'testconfiguration' or also for Android JUnit default Configuration " – Apurva Kolapkar Nov 27 '19 at 08:16
  • try this https://stackoverflow.com/questions/47926382/how-to-configure-shorten-command-line-method-for-whole-project-in-intellij – Sushant Somani Nov 27 '19 at 08:28