Robotium的测试类ActivityInstrumentationTestCase2是继承于Junit3的TestCase类,因此并无提供Junit4的特性.如网上总结说的java
- 不能经过annotate的方式来识别子类的新特征,如不能实现@beforeclass,@afterclass等特征。只能经过写setup和teardown,
- TestCase只能以test开头进行测试case书写。
那么有时咱们并不想每次开始/完成一个case的时候都作一些重复的动做,也就是要实现Junit4的@beforeclass和@afterclass,该怎么办呢?
以SDK自带的Notepad测试用例做为例子,假如如今咱们须要实现两个测试用例
- testAddNoteCNTittle:建立一个中文标题的笔记
- testAddNoteEngTitle:建立一个英文标题的笔记
根据实例提供的代码,在setup里面会初始化solo而在teardown里面会关闭全部打开的activities,也就是说每执行一个case都会从新初始化一次solo和关闭全部的activities:
- @Override
- public void setUp() throws Exception {
-
-
- super.setUp();
-
- this.activity = this.getActivity();
-
- this.solo = new Solo(getInstrumentation(), getActivity());
- }
-
- @Override
- public void tearDown() throws Exception {
-
-
- solo.finishOpenedActivities();
- }
@Override
public void setUp() throws Exception {
//setUp() is run before a test case is started.
//This is where the solo object is created.
super.setUp();
this.activity = this.getActivity();
this.solo = new Solo(getInstrumentation(), getActivity());
}
@Override
public void tearDown() throws Exception {
//tearDown() is run after a test case has finished.
//finishOpenedActivities() will finish all the activities that have been opened during the test execution.
solo.finishOpenedActivities();
}
但事实上咱们在这个脚本只是去建立两个Note,并不须要每执行完一个case都要去初始化solo和关闭全部activities。google后没有发现有现成的取代@beforeclass和@aferclass的方法。
如下本人的实现方法
- <pre name="code" class="java">package com.example.android.notepad.test;
-
- import com.robotium.solo.Solo;
-
- import android.test.ActivityInstrumentationTestCase2;
- import android.app.Activity;
-
- @SuppressWarnings("rawtypes")
- public class TCCreateNote extends ActivityInstrumentationTestCase2{
-
- private static Solo solo = null;
- public Activity activity;
-
- <span style="white-space:pre"> </span>private static final int NUMBER_TOTAL_CASES = 2;
- private static int run = 0;
-
- private static Class<?> launchActivityClass;
-
-
- private static String mainActiviy = "com.example.android.notepad.NotesList";
- private static String packageName = "com.example.android.notepad";
-
- static {
-
- try {
-
- launchActivityClass = Class.forName(mainActiviy);
-
- } catch (ClassNotFoundException e) {
-
- throw new RuntimeException(e);
-
- }
-
- }
-
-
- @SuppressWarnings("unchecked")
- public TCCreateNote() {
- super(packageName, launchActivityClass);
- }
-
-
- @Override
- public void setUp() throws Exception {
-
-
- super.setUp();
- <span style="white-space:pre"> </span>
-
- if(solo == null) {
- TCCreateNote.solo = new Solo(getInstrumentation(), getActivity());
- }
- }
-
- @Override
- public void tearDown() throws Exception {
-
- run += countTestCases();
- if(run >= NUMBER_TOTAL_CASES) {
- solo.finishOpenedActivities();
- }
- }
-
- public void testAddNoteCNTitle() throws Exception {
-
- solo.clickOnMenuItem("Add note");
- solo.enterText(0, "中文标签笔记");
- solo.clickOnMenuItem("Save");
- solo.clickInList(0);
- solo.clearEditText(0);
- solo.enterText(0, "Text 1");
- solo.clickOnMenuItem("Save");
- solo.assertCurrentActivity("Expected NotesList Activity", "NotesList");
-
- solo.clickLongOnText("中文标签笔记");
- solo.clickOnText("Delete");
- }
-
-
- public void testAddNoteEngTitle() throws Exception {
- solo.clickOnMenuItem("Add note");
- solo.enterText(0, "English Title Note");
- solo.clickOnMenuItem("Save");
- solo.clickInList(0);
- solo.clearEditText(0);
- solo.enterText(0, "Text 1");
- solo.clickOnMenuItem("Save");
- solo.assertCurrentActivity("Expected NotesList Activity", "NotesList");
-
- solo.clickLongOnText("English Title Note");
- solo.clickOnText("Delete");
- }
- }