如何在Android Studio中创建测试?

118
刚刚下载了基于Intellij Idea的Android Studio。
如何创建测试?
我注意到有一个创建测试模块的选项,但这似乎没有任何作用,只是创建了一个带有src的新项目。
我还尝试按下热键CTRL+AlT+T,它允许在现有类上创建单元测试,但似乎想要将其放在当前项目中。当然,这对TDD没有帮助。
有人有经验吗?

2
我也尝试创建了一个测试项目。如果你像在Eclipse项目中一样使用Android命令行工具来做,那么会出现错误,因为它找不到AndroidManifest.xml文件。看起来Google需要更新他们的Android工具以处理Grundle项目。不过,我对Android测试还不熟悉,所以帮不了你=( - Kage
12个回答

64

这篇答案是为那些刚开始进行Android测试的人准备的。我会提供两个简单的例子来帮助您了解测试的工作原理。如果您跟随下面的步骤,您将能够在接下来的10分钟内设置好并开始添加测试到您自己的应用程序中。我相信你会惊讶于它有多么容易,我当时也是。

介绍 Android 测试

您将执行两种不同类型的测试:

  • 本地单元测试。这些测试在JVM(Java虚拟机)上本地运行。由于它们是本地的,所以速度很快。您可以使用它们来测试只需要Java而不需要Android API的代码部分。(有时您可以创建一个虚假的API对象来本地测试更多的内容。这称为mocking。例如,Mock 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());
    }
}

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

输入图像描述

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

创建您自己的测试

仪器测试使用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> 

然后在菜单中按下运行>记录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());
    }
}

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

进一步研究

我建议您先观看视频,然后再阅读文档。它们都非常有用。最后一个链接是一系列文章,介绍了选择测试内容时需要考虑的一些重要事项。


1
很好的回答@Suragch。简短的问题:在本地单元测试用例中,我应该把支持文件放在哪里?这很麻烦,但我很乐意将其从测试基础路径下的完整路径放入,但如果我在Android Studio中运行测试,则测试运行自_root_/app,但是如果我从Gradle命令行(或CI)运行,则为_root_。 (理想情况下,无论以哪种方式运行,我都想访问特定的“assets”文件夹)。 - mm2001
@mm2001,我写这个答案是为了学习如何进行测试,所以我甚至还没有像你一样进展那么远。如果你在我之前想到了解决办法,可以留个评论吗? - Suragch
我发现这个链接很有用:https://dev59.com/cl0b5IYBdhLWcg3wT_xr#42751502 - 它说创建一个名为test/resources的文件夹并在其中放置文件,例如test.txt,然后使用getClass().getClassLoader().getResource("test.txt")访问它们。我已经决定直接访问APK资源很可能是一个坏主意,所以我要通过将文件复制到构建步骤中进行测试,或者在外部更新过程中进行处理来解决这个问题。关于不同版本的Gradle还有一些问题,但我还没有面对过。 - mm2001

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测试运行器。


20

我建议使用gradle.build文件。

  1. 为测试添加一个src/androidTest/java目录(就像Chris开始解释的那样)

  2. 打开gradle.build文件并在其中指定:

    android {
    
        compileSdkVersion rootProject.compileSdkVersion
        buildToolsVersion rootProject.buildToolsVersion
    
        sourceSets {
    
            androidTest {
                java.srcDirs = ['androidTest/java']
            }
        }
    }
    
  3. 点击顶部面板上的“Sync Project with Gradle file”按钮。此时您应该会看到一个名为“java”的文件夹(位于“androidTest”内)变为绿色。

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


不要忘记 androidTest.setRoot('instrumentTest') - IgorGanapolsky
3
在当前的Android Studio版本中,不必要使用名为instrumentTest的一切,而应该改为使用androidTest。请注意,这只是翻译,并且没有任何额外的解释或信息返回。 - Yuriy Chernyshov
名称“instrumentTest”和“androidTest”完全是任意的。它们只是测试项目的目录名称。您也可以创建一个“tests”目录。此外,SDK中测试框架的包名称为android.test.InstrumentationTestCase。因此,我认为“instrument”或“instrumentation”仍然适合命名测试。请参见以下源代码:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/android/test/InstrumentationTestCase.java#InstrumentationTestCase - IgorGanapolsky
7
请阅读这里的文档:http://tools.android.com/tech-docs/new-build-system。 自版本0.9.0起,instrumentTest已更名为androidTest - Yuriy Chernyshov
1
@IgorGanapolsky 把文件夹命名为 androidTest 不是随意的。这样做是为了让文件夹变成绿色。 - clocksmith

12

12

Android Studio v.2.3.3

请高亮您要测试的代码,然后使用热键:CTRL+SHIFT+T

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

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


7

目前为止(studio 0.61),保持正确的项目结构就足够了,无需像eclipse中那样创建单独的测试项目(见下图)。

Tests structure


4

2
是的,AS不断发展,因此有人创建一篇关于尖端技术的文章,却从未提及适用的版本号,这是相当愚蠢的。唯一的线索是在底部的日期。 - Tom

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

问题是关于仪器测试的!我也有困难编写一些仪器测试。请参阅我的问题:https://dev59.com/jJTfa4cB1Zd3GeqPMR8O - Monica

3
似乎其中的一个主要变化是,在Android Studio中,测试应用程序已经集成到了应用项目中。
我不确定这是否有助于您特定的问题,但我找到了一份使用Gradle项目进行测试的指南。 Android Gradle用户指南

2

Android Studio一直是一个移动的目标,首先是开发者预览版,现在是beta版。 项目中测试类的路径随着时间的推移而改变,但无论您使用哪个版本的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文件告诉你放置测试类的位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接