如何创建测试?
我注意到有一个创建测试模块的选项,但这似乎没有任何作用,只是创建了一个带有src的新项目。
我还尝试按下热键CTRL+AlT+T,它允许在现有类上创建单元测试,但似乎想要将其放在当前项目中。当然,这对TDD没有帮助。
有人有经验吗?
这篇答案是为那些刚开始进行Android测试的人准备的。我会提供两个简单的例子来帮助您了解测试的工作原理。如果您跟随下面的步骤,您将能够在接下来的10分钟内设置好并开始添加测试到您自己的应用程序中。我相信你会惊讶于它有多么容易,我当时也是。
您将执行两种不同类型的测试:
创建一个新项目,您将看到以下默认文件夹:
一切都已经准备好了,等待您创建测试。它已经全部设置好了!
打开上图中显示的 ExampleUnitTest
文件。它应该看起来像这样:
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;
}
}
现在更改测试类中的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测试。
开始后,点击模拟器中的按钮,然后在“记录”对话框上选择“确定”以完成。它应该会自动生成以下测试代码。
@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());
}
}
太好了!您刚刚创建了第一个被检测的测试!这非常简单。您可能应该添加一个断言,以使它成为真正的测试,但是使用录制器也很容易做到这一点。观看此视频,以深入了解。
我建议您先观看视频,然后再阅读文档。它们都非常有用。最后一个链接是一系列文章,介绍了选择测试内容时需要考虑的一些重要事项。
test/resources
的文件夹并在其中放置文件,例如test.txt
,然后使用getClass().getClassLoader().getResource("test.txt")
访问它们。我已经决定直接访问APK资源很可能是一个坏主意,所以我要通过将文件复制到构建步骤中进行测试,或者在外部更新过程中进行处理来解决这个问题。关于不同版本的Gradle还有一些问题,但我还没有面对过。 - mm2001编辑:截至0.1.8版本中已经在IDE中支持此功能。请按照其中的说明进行操作,而不是使用以下说明。
根据Android Gradle插件用户指南,我能够通过对新创建的项目执行以下步骤(我使用默认的“com.example.myapplication”包)使命令行测试正常工作:
这会运行我的测试,并将测试结果放置在MyApplicationProject/MyApplication/build/reports/instrumentTests/connected中。我不熟悉测试Android应用程序,但似乎工作良好。
在IDE中,可以尝试运行相同的测试类。您需要
但是这会失败(运行测试时使用的类路径缺少测试输出目录)。但是,我不确定这是否管用,因为我的理解是需要一个专门的Android测试运行器。
我建议使用gradle.build文件。
为测试添加一个src/androidTest/java目录(就像Chris开始解释的那样)
打开gradle.build文件并在其中指定:
android {
compileSdkVersion rootProject.compileSdkVersion
buildToolsVersion rootProject.buildToolsVersion
sourceSets {
androidTest {
java.srcDirs = ['androidTest/java']
}
}
}
点击顶部面板上的“Sync Project with Gradle file”按钮。此时您应该会看到一个名为“java”的文件夹(位于“androidTest”内)变为绿色。
现在,您可以在那里创建任何测试文件并执行它们。
Android Studio v.2.3.3
请高亮您要测试的代码,然后使用热键:CTRL
+SHIFT
+T
使用对话框界面完成设置。
测试框架应该与项目包布局相匹配以获得最佳结果,但是如果您具有正确的目录和构建设置,则可以手动创建自定义测试。
目前为止(studio 0.61),保持正确的项目结构就足够了,无需像eclipse中那样创建单独的测试项目(见下图)。
Android Studio不断发展,因此上述回答最终将不再适用。对于当前版本的Android Studio 1.2.1.1,有一篇很好的测试教程:
http://evgenii.com/blog/testing-activity-in-android-studio-tutorial-part-1/
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" />