4

我对测试相当陌生,正在尝试探索 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() 函数的整个序列。在实际测试输入之前,每次都重复导航到自动完成屏幕是非常痛苦的。对此也有什么建议吗?

我不确定采取什么方法。有人可以指导我吗?

4

4 回答 4

3

我遇到了类似的问题并且能够解决它。在您的 setUp() 方法中,调用 getActivity() 是没有用的。它不会影响您的测试方法。你必须使用:

getInstrumentation().getTargetContext()

例如使用

getInstrumentation().getTargetContext().getContentResolver()

代替

getActivity().getContentResolver()

希望这对你有用!

干杯安东尼诺

于 2015-06-03T16:29:18.450 回答
0

我发现模拟框架是执行 android 活动方法的隔离方法测试的更好选择。目前 jMockit 是唯一能够有效模拟 endroid 基类的框架。

您将能够丢弃大量设置和拆卸代码。见测试用例:

https://github.com/ko5tik/andject/blob/master/src/test/java/de/pribluda/android/andject/ViewInjectionTest.java

于 2011-11-22T11:08:53.207 回答
0

我不太了解您的问题,但我会尽力提供帮助。

要执行 Activity 启动(并调用它的 onCreate 回调),请使用:

getActivity();

它的一个常见位置是在setUp()方法中(在每次测试之前调用)。

正如您所说的,对于每个测试,都会调用setUp()andtearDown()方法。

我认为测试您的应用导航的最佳方法是进行简单的测试,并根据需要创建所有意图,以启动所有需要测试的活动。

我希望它有所帮助。

于 2011-12-14T17:58:45.763 回答
0

如果您进行单元测试,您应该将您的测试类扩展到 ActivityUnitTestCase 以测试单个活动并使用将调用您的 onCreate 的 startActivity 方法。ActivityInstrumentationTestCase2 用于对活动进行功能测试。

从 android 参考文档中查看更多信息...

启动被测活动,就像它由 Context.startActivity() 启动一样,提供它提供的参数。当你使用这个方法启动activity时,它会被tearDown()自动停止。

此方法将调用 onCreate(),但如果您希望进一步练习 Activity 生命周期方法,您必须自己从测试用例中调用它们。

不要从您的 setUp() 方法调用。您必须从每个测试方法中调用此方法。

于 2013-06-04T18:13:03.453 回答