我对测试相当陌生,正在尝试探索 jUnit 测试和Robotium
. 我的应用程序有 4 个屏幕。
Splash Screen --> Screen2--> Screen 3--> Autocomplete Screen.
[init()] [ check values generated by init() method]
自动完成屏幕是用户输入内容的地方,应用程序从大型产品数据库中执行自动完成。在初始屏幕中,我正在使用init()
另一个类中的方法初始化许多应用程序变量。此init()
方法将加载用户首选项,检查数据库创建等...(产品数据库预先打包在 apk 中,我在第一次启动时复制数据库并将其标记SharedPreferences
为已复制 = true)。
问题:如何隔离自动完成屏幕的测试?AutocompleteActivity 的 onCreate 依赖于在 SplashScreen 中调用的 init()。我不确定 jUnit 何时创建 , 的实例Activity
(可能在构造函数中?)。这是我的TestCaseCode:
import android.test.ActivityInstrumentationTestCase2;
import android.view.View;
import android.widget.ListView;
import com.jayway.android.robotium.solo.Solo;
import com.supervalu.mobile.android.AutoCompleteActivity;
import com.supervalu.mobile.android.db.LocalDb;
public class AutocompleteTest extends
ActivityInstrumentationTestCase2<AutoCompleteActivity> {
private Solo solo;
public AutocompleteTest() {
super("com.****.*****.*****", AutoCompleteActivity.class);
}
protected void setUp() throws Exception {
super.setUp();
LocalDb.init(getActivity().getApplicationContext());
solo = new Solo(getInstrumentation(), getActivity());
}
public void test1Character() {
solo.sleep(2000);
solo.enterText(0, "c");
solo.sleep(10000);
View v = getActivity().findViewById(
com.*****.****.*****.R.id.list);
solo.waitForView(v);
assertTrue(((ListView) v).getChildCount() > 0);
}
public void test3Character() {
LocalDb.init(getActivity().getApplicationContext());
solo.enterText(0, "che");
View v = getActivity().findViewById(
com.*****.****.*****.R.id.list);
solo.waitForView(v);
assertTrue(((ListView) v).getChildCount() > 0);
}
protected void tearDown() throws Exception {
solo.finishOpenedActivities();
super.tearDown();
}
测试用例不断减少,因为 onCreate 需要一些LocalDb
必须通过init()
方法初始化的值。
我无法在构造函数中的超级调用之前添加 init() 函数。是否有任何解决方法,或者我需要从启动屏幕启动测试用例?
问题 2:如果我从启动画面开始测试,我必须先导航到自动完成屏幕,然后才能对其执行任何测试。假设我也这样做了,那么对于每个测试:test1character(),该类执行 setUp(),然后是 test,然后是 tearDown(),然后它重新启动 test3characters() 函数的整个序列。在实际测试输入之前,每次都重复导航到自动完成屏幕是非常痛苦的。对此也有什么建议吗?
我不确定采取什么方法。有人可以指导我吗?