如何在Android Studio中创建测试?

Mar*_*tin 108 android unit-testing intellij-idea android-studio

刚刚下载了基于Intellij Idea的Android Studio.

如何创建测试?

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

我也尝试按热键CTRL + AlT + T,它允许在现有类上创建单元测试,但它似乎想将它放在当前项目中.当然这对TDD没有帮助

有没有人有这方面的经验?

Sur*_*gch 53

这个答案适用于刚刚开始使用Android测试的人.我将提供两个简单的示例来帮助您了解测试的工作原理.如果您在接下来的10分钟内继续学习,那么您将全部开始将测试添加到您自己的应用中.我想你会感到很惊讶它是多么容易.我当然是.

Android测试简介

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

  • 本地单元测试.它们在JVM(Java虚拟机)上本地运行.因为它们是本地的,所以它们很快.您可以使用它们来测试只需要Java而不是Android API的代码部分.(有时你可以做一个假API对象在本地测试更多的事情.这就是所谓的嘲讽.有模拟的Context是一个例子.)
  • 仪器化测试.这些测试在真实设备或仿真器上运行.这使得它们比本地测试慢.但是,它们更灵活,因为您可以使用完整的Android API.

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

在此输入图像描述

一切都已存在,等待您创建测试.这一切都已经建立好了!

如何创建本地单元测试

打开ExampleUnitTest上图中显示的文件.它应该看起来像这样:

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

它应该通过(只要你2 + 2还在4阅读这个答案时).恭喜你,你刚刚进行了第一次测试!

做自己的测试

让我们编写自己的测试.首先将此类添加到主应用程序项目中,以便我们测试一些内容:

public class MyClass {
    public int add(int a, int b) {
        return a + b;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在addition_isCorrect()将测试类中的方法更改为类似下面的代码(或者只是添加另一个具有不同名称的方法):

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

再次运行它,你应该看到它通过.恭喜,您刚刚创建了自己的第一个测试!(好吧,我觉得从技术上说它是我的,但是,嘿,足够接近.我的是你的.)

如何创建检测测试

打开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());
    }
}
Run Code Online (Sandbox Code Playgroud)

再次按下其中一个绿色按钮.

在此输入图像描述

只要您连接了真实设备或设置了仿真器,就应该启动它并运行您的应用程序.恭喜你,你刚刚进行了第一次仪器测试!

做自己的测试

仪表化测试使用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> 
Run Code Online (Sandbox Code Playgroud)

然后在菜单中按Run> Record Espresso Test.

在此输入图像描述

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

@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());
    }
}
Run Code Online (Sandbox Code Playgroud)

大!你刚刚创建了第一个仪器化测试!这太简单了.你应该添加一个断言来使它成为一个真正的测试,但这对录音机来说也很容易.观看此视频会更深入一些.

进一步研究

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


小智 36

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

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

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

这运行了我的测试并将测试结果放在MyApplicationProject/MyApplication/build/reports/instrumentTests/connected中.我是测试Android应用程序的新手,但似乎工作正常.

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

  1. 更新build.gradle以将Maven Central列为repo
  2. 更新build.gradle将JUnit 3.8添加为instrumentTestCompile依赖项,例如instrumentTestCompile'junit:junit:3.8'
  3. 在"项目结构"中,手动将JUnit移动到依赖顺序中的第一个

但是这会失败(运行测试时使用的类路径缺少测试输出目录).但是,我不确定这是否可行,因为我的理解是需要Android特定的测试运行器.


Yur*_*hov 20

我建议使用gradle.build文件.

  1. 为测试添加src/androidTest/java目录(比如Chris开始解释)

  2. 打开gradle.build文件并在那里指定:

    android {
    
        compileSdkVersion rootProject.compileSdkVersion
        buildToolsVersion rootProject.buildToolsVersion
    
        sourceSets {
    
            androidTest {
                java.srcDirs = ['androidTest/java']
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 按"与Gradle文件同步项目"(在顶部面板中).你现在应该看到一个文件夹"java"(在"androidTest"里面)是一个绿色.

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

  • 请阅读此处的文档:http://tools.android.com/tech-docs/new-build-system.从版本0.9.0起**instrumentTest**被重命名为**androidTest**. (7认同)
  • 在当前的Android Studio版本中,没有必要,更多 - 用**androidTest**替换名称**instrumentTest**的所有内容 (3认同)

Hyp*_*ems 10

Android Studio v.2.3.3

突出显示要测试的代码上下文,并使用热键:CTRL+ SHIFT+T

使用对话框界面完成设置.

测试框架应该镜像您的项目包布局以获得最佳结果,但您可以手动创建自定义测试,前提是您具有正确的目录和构建设置.


Dab*_*ber 7

截至目前(工作室0.61)维持适当的项目结构就足够了.无需像eclipse中那样创建单独的测试项目(见下文).

测试结构


Kag*_*age 3

主要变化之一似乎是使用 Android Studio 将测试应用程序集成到应用程序项目中。

我不确定这是否对您的具体问题有帮助,但我找到了有关使用 Gradle 项目进行测试的指南。 Android Gradle 用户指南