当前位置: 首页 > 知识库问答 >
问题:

如何在Android Studio中创建测试?

袁致远
2023-03-14

刚刚下载了基于智能理念的Android Studio。

如何创建测试?

我注意到有一个创建测试模块选项,但是这似乎没有做任何事情,只是用src创建一个新的项目

我还试着按下热键CTRL-AlTT,它允许在现有类上创建单元测试,但它似乎希望将其放在当前项目中。当然,这对TDD没有帮助

有人在这里有经验吗?

共有3个答案

宓茂才
2023-03-14

我建议使用gradle.build文件。

>

  • 为测试添加一个 src/Android测试/java 目录(就像克里斯开始解释的那样)

    打开分级机。生成文件并在其中指定:

    android {
    
        compileSdkVersion rootProject.compileSdkVersion
        buildToolsVersion rootProject.buildToolsVersion
    
        sourceSets {
    
            androidTest {
                java.srcDirs = ['androidTest/java']
            }
        }
    }
    

    按“使用Gradle文件同步项目”(在顶部面板)。您现在应该会看到一个文件夹“java”(在“androidTest”内)是绿色的。

    现在,您可以在那里创建任何测试文件并执行它们。

  • 潘宪
    2023-03-14

    编辑:从 0.1.8 开始,IDE 现在支持此功能。请按照其中的说明进行操作,而不是使用下面的说明。

    遵循Android Gradle Plugin用户指南,我能够通过在新创建的项目上执行以下步骤,在命令行上进行测试(我使用了默认的“com.example.myapplication”包):

    1. 为测试添加src/instrumentTest/java目录
    2. 在com.example.myapplication包中添加一个测试类(扩展ActivityTestCase)。测试
    3. 启动虚拟设备
    4. 在命令行(在MyApplicationProject/MyApplication目录中)上,使用命令“../gradlew connectedInstrumentTest”

    这将运行我的测试,并将测试结果放在MyApplicationProject/MyApplication/build/reports/instrumentTests/connected中。我刚开始测试Android应用程序,但它似乎工作得很好。

    在IDE中,可以尝试运行相同的测试类。您需要

    1. 更新build.gradle将Maven Central列为回购
    2. 更新build.gradle添加JUnit 3.8作为InstrentTestCompile依赖项,例如InstrentTestCompile'junit: junit: 3.8'
    3. 在“项目结构”中手动将JUnit移动到依赖项顺序的第一位

    但是这失败了(运行测试时使用的类路径缺少测试输出目录)。但是,我不确定这是否有效,因为我的理解是需要特定于Android的测试运行程序。

    袁宜
    2023-03-14

    这个答案适用于刚开始Android测试的人。我将提供两个简单的例子来帮助您了解测试是如何工作的。如果你在接下来的10分钟内继续学习,你将做好准备,开始将测试添加到自己的应用程序中。我想你会惊讶于这是多么容易。我当然是。

    您将进行两种不同类型的测试。

      < li >本地单元测试。这些都在本地JVM (Java虚拟机)上运行。因为他们是本地人,所以速度很快。您可以使用它们来测试只需要Java而不需要Android APIs的代码部分。(有时候可以做一个假的API对象在本地测试更多的东西。这叫嘲讽。模拟< code >上下文就是一个例子。) < li >仪器测试。这些测试在真实设备或仿真器上运行。这使得它们比本地测试要慢。然而,它们更加灵活,因为您可以使用完整的Android API。

    创建一个新项目,您将看到以下默认文件夹。

    一切都已经准备好了,等待你去创建你的测试。都已经设置好了!

    打开上图中所示示例单元测试文件。它应该看起来像这样:

    public class ExampleUnitTest {
        @Test
        public void addition_isCorrect() throws Exception {
            assertEquals(4, 2 + 2);
        }
    }
    

    按双绿色箭头运行所有测试,或按单绿色箭头只运行一个测试。(在这种情况下,只有一个测试,所以它们都做同样的事情。)

    它应该通过(只要2 2仍然是4,当你阅读这个答案)。恭喜,您刚刚运行了第一个测试!

    做你自己的测试

    让我们编写自己的测试。首先将这个类添加到您的主应用程序项目中,这样我们就有东西可以测试了:

    public class MyClass {
        public int add(int a, int b) {
            return a + b;
        }
    }
    

    现在,将test类中的< code > addition _ is correct()方法更改为类似下面的代码(或者只是添加另一个具有不同名称的方法):

    public class ExampleUnitTest {
        @Test
        public void addition_isCorrect() throws Exception {
            MyClass myClass = new MyClass();
            int result = myClass.add(2, 2);
            int expected = 4;
            assertEquals(expected, result);
        }
    }
    

    再次运行它,你应该看到它通过。恭喜,您刚刚创建了自己的第一个测试!(嗯,我想从技术上讲它是我的,但是,嘿,足够接近。我的是你的。

    打开ExampleInstrumentedTest文件。它应该看起来像这样:

    @RunWith(AndroidJUnit4.class)
    public class ExampleInstrumentedTest {
        @Test
        public void useAppContext() throws Exception {
            // Context of the app under test.
            Context appContext = InstrumentationRegistry.getTargetContext();
    
            assertEquals("com.example.myapp", appContext.getPackageName());
        }
    }
    

    再按一个绿色按钮。

    只要你连接了真正的设备或设置了模拟器,它就应该启动并运行你的应用程序。祝贺您,您刚刚完成了第一次测试!

    做你自己的测试

    检测测试使用Espresso来运行测试。这有点像你自己的小机器人用户,你可以测试你的应用程序。您可以告诉它执行一些操作,例如按下按钮或读取 TextView 的属性。

    您可以手动编写如何进行测试的说明,但由于我们刚刚开始,让我们使用自动记录功能。这非常简单。

    首先向你的 UI 添加一个按钮,以便我们有一些可以使用的东西。我这样做了:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.myapp.MainActivity">
    
        <Button
            android:id="@+id/myButton"
            android:text="Click me"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    
    </android.support.constraint.ConstraintLayout> 
    

    然后按运行

    启动后,单击模拟器中的按钮,然后完成在“录制”对话框中选择“确定”。它应该自动生成以下测试代码。

    @LargeTest
    @RunWith(AndroidJUnit4.class)
    public class MainActivityTest {
    
        @Rule
        public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);
    
        @Test
        public void mainActivityTest() {
            ViewInteraction appCompatButton = onView(
                    allOf(withId(R.id.myButton), withText("Click me"), isDisplayed()));
            appCompatButton.perform(click());
        }
    }
    

    太好了!你刚刚创建了你的第一个仪器测试!这非常简单。你可能应该添加一个断言来使它成为一个真正的测试,但是用记录器也很容易做到这一点。看这个视频深入一点。

    我会先看视频,然后通读文档。这一切都很有帮助。最后一个链接是一系列文章,涵盖了在选择测试内容时需要考虑的一些重要事项。

    • Android测试模式(Android开发人员的短视频系列)
    • 测试入门(Android文档)
    • 通过TDD实现代码质量的三个步骤
     类似资料:
    • 我是一个使用V13的情报人员。 我有一个简单的java项目(默认)结构,如下所示: 现在,我想编写一个简单的测试,并将代码放在/src/test/java目录中。所以我决定更改我的项目格式,使其看起来像: 创建该结构后,我显然希望将src中的当前类移到main/java/com...结构。 如果我在根目录中创建了一个新目录,我可以选择将目录标记为测试源根目录,但它仍然挂在根目录上,如下所示: 有人

    • 问题内容: 我是使用v13的Intellij新手。 我有一个简单的java项目(默认)结构,如下所示: 现在,我想编写一个简单的测试,并将该代码放在/ src / test / java目录中。因此,我决定更改项目格式,使其看起来像: 创建该结构后,我显然想将src中的当前类移至main / java / com …结构。 我已经阅读了所有有关内容根源和项目结构的内容。该信息甚至指出:“可以将内容

    • 问题内容: 我想使用JUnit 4创建一个junit测试套件,在运行测试套件之前,要包含的测试类的名称是未知的。 在JUnit 3中,我可以这样做: 并让该方法确定要运行的测试类。 在JUnit 4中,文档说要使用批注:构建我的测试套件。有许多SO答案显示了如何执行此操作。不幸的是,我看到的示例似乎不允许传递动态生成的TestClasses列表。 这样的建议我必须继承我不想做的子类。 动态指定的测

    • 问题内容: 我一直在四处搜寻有关如何使用Swift 2.0为MapView制作MKCircle注释的良好解释,但我似乎找不到足够的解释。有人可以张贴一些示例代码来显示如何创建MKCircle批注吗?这是我用来制作地图并获取坐标的代码。 问题答案: 将展示有关如何使用xcode 8.3.3的swift 3在地图视图上创建圆形叠加层的分步方法 在您的主故事板文件中,将地图工具包视图拖到故事板的场景(视

    • 本文向大家介绍如何在C#中创建StringBuilder?,包括了如何在C#中创建StringBuilder?的使用技巧和注意事项,需要的朋友参考一下 要在C#中创建StringBuilder,代码如下- 示例 输出结果 这将产生以下输出- 示例 让我们看另一个例子- 输出结果 这将产生以下输出-

    • 本文向大家介绍如何在JavaFX中创建RadioMenuItem?,包括了如何在JavaFX中创建RadioMenuItem?的使用技巧和注意事项,需要的朋友参考一下 菜单是提供给用户的选项或命令的列表,通常菜单包含执行某些操作的项目。菜单的内容称为菜单项,菜单栏包含多个菜单。 JavaFx支持三种菜单项,即-检查菜单项,自定义菜单项和单选菜单项。 RadioMenuItem RadioMenuI