NotesList(Robotium自带的例子)

本文详细介绍使用Robotium进行安卓应用自动化测试的过程。包括环境搭建、配置文件修改、测试用例编写等内容,通过具体案例演示了添加、编辑及删除笔记等功能的自动化测试方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转自:http://www.cnblogs.com/morebetter/archive/2011/05/19/2050326.html

我想大家在安装完robotium后,都会试试noteslist 这个例子吧。这个是官网提到的例子

首先打开noteslist 源码

C:\android-sdk_r10-windows\android-sdk-windows\samples\android-7\NotePad

再打开noteslisttest 源码

可以从上面下载http://code.google.com/p/robotium/downloads/list/ExampleTestProject_v2.3.zip

要做一点修改。 因为noteslist是在androidV21开发的,而我的测试代码是V23的。我们最好要改成一致的。

修改noteslisttest 下的AndroidManifest.xml

<uses-sdk android:minSdkVersion="9" />

改成<uses-sdk android:minSdkVersion="7" />

这两个数字表示什么意思呢?

7--androidV21,9--androidV23,最低版本是3--AndroidV15.

大家按顺序排就知道哪个数字对应的版本了

然后在noteslisttest 右击选中Properties--Android,选中AndroidV21

这样noteslisttest 里带的android jar 由android2.3 变为android2.1

再说一个配置,我觉得也很重要

还是在AndroidManifest.xml 里

<instrumentation android:targetPackage="com.example.android.notepad" android:name="android.test.InstrumentationTestRunner" />

红色加粗的字符串表示我们要测试代码的package

OK,这样我们就弄好代码了。 我们只需要执行Run As--Android Junit test

下面我们看看noteslisttest 里的具体代码,看看它是怎么测试的

// 告知系统我要测试的app是什么

public NotePadTest() {

super("com.example.android.notepad", NotesList.class);
}

//打开noteslist

public void setUp() throws Exception {
solo = new Solo(getInstrumentation(), getActivity());
}

public void testAddNote() throws Exception {
solo.clickOnMenuItem("Add note");
//Assert that NoteEditor activity is opened
solo.assertCurrentActivity("Expected NoteEditor activity", "NoteEditor");
//In text field 0, add Note 1
solo.enterText(0, "Note 1");
solo.goBack();
//Clicks on menu item
solo.clickOnMenuItem("Add note");
//In text field 0, add Note 2
solo.enterText(0, "Note 2");
//Go back to first activity named "NotesList"
solo.goBackToActivity("NotesList");
boolean expected = true;
boolean actual = solo.searchText("Note 1") && solo.searchText("Note 2");
//Assert that Note 1 & Note 2 are found
assertEquals("Note 1 and/or Note 2 are not found", expected, actual);

}

这是我们第一个case,主要目的是测试添加文本的功能

clickOnMenuItem(String)

功能是点击Menu按钮,选择文本描述为String的菜单,如我们的例子是"Add note"

assertCurrentActivity(String message,String name)

这个是判断当前的activity是否和我预期的一致

message是描述性的文字

name是指activity的名字

关于如何知道activity 名字,我找了半天的文档,目前的方法是得看源码中的AndroidManifest.xml--Application label--Application Nodes,在那里我们可以看到所有的activity的name

enterText(int index,string text)

index用来标识写到哪个EditText中。如果当前只打开一个EditText,那index=0

text:就是我们要写入的内容

goBack()

相当于手机上的 返回键(back key)

goBackToActivity(String name)

返回到指定的activity

searchText(String text)

在当前的activity中搜索是否含有text的内容

public void testEditNote() throws Exception {
// Click on the second list line
solo.clickInList(2);
// Change orientation of activity
solo.setActivityOrientation(Solo.LANDSCAPE);
// Change title
solo.clickOnMenuItem("Edit title");
//In first text field (0), add test
solo.enterText(0, " test");
solo.goBackToActivity("NotesList");
boolean expected = true;
// (Regexp) case insensitive
boolean actual = solo.searchText("(?i).*?note 1 test");
//Assert that Note 1 test is found
assertEquals("Note 1 test is found", expected, actual);

}

第二个case,主要是测试编辑功能的

clickInList(int index)

点击list表的第index行,进入该文本界面

solo.setActivityOrientation(Solo.LANDSCAPE);

setActivityOrientation,设置手机屏幕显示方式

LANDSCAPE:横向显示

Portrait:竖向显示

public void testRemoveNote() throws Exception {

//(Regexp) case insensitive/text that contains "test"
solo.clickOnText("(?i).*?test.*");
//Delete Note 1 test
solo.clickOnMenuItem("Delete");
//Note 1 test & Note 2 should not be found
boolean expected = false;
boolean actual = solo.searchText("Note 1 test");
//Assert that Note 1 test is not found
assertEquals("Note 1 Test is not found", expected, actual);
solo.clickLongOnText("Note 2");
//Clicks on Delete in the context menu
solo.clickOnText("(?i).*?Delete.*");
actual = solo.searchText("Note 2");
//Assert that Note 2 is not found
assertEquals("Note 2 is not found", expected, actual);
}

第三个case,是用来测试删除功能的

clickOnText(String text)

点击包含该文字的地方

其中text可以用正则表达式表示

(?i)----忽略大小写。默认情况是大小写敏感的。

正则表达式与java保持一致

clickLongOnText(String text)

长时间按住所选的文字

例子看上去还比较简单。学了几个函数方法。

<think>嗯,我现在遇到了一个Android应用的问题,出现了ActivityNotFoundException,提示NoteEditActivity没有在AndroidManifest.xml中声明。我需要解决这个问题。首先,我应该回想一下这个异常通常是什么原因引起的。根据之前学过的知识,这个异常通常是因为没有在AndroidManifest.xml文件中正确声明Activity组件。或者可能是在启动Activity时使用了错误的类名或组件名称。 让我先检查一下AndroidManifest.xml文件。用户提供的引用[1]提到,需要确认是否在AndroidManifest.xml中声明了对应的Activity。所以我的第一步是打开这个文件,查找是否有NoteEditActivity的声明。例如,在<application>标签内应该有类似<activity android:name=".NoteEditActivity" ...>的条目。如果没有的话,这就是问题所在,需要添加进去。 另外,引用[3]中提到了添加provider的例子,虽然这里的问题是关于Activity的,但结构类似,需要确保<activity>标签被正确放置在<application>内部。可能有时候开发者会不小心将Activity声明放在错误的位置,或者拼写错误类名。比如,是否把NoteEditActivity写成了NoteEditorActivity或者其他类似的名称?需要仔细核对。 还有,如果Activity是在某个子包中,那么android:name属性应该包含完整的包路径。例如,如果应用的主包是com.example.app,而NoteEditActivity在com.example.app.notes包下,那么声明应该是android:name=".notes.NoteEditActivity"。这点容易被忽略,导致类找不到。 另外,引用[2]提到有时候即使代码没问题,仍然可能出现这个问题,所以检查清单文件是关键。同时,检查启动Activity的Intent是否正确。比如,是否在代码中使用的是显式Intent,并且正确指定了目标Activity的类。例如: Intent intent = new Intent(this, NoteEditActivity.class); startActivity(intent); 如果这里类名错误,或者使用了隐式Intent但没有正确配置intent-filter,也可能导致异常。但根据异常信息,这里是显式找不到Activity,所以更可能是清单文件的问题。 还有,清理和重建项目有时候能解决编译缓存导致的问题。比如,添加了Activity声明但系统没有正确识别,这时候需要Rebuild项目。 总结可能的解决步骤: 1. 检查AndroidManifest.xml是否有NoteEditActivity的声明,位置是否正确,名称是否拼写正确。 2. 确认Activity的完整类名是否在清单中正确配置,特别是包路径。 3. 检查启动Activity的Intent是否正确使用了显式调用,并且类名正确。 4. 清理并重新构建项目,确保所有更改生效。 可能还需要注意XML文件的语法错误,比如标签未正确闭合,导致后续声明未被正确解析。这时候整个清单文件可能有问题,需要检查是否有其他错误。</think>要解决`ActivityNotFoundException: NoteEditActivity not declared in AndroidManifest.xml`异常,请按以下步骤操作: --- ### 1. **检查AndroidManifest.xml声明** - 在`<application>`标签内添加`NoteEditActivity`的声明,格式如下: ```xml <activity android:name=".NoteEditActivity" android:label="Note Edit" /> ``` - **关键点**: - 如果`NoteEditActivity`位于子包中(例如`.ui`包),需声明为`android:name=".ui.NoteEditActivity"`[^1]。 - 确保标签无拼写错误(如`activity`写成`acitivity`)或符号缺失(如缺少`/`或`>`)。 --- ### 2. **验证类名和包路径** - **类名匹配**:检查类名是否与XML声明一致。例如: - XML中的`android:name=".NoteEditActivity"` - 代码中的类定义应为`public class NoteEditActivity extends AppCompatActivity`。 - **包路径**:若Activity在子包中,需在`android:name`中指定完整路径(例如`android:name=".subpackage.NoteEditActivity"`)。 --- ### 3. **检查Intent启动方式** - 使用显式Intent启动Activity: ```java Intent intent = new Intent(CurrentActivity.this, NoteEditActivity.class); startActivity(intent); ``` - **避免错误**:确保未使用字符串类名(如`Class.forName("com.example.NoteEditActivity")`),易引发拼写错误。 --- ### 4. **清理并重建项目** - Android Studio菜单选择: - **Build > Clean Project** - **Build > Rebuild Project** - 解决因缓存导致的清单文件未更新问题。 --- ### 5. **检查XML语法错误** - 确保`AndroidManifest.xml`中无其他语法错误(如未闭合的标签、属性值缺少引号),否则可能导致后续声明被忽略。 --- ### 相关引用 - 声明缺失是`ActivityNotFoundException`的常见原因[^2]。 - 显式Intent需严格匹配声明的Activity类名和包路径。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值