Android官方培训课程

关于 Android入门基础:从这里开始 建立第一个App 创建Android项目 执行Android程序 建立简单的用户界面 启动其他的Activity 添加ActionBar 建立ActionBar 添加Action按钮 自定义ActionBar的风格 ActionBar的覆盖层叠 兼容不同的设备 适配不同的语言 适配不同的屏幕 适配不同的系统版本 管理Activity的生命周期 启动与销毁Activity 暂停与恢复Activity 停止与重启Activity 重新创建Activity 使用Fragment建立动态的UI 创建一个Fragment 建立灵活动态的UI Fragments之间的交互 数据保存 保存到Preference 保存到文件 保存到数据库 与其他应用的交互 Intent的发送 接收Activity返回的结果 Intent过滤 Android分享操作 分享简单的数据 给其他App发送简单的数据 接收从其他App返回的数据 给ActionBar增加分享功能 分享文件 建立文件分享 分享文件 请求分享一个文件 获取文件信息 使用NFC分享文件 发送文件给其他设备 接收其他设备的文件 Android多媒体 管理音频播放 控制音量与音频播放 管理音频焦点 兼容音频输出设备 拍照 简单的拍照 简单的录像 控制相机硬件 打印 打印照片 打印HTML文档 打印自定义文档 Android图像与动画 高效显示Bitmap 高效加载大图 非UI线程处理Bitmap 缓存Bitmap 管理Bitmap的内存 在UI上显示Bitmap 使用OpenGL ES显示图像 建立OpenGL ES的环境 定义Shapes 绘制Shapes 运用投影与相机视图 添加移动 响应触摸事件 添加动画 View间渐变 使用ViewPager实现屏幕滑动 展示Card翻转动画 缩放View 布局变更动画 Android网络连接与云服务 无线连接设备 使用网络服务发现 使用WiFi建立P2P连接 使用WiFi P2P服务 执行网络操作 连接到网络 管理网络的使用情况 解析XML数据 传输数据时避免消耗大量电量 优化下载以高效地访问网络 最小化定期更新造成的影响 重复的下载是冗余的 根据网络连接类型来调整下载模式 云同步 使用备份API 使用Google Cloud Messaging 解决云同步的保存冲突 使用Sync Adapter传输数据 创建Stub授权器 创建Stub Content Provider 创建Sync Adpater 执行Sync Adpater 使用Volley执行网络数据传输 发送简单的网络请求 建立请求队列 创建标准的网络请求 实现自定义的网络请求 Android联系人与位置信息 Android联系人信息 获取联系人列表 获取联系人详情 使用Intents修改联系人信息 显示联系人头像 Android位置信息 获取最后可知位置 获取位置更新 显示位置地址 创建和监视地理围栏 Android可穿戴应用 赋予Notification可穿戴特性 创建Notification 在Notifcation中接收语音输入 为Notification添加显示页面 以Stack的方式显示Notifications 创建可穿戴的应用 创建并运行可穿戴应用 创建自定义的布局 添加语音功能 打包可穿戴应用 通过蓝牙进行调试 创建自定义的UI 定义Layouts 创建Card 创建List 创建2D Picker 创建确认界面 退出全屏的Activity 发送并同步数据 访问可穿戴数据层 同步数据单元 传输资源 发送与接收消息 处理数据层的事件 创建表盘 设计表盘 构建表盘服务 绘制表盘 在表盘上显示信息 提供配置 Activity 定位常见的问题 优化性能和电池使用时间 位置检测 Android TV应用 创建TV应用 创建TV应用的第一步 处理TV硬件部分 创建TV的布局文件 创建TV的导航栏 创建TV播放应用 创建目录浏览器 提供一个Card视图 创建详情页 显示正在播放卡片 帮助用户在TV上探索内容 TV上的推荐内容 使得TV App能够被搜索 使用TV应用进行搜索 创建TV游戏应用 创建TV直播应用 TV Apps Checklist Android企业级应用 Ensuring Compatibility with Managed Profiles Implementing App Restrictions Building a Work Policy Controller Android交互设计 设计高效的导航 规划屏幕界面与他们之间的关系 为多种大小的屏幕进行规划 提供向下和横向导航 提供向上和历史导航 综合:设计样例 App 实现高效的导航 使用Tabs创建Swipe视图 创建抽屉导航 提供向上的导航 提供向后的导航 实现向下的导航 通知提示用户 建立Notification 当启动Activity时保留导航 更新Notification 使用BigView风格 显示Notification进度 增加搜索功能 建立搜索界面 保存并搜索数据 保持向下兼容 使得你的App内容可被Google搜索 为App内容开启深度链接 为索引指定App内容 Android界面设计 为多屏幕设计 兼容不同的屏幕大小 兼容不同的屏幕密度 实现可适应的UI 创建自定义View 创建自定义的View类 实现自定义View的绘制 使得View可交互 优化自定义View 创建向后兼容的UI 抽象新的APIs 代理至新的APIs 使用旧的APIs实现新API的效果 使用版本敏感的组件 实现辅助功能 开发辅助程序 开发辅助服务 管理系统UI 淡化系统Bar 隐藏系统Bar 隐藏导航Bar 全屏沉浸式应用 响应UI可见性的变化 创建使用Material Design的应用 开始使用Material Design 使用Material的主题 创建Lists与Cards 定义Shadows与Clipping视图 使用Drawables 自定义动画 维护兼容性 Android用户输入 使用触摸手势 检测常用的手势 跟踪手势移动 滚动手势动画 处理多点触控手势 拖拽与缩放 管理ViewGroup中的触摸事件 处理键盘输入 指定输入法类型 处理输入法可见性 支持键盘导航 处理按键动作 支持游戏控制器 处理控制器输入动作 在不同的 Android 系统版本支持控制器 支持多个控制器 Android后台任务 在IntentService中执行后台任务 创建IntentService 发送工作任务到IntentService 报告后台任务执行状态 使用CursorLoader在后台加载数据 使用CursorLoader执行查询任务 处理CursorLoader查询的结果 管理设备的唤醒状态 保持设备的唤醒 制定重复定时的任务 Android性能优化 管理应用的内存 代码性能优化建议 提升Layout的性能 优化layout的层级 使用include标签重用layouts 按需加载视图 使得ListView滑动顺畅 优化电池寿命 监测电量与充电状态 判断与监测Docking状态 判断与监测网络连接状态 根据需要操作Broadcast接受者 多线程操作 在一个线程中执行一段特定的代码 为多线程创建线程池 启动与停止线程池中的线程 与UI线程通信 避免出现程序无响应ANR JNI使用指南 优化多核处理器(SMP)下的Android程序 Android安全与隐私 Security Tips 使用HTTPS与SSL 为防止SSL漏洞而更新Security 使用设备管理条例增强安全性 Android测试程序 测试你的Activity 建立测试环境 创建与执行测试用例 测试UI组件 创建单元测试 创建功能测试

创建功能测试

1年前 阅读 219 评论 1 赞 0

创建功能测试

编写:huanglizhuo - 原文:http://developer.android.com/training/activity-testing/activity-functional-testing.html

功能测试包括验证单个应用中的各个组件是否与使用者期望的那样(与其它组件)协同工作。比如,我们可以创建一个功能测试验证在用户执行UI交互时Activity是否正确启动目标Activity

要为Activity创建功能测,我们的测试类应该对ActivityInstrumentationTestCase2进行扩展。与ActivityUnitTestCase不同,ActivityInstrumentationTestCase2中的测试可以与Android系统通信,发送键盘输入及点击事件到UI中。

要了解一个完整的测试例子可以参考示例应用中的SenderActivityTest.java

添加测试方法验证函数的行为

我们的函数测试目标应该包括:

  • 验证UI控制是否正确启动了目标Activity。
  • 验证目标Activity的表现是否按照发送Activity提供的数据呈现。

我们可以这样实现测试方法:

  1. @MediumTest
  2. public void testSendMessageToReceiverActivity() {
  3. final Button sendToReceiverButton = (Button)
  4. mSenderActivity.findViewById(R.id.send_message_button);
  5. final EditText senderMessageEditText = (EditText)
  6. mSenderActivity.findViewById(R.id.message_input_edit_text);
  7. // Set up an ActivityMonitor
  8. ...
  9. // Send string input value
  10. ...
  11. // Validate that ReceiverActivity is started
  12. ...
  13. // Validate that ReceiverActivity has the correct data
  14. ...
  15. // Remove the ActivityMonitor
  16. ...
  17. }

测试会等待匹配的Activity启动,如果超时则会返回null。如果ReceiverActivity启动了,那么先前配置的ActivityMoniter就会收到一次碰撞(Hit)。我们可以使用断言方法验证ReceiverActivity是否的确启动了,以及ActivityMoniter记录的碰撞次数是否按照预想地那样增加。

设立一个ActivityMonitor

为了在应用中监视单个Activity我们可以注册一个ActivityMoniter。每当一个符合要求的Activity启动时,系统会通知ActivityMoniter,进而更新碰撞数目。

通常来说要使用ActivityMoniter,我们可以这样:

  1. 使用getInstrumentation())方法为测试用例实现Instrumentation
  2. 使用Instrumentation的一种addMonitor()方法为当前instrumentation添加一个Instrumentation.ActivityMonitor实例。匹配规则可以通过IntentFilter或者类名字符串。
  3. 等待开启一个Activity。
  4. 验证监视器撞击次数的增加。
  5. 移除监视器。

下面是一个例子:

  1. // Set up an ActivityMonitor
  2. ActivityMonitor receiverActivityMonitor =
  3. getInstrumentation().addMonitor(ReceiverActivity.class.getName(),
  4. null, false);
  5. // Validate that ReceiverActivity is started
  6. TouchUtils.clickView(this, sendToReceiverButton);
  7. ReceiverActivity receiverActivity = (ReceiverActivity)
  8. receiverActivityMonitor.waitForActivityWithTimeout(TIMEOUT_IN_MS);
  9. assertNotNull("ReceiverActivity is null", receiverActivity);
  10. assertEquals("Monitor for ReceiverActivity has not been called",
  11. 1, receiverActivityMonitor.getHits());
  12. assertEquals("Activity is of wrong type",
  13. ReceiverActivity.class, receiverActivity.getClass());
  14. // Remove the ActivityMonitor
  15. getInstrumentation().removeMonitor(receiverActivityMonitor);

使用Instrumentation发送一个键盘输入

如果Activity有一个EditText,我们可以测试用户是否可以给EditText对象输入数值。

通常在ActivityInstrumentationTestCase2中给EditText对象发送串字符,我们可以这样做:

  1. 使用runOnMainSync())方法在一个循环中同步地调用requestFocus())。这样,我们的UI线程就会在获得焦点前一直被阻塞。
  2. 调用waitForIdleSync())方法等待主线程空闲(也就是说,没有更多事件需要处理)。
  3. 调用sendStringSync())方法给EditText对象发送一个我们输入的字符串。

比如:

  1. // Send string input value
  2. getInstrumentation().runOnMainSync(new Runnable() {
  3. @Override
  4. public void run() {
  5. senderMessageEditText.requestFocus();
  6. }
  7. });
  8. getInstrumentation().waitForIdleSync();
  9. getInstrumentation().sendStringSync("Hello Android!");
  10. getInstrumentation().waitForIdleSync();

本节例子AndroidTestingFun.zip

你的支持将鼓励作者继续创作

评论(1)

高薪寻找会制作安卓上架高手 主打360 豌豆荚 小米 应用宝 华为平台

有技术的请立即 寇 寇 详谈949 181 609

9个月前