不写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