如何在Android Studio中创建测试?

时间:2013-05-16 11:38:05

标签: android unit-testing intellij-idea android-studio

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

如何创建测试?

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

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

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

12 个答案:

答案 0 :(得分:43)

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

Android测试简介

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

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

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

enter image description here

一切都已经存在,等着你去创建测试。这一切都已经建立好了!

如何创建本地单元测试

打开上图中显示的ExampleUnitTest文件。看起来应该是这样的:

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

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

enter image description here

它应该通过(只要2 + 2在您阅读此答案时仍为4)。恭喜你,你刚刚进行了第一次测试!

进行自己的测试

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

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

现在将测试类中的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);
    }
}

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

如何创建检测测试

打开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());
    }
}

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

enter image description here

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

进行自己的测试

检测测试使用Espresso来运行测试。它有点像你自己的小机器人用户,你可以测试你的应用程序。你可以告诉它做一些事情,比如按下按钮或阅读TextView的属性。

您可以手动编写如何进行测试的说明,但由于我们刚刚开始,所以让我们使用auto-record function。这很简单。

首先在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> 

然后按运行&gt;在菜单中记录Espresso测试

enter image description here

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

@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());
    }
}

大!你刚刚创建了第一个仪器化测试!这太简单了。你应该添加一个断言来使它成为一个真正的测试,但这对录音机来说也很容易。请注意this video更深入。

进一步研究

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

答案 1 :(得分:36)

编辑:截至0.1.8 this is now supported in the IDE。请按照其中的说明操作,而不要使用下面的说明。

Android Gradle Plugin User Guide之后,通过在新创建的项目上执行以下步骤,我能够在命令行上进行测试(我使用了默认的'com.example.myapplication'包):

  1. 为测试添加src / instrumentTest / java目录
  2. 在com.example.myapplication.test包中添加测试类(扩展ActivityTestCase)
  3. 启动虚拟设备
  4. 在命令行上(在MyApplicationProject / MyApplication目录中)使用命令'../gradlew connectedInstrumentTest'
  5. 这运行了我的测试并将测试结果放在MyApplicationProject / MyApplication / build / reports / instrumentTests / connected中。我是测试Android应用程序的新手,但似乎工作正常。

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

    1. 更新build.gradle以将Maven Central列为回购
    2. 更新build.gradle将JUnit 3.8添加为instrumentTestCompile依赖项,例如instrumentTestCompile'junit:junit:3.8'
    3. 在“项目结构”中,手动将JUnit移动到依赖顺序中的第一个
    4. 但是这会失败(运行测试时使用的类路径缺少测试输出目录)。但是,我不确定这是否会奏效,因为我的理解是需要特定于Android的测试运行器。

答案 2 :(得分:20)

我建议使用 gradle.build 文件。

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

    < / LI>
  2. 打开 gradle.build 文件并指定:

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

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

答案 3 :(得分:12)

我认为Rex St John的this post对于使用android studio进行单元测试非常有用。

http://rexstjohn.com/wp-content/uploads/2014/01/Screen-Shot-2014-01-24-at-6.26.20-PM-300x137.png

答案 4 :(得分:9)

Android Studio v.2.3.3

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

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

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

答案 5 :(得分:7)

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

Tests structure

答案 6 :(得分:4)

Android Studio不断发展,因此上述回复最终将不再适用。对于当前版本的Android Studio 1.2.1.1,有一个很好的测试教程:

http://evgenii.com/blog/testing-activity-in-android-studio-tutorial-part-1/

答案 7 :(得分:3)

其中一个主要变化是,在Android Studio中,测试应用程序已集成到应用程序项目中。

我不确定这是否有助于解决您的具体问题,但我找到了使用Gradle项目进行测试的指南。 Android Gradle user Guide

答案 8 :(得分:3)

我发现最简单的方法是精简my following blog post

  1. 创建一个文件夹,您可以在其中编写所有单元测试(最好是com.example.app.tests)
  2. 创建一个新的测试类(最好是NameOfClassTestedTests,即BankAccountLoginActivityTests)
  3. 扩展InstrumentationTestCase
  4. 编写失败的单元测试以确保我们成功配置单元测试
  5. 请注意,单元测试方法名称必须以单词“test”开头(最好是testTestedMethodNameExpectedResult(),即testBankAccountValidationFailedShouldLogout())
  6. 为单元测试配置项目:
  7. 打开&#39;运行...&#39;菜单,然后点击“编辑配置”
  8. 点击+按钮
  9. 选择Android测试模板
  10. 输入运行配置的名称(最好是&#39; AppName测试&#39;)
  11. 在模块组合框中选择您的应用
  12. 选择“All In Package”单选按钮(通常您要选择此选项,因为它会在所有测试类中运行所有单元测试)
  13. 填写步骤1中的测试包名称(即com.example.app.tests)
  14. 选择您希望在
  15. 上运行测试的设备
  16. 应用并保存配置
  17. 运行单元测试(并期望失败):
  18. 从“运行”菜单中选择新创建的“测试”配置
  19. 单击“运行”并在输出控制台中读取结果
  20. 祝您好运,使您的代码更易读,可维护且经过充分测试!

答案 9 :(得分:2)

Android Studio一直是一个移动目标,首先是开发者预览,现在处于测试阶段。 项目中Test类的路径在时间内已更改,但无论您使用的是哪个AS版本,路径都在.iml文件中声明。目前,对于0.8.3版本,您将在内部iml文件中找到以下内容:

      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/groovy" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />

.iml文件告诉您放置测试类的位置。

答案 10 :(得分:2)

从Android Studio 1.1开始,我们已经获得了编写单元测试(Roboelectric工作)的官方(实验性)支持。

来源:https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support

答案 11 :(得分:0)

在gradle文件中添加以下lib

 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

在androidTest目录中创建类HomeActivityTest,并在运行测试之前在字符串资源文件中添加flurry_api_key和sender_id字符串,并更改失败和成功案例的值。

@RunWith(AndroidJUnit4.class)
public class HomeActivityTest
{
    private static final String SENDER_ID = "abc";
    private static final String RELEASE_FLURRY_API_KEY = "xyz";

    @Test
    public void gcmRegistrationId_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(SENDER_ID, appContext.getString(R.string.sender_id));
    }

    @Test
    public void flurryApiKey_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(RELEASE_FLURRY_API_KEY, appContext.getString(R.string.flurry_api_key));
    }
}