Android应用开发不管架构多牛,功能多丰富,UI多好看,交付到客户手中,在登录界面就莫名其妙的崩溃,能指望客户给你好脸色看么。所以,归根结底程序还是要稳定,特别是最基本最核心的功能,用拟人化的说辞就是泰山崩于前而面不改色,就是要这么稳!
要做到程序稳定,我总结了以下几点:
- 一些比较重要的逻辑判断要与需求方反复确认,不要自己写了之后用几个不全面的测试数据测试后发现没有问题就等着上线,要真的上线了,你就哭吧。要清楚的认识到我们本身是开发者,自测除非是很明显的bug,不然是很难测试出来的,简言之,你所有认为逻辑严谨、条理清晰的代码,可能都是隐藏着bug的,还是那句话:要与需求方反复确认。
- 主观的测试不精准,那就让代码帮我们测试呗,也就是自动化测试。在Android开发上,我选择Google官方的Espresso,跟着版本走准没错。
- 每次写完代码,你还有写测试代码的意愿吗,为了完成工作都加班到九点了,再加上自动化测试的代码量,岂不是要天天写到半夜再下班?如果你是工作狂人就当我没说。何不让测试在开发前面进行呢,这就是测试驱动开发所要做的。
下面开始Espresso入门学习。
1.判断弹出某个Toast
onView(withText("xxxx"))//通过控件的文字属性获取
.inRoot(withDecorView(Matchers.not(mActivityRule.getActivity().getWindow().getDecorView())))//获取需要的根布局
.check(matches(isDisplayed()));//如果控件显示则通过测试,不显示则不通过测试
2.自定义View的perform中执行操作
//比如现在有一个登录组合控件,要在perform中设置EditText的文字
onView(withId(R.id.lif_pwd))
.perform(setEditText(""));
/**
* 自定义一个ViewAction
*/
public static ViewAction setEditText(String text) {
return new ViewAction() {
//识别所操作的对象类型
@Override
public Matcher<View> getConstraints() {
return isAssignableFrom(LoginInputField.class);
}
//视图操作的一个描述
@Override
public String getDescription() {
return "set text to LoginInputField";
}
//实际的一个操作,在之类我们就可以获取到操作的对象了。
@Override
public void perform(UiController uiController, View view) {
LoginInputField loginInputField = (LoginInputField)view;
loginInputField.getEditText().setText(text);
}
};
}