刚刚下载了基于 Intellij Idea 的 Android Studio。
如何创建测试?
我注意到有一个创建测试模块的选项,但这似乎没有做任何事情,只能使用 src 创建一个新项目
我还尝试按下热键 CTRL+AlT+T,它允许在现有类上创建单元测试,但它似乎想将它放在当前项目中。当然这对 TDD 没有帮助
有人在这里有经验吗?
刚刚下载了基于 Intellij Idea 的 Android Studio。
如何创建测试?
我注意到有一个创建测试模块的选项,但这似乎没有做任何事情,只能使用 src 创建一个新项目
我还尝试按下热键 CTRL+AlT+T,它允许在现有类上创建单元测试,但它似乎想将它放在当前项目中。当然这对 TDD 没有帮助
有人在这里有经验吗?
此答案适用于刚开始进行 Android 测试的人。我将提供两个简单的示例来帮助您了解测试的工作原理。如果您在接下来的 10 分钟内继续进行,您将准备好开始将测试添加到您自己的应用程序中。我想你会惊讶于它是多么容易。我当然是。
您将进行两种不同类型的测试。
Context
就是一个例子。)创建一个新项目,您将看到以下默认文件夹。
一切都已经存在,等待您创建测试。一切都已经设置好了!
打开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>
然后在菜单中按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());
}
}
伟大的!您刚刚创建了您的第一个仪器测试!那非常容易。您可能应该添加一个断言以使其成为真正的测试,但这也很容易使用记录器来完成。观看此视频以更深入地了解。
我会先观看视频,然后阅读文档。这一切都非常有帮助。最后一个链接是一系列文章,这些文章涵盖了在选择测试内容时要考虑的一些重要事项。
编辑:从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']
}
}
}
按“与 Gradle 文件同步项目”(在顶部面板中)。您现在应该看到一个文件夹“java”(在“androidTest”内)是绿色的。
现在您可以在那里创建任何测试文件并执行它们。
我认为Rex St John 的这篇文章对于使用 android studio 进行单元测试非常有用。
(来源:rexstjohn.com)
Android Studio v.2.3.3
突出显示要测试的代码上下文,然后使用热键:CTRL
++SHIFT
T
使用对话框界面完成您的设置。
测试框架应该反映您的项目包布局以获得最佳结果,但您可以手动创建自定义测试,前提是您具有正确的目录和构建设置。
截至目前(工作室 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 将测试应用程序集成到应用程序项目中。
我不确定这是否有助于您解决特定问题,但我找到了使用 Gradle 项目进行测试的指南。 Android Gradle 用户指南
我发现的最简单的方法是在我的以下博客文章中进行了简化:
祝你的代码更具可读性、可维护性和经过良好测试!
从 Android Studio 1.1 开始,我们已经获得了编写单元测试的官方(实验性)支持(Roboelectric 也可以)。
来源:https ://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support
Android Studio 一直是一个不断变化的目标,最初是开发者预览版,现在处于测试阶段。项目中测试类的路径随着时间的推移发生了变化,但无论您使用什么版本的 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 文件告诉您将测试类放在哪里。
在 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));
}
}