使用 UI 测试用例在 android studio 中运行测试

Posted

技术标签:

【中文标题】使用 UI 测试用例在 android studio 中运行测试【英文标题】:Run Test in android studio with UI test cases 【发布时间】:2020-03-22 14:53:03 【问题描述】:

我正在尝试在我当前工作的应用程序中添加 UI 测试用例。 为此,我在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"
    

在 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"

但在编辑配置后仅运行测试类。 我收到错误:

    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

谁能帮我知道如何在我的应用程序中运行 UI 测试用例?

【问题讨论】:

您是否尝试过清理项目并重新构建它?还要使 Androi studio 失效并重启? 是的@SushantSomani 【参考方案1】:

添加线后:

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

我仍然面临同样的问题。然后我复制了那些创建 res/drawable 和 res/mipmap 的可绘制和 mipmap 文件,并将这些文件粘贴到文件夹中。 结果消除了 BuildConfig 错误。然后我开始面临错误:

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

要克服这个: select option "classpath file" 在测试配置设置中,它将运行测试。

【讨论】:

【参考方案2】:

从检测的测试用例ExampleInstrumentedTest 中,我找不到您在哪里启动了模拟用户操作的活动。请先尝试启动活动,然后执行测试用例。例如,如果您的活动是 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())
      
    

【讨论】:

@get:Rule val activityRule = activityScenarioRule() 添加了这个。但是在“命令行太长。缩短'testconfiguration'或Android JUnit默认配置的命令行”之后面临另一个问题 试试这个***.com/questions/47926382/…

以上是关于使用 UI 测试用例在 android studio 中运行测试的主要内容,如果未能解决你的问题,请参考以下文章

测试用例在 docker windows 控制台中使用 https 失败 vstest.console.exe

测试用例在完成 beforeAll 之前执行。?

有没有办法为 JUnit 测试用例在内存中运行 MySQL?

Boost.Interprocess:测试用例在编译时有或没有优化(GCC)会给出不同的结果

如何从 Swift 中每个 UI 测试断言的空核心数据开始?

为啥我的 Python 测试用例在这个编码挑战中失败了?