gpt4 book ai didi

android - 如何为 android 仪器测试设置环境并制作示例 Activity UI 测试?

转载 作者:行者123 更新时间:2023-11-28 20:53:14 25 4
gpt4 key购买 nike

免责声明最近我需要开始测试我的 Android 应用程序,在成功测试的过程中我发现了很多问题。我的烦恼的答案并不容易找到,因此,我决定将我从社区中学到的东西分享给社区。

Can I answer my own question? Yes! Stack Exchange has always explicitly encouraged users to answer their own questions. If you have a question that you already know the answer to, and you would like to document that knowledge in public so that others (including yourself) can find it later, it's perfectly okay to ask and answer your own question on a Stack Exchange site. https://stackoverflow.com/help/self-answer https://meta.stackexchange.com/questions/17845/etiquette-for-answering-your-own-question

最佳答案

有更好的答案吗?

尽管 Google 在 Android 文档中提供了规范,但对于那些缺乏 Gradle 和 Android Studio 经验并希望开始开发仪器测试的人来说,可能会出现一些问题。

理解主题

在继续本主题之前,请花十分钟时间阅读 this文章。它将使您了解测试应用程序的基本概念。

了解 Android 测试中使用的基本父类(super class):

  • TestCase – Plain old JUnit test case. It can be extended to test utility classes that are not tied to the Android framework;

  • AndroidTestCase – It extends JUnit’s TestCase. It’s a lighter testing class compared to ActivityTestCase. It doesn’t need to launch an activity to run it. Its getContext() method allows you to get an injected context if you need one. Since you can get a context from this class, you can inflate your UI objects to test their behaviors;

  • ActivityInstrumentationTestCase2 – It’s the newer version of ActivityInstrumentationTestCase. ActivityInstrumentationTestCase is deprecated in Android SDK 1.5. It’s a heavier testing class compared to AndroidTestCase. It provides UI and functional testing for a single activity. You can get an injected activity that you are testing on by calling its getActivity() method. The activity being tested is launched and finished before and after each test;

  • ActivityUnitTestCase – It gives the tested activity an isolated environment. When using it to test an activity, the activity is not attached to the system. This gives you more control over what kind of environment that you want your activity to be tested in;

  • ApplicationTestCase – It provides testing for Application classes. It can be used to test the life cycle of an application;

  • InstrumentationTestRunner – The runner that runs the Android test cases. I just found this..Hope this helps for others...If u want more details like when and how to use, see the APIDemos test application in the samples directory within android SDK.

Credits for this answer, user Bharat Pawar Using Android Test Framework;

01 - 设置你的 Gradle 模块

在您的应用程序 gradle 模块中导入以下库:

defaultConfig {
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

dependencies {
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
androidTestCompile 'junit:junit:4.12'
androidTestCompile 'com.android.support:support-annotations:23.0.1'
androidTestCompile 'com.android.support.test:runner:0.4.1'
androidTestCompile 'com.android.support.test:rules:0.4.1'
androidTestCompile 'com.android.support:support-annotations:24.0.0-alpha2'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2.1') {
exclude module: 'support-annotations'
exclude module: 'support-v4'
exclude module: 'support-v13'
exclude module: 'recyclerview-v7'
}
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
}

02 - 编写你的 Activity 测试

这是一个使用 JUnit4 的 UI 测试示例。在网上找到的例子中,会有人使用JUnit3。最后一个不会使用注释,而是使用标准方法名称(以“test”开头),但是,目前,Google 告诉您在测试中使用 JUnit4

In your JUnit 4 test class, you can call out sections in your test code for special processing by using the following annotations:

  • @Before: Use this annotation to specify a block of code that contains test setup operations. The test class invokes this code block before each test. You can have multiple @Before methods but the order in which the test class calls these methods is not guaranteed;

  • @After: This annotation specifies a block of code that contains test tear-down operations. The test class calls this code block after every test method. You can define multiple @After operations in your test code. Use this annotation to release any resources from memory;

  • @Test: Use this annotation to mark a test method. A single test class can contain multiple test methods, each prefixed with this annotation;

  • @Rule: Rules allow you to flexibly add or redefine the behavior of each test method in a reusable way. In Android testing, use this annotation together with one of the test rule classes that the Android Testing Support Library provides, suh as ActivityTestRule or ServiceTestRule;

  • @BeforeClass: Use this annotation to specify static methods for each test class to invoke only once. This testing step is useful for expensive operations such as connecting to a database;

  • @AfterClass: Use this annotation to specify static methods for the test class to invoke only after all tests in the class have run. This testing step is useful for releasing any resources allocated in the @BeforeClass block;

  • @Test(timeout=): Some annotations support the ability to pass in elements for which you can set values. For example, you can specify a timeout period for the test. If the test starts but does not complete within the given timeout period, it automatically fails. You must specify the timeout period in milliseconds, for example: @Test(timeout=5000)

.

来源:https://developer.android.com/tools/testing/testing_android.html

import android.content.Intent;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.contrib.RecyclerViewActions;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.v7.widget.RecyclerView;
import android.test.ActivityInstrumentationTestCase2;

import org.hamcrest.Matchers;
import org.junit.After;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;

import br.com.hole19.marvel.R;
import br.com.hole19.marvel.ui.commons.util.ActivityTemplate;

import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.Espresso.*;
import static android.support.test.espresso.matcher.ViewMatchers.withId;


/**
* Created by Edgar on 04/05/2016.
*/
@RunWith(AndroidJUnit4.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestActivityHomepage extends ActivityInstrumentationTestC;se2 <ActivityHomepage> {

private static final String TAG = "TestActivityHomepage";


private ActivityHomepage mActivity;
public ActivityTestRule<ActivityHomepage> rule = new ActivityTestRule(ActivityHomepage.class, true, false);

public TestActivityHomepage() {
super(ActivityHomepage.class);
}

@Before
public void setUp() throws Exception {
super.setUp();
Intent intent = new Intent();
mActivity = rule.launchActivity(intent);
}

@Test
public void testPreconditions() {
assertNotNull(mActivity);
}

@Test
public void testLoadMoreCharacters () throws InterruptedException {
RecyclerView characters = (RecyclerView) this.mActivity.findViewById(R.id.characters);
int previousSize = characters.getAdapter().getItemCount();
characters.smoothScrollToPosition(previousSize);
Thread.sleep(2000);
int newSize = characters.getAdapter().getItemCount();
onView(withId(R.id.characters)).perform(RecyclerViewActions.scrollToPosition(previousSize));
assertNotSame(previousSize, newSize);
}

@Test
public void openActivityCharacter () {
onView(withId(R.id.characters))
.perform(
RecyclerViewActions
.actionOnItemAtPosition(0, click()));

assertFalse(mActivity.isRunning());
}
}

03 - 问题调查

在创建测试的过程中可能会出现一些问题:

问题 01:gradle finish 有错误。发生在:gradle构建过程中库冲突;说明:当导入测试特定的库时,可能会与应用程序已经存在的库发生冲突;解决方案:从冲突库中排除冲突模块;


问题 02:检测错误因超时而失败。发生在:启动仪器测试;说明:Intrumentation测试不支持被测Activity存在进度条;解决方案:在被测试的activity中,确保加载完成后将进度条可见性设置为GONE;

更多例子

如果您想查看有关如何使用测试框架的更多示例,请查看 this链接;

关于android - 如何为 android 仪器测试设置环境并制作示例 Activity UI 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37078855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com