android-Junit测试单个activity二-Ui组件

不写blog不知道,写了才知道真的得用心啊。上个第一篇blog写完的感受就是:不仅仅是写blog,而是向自己和别人展示一些能让人看懂的东西。慢慢积累经验,以后要写的更好。
这篇文章主要测试Activity中一开始的TextView隐藏,一个按钮点击后显示这个TextView,并设置一句话。这个过程,好了下面先上被测试的Activity代码:

public class ClickFunActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_click_fun);

        final TextView infoTextView = (TextView) findViewById(R.id.info_text_view);
        final Button clickMeButton = (Button) findViewById(R.id.launch_next_activity_button);
        clickMeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                infoTextView.setVisibility(View.VISIBLE);
                infoTextView.setText(getString(R.string.info_text));
            }
        });
    }
}

布局就一个Button和一个TextView,开始TextView为Gone,代码就不贴了。
当测试拥有UI的Activity时,被测试的Activity在UI线程中运行。测试程序会在单独的一个线程内运行。也就是说,我们的测试程序可以获得UI线程的对象,但是如果它尝试改变UI线程对象的值,会得到WrongThreadException错误。
下面是测试类的代码:

public class ClickFunActivityTest extends ActivityInstrumentationTestCase2<ClickFunActivity> {

    private ClickFunActivity mClickFunActivity;
    private Button mClickMeButton;
    private TextView mInfoTextView;
    private View decorView;

    public ClickFunActivityTest() {
        super(ClickFunActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        //设置为true代表测试代码运行时间,避免人为的UI操作获取到控件的焦点。要在getActivity()调用。
        setActivityInitialTouchMode(true);
        mClickFunActivity = getActivity();
        mClickMeButton = (Button) mClickFunActivity.findViewById(R.id.launch_next_activity_button);
        mInfoTextView = (TextView) mClickFunActivity.findViewById(R.id.info_text_view);
        decorView = mClickFunActivity.getWindow().getDecorView();//获取根视图
    }

    /**
     * 验证按钮布局位置
     */
    @MediumTest
    public void testClickMeButton_layout() {
        // 这个方法相当于验证button按钮是否在视图上,错误会抛出一个AssertionFailedError异常
        ViewAsserts.assertOnScreen(decorView, mClickMeButton);  
        ViewGroup.LayoutParams Layoutparams = mClickMeButton.getLayoutParams();
        assertNotNull(Layoutparams);
        assertEquals(Layoutparams.width, WindowManager.LayoutParams.MATCH_PARENT);
        assertEquals(Layoutparams.height,WindowManager.LayoutParams.WRAP_CONTENT);
        //assertEquals(2, WindowManager.LayoutParams.MATCH_PARENT);
        //assertEquals(1,WindowManager.LayoutParams.WRAP_CONTENT);

    }

    /**
     * 验证textView在布局的状态
     */
    @MediumTest
    public void testInfoTextView_layout() {
        ViewAsserts.assertOnScreen(decorView, mInfoTextView);
        assertTrue(View.GONE == mInfoTextView.getVisibility());
    }

    /**
     * 验证按钮的行为
     */
    @MediumTest
    public void testClickMeButton_clickButtonAndExpectInfoText() {
        String expectedInfoText = mClickFunActivity.getString(R.string.info_text);
        TouchUtils.clickView(this,mClickMeButton);
        assertTrue(View.VISIBLE == mInfoTextView.getVisibility());
        assertEquals(expectedInfoText,mInfoTextView.getText());
    }
}

注意:
在测试中调用clickView()可以让我们用编程方式点击一个按钮。我们必须传递正在运行的测试用例的一个引用和要操作按钮的引用。我们可以用TouchUtils类的方法来模拟点击,轻敲,或应用程序屏幕拖动View。

TouchUtils方法的目的是将事件安全地从测试线程发送到UI线程。我们不可以直接在UI线程或任何标注@UIThread的测试方法中使用TouchUtils这样做可能会增加错误线程异常。

@SmallTest 标志该测试方法是小型测试的一部分。
@MediumTest 标志该测试方法是中等测试的一部分。
@LargeTest 标志该测试方法是大型测试的一部分。

注释都很清楚了,就不多说了。下篇记录单元测试。

Reference:
http://hukai.me/android-training-course-in-chinese/testing/activity-testing/activity-ui-testing.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值