搬砖之余来一杯意式浓缩咖啡(Espresso基础用法)

就知道,这肯定是杯假咖啡,搬砖还有时间喝咖啡!!!

年轻人,别急躁,工欲善其事必先利其器。看完之后,你会发现可能真的可以空出一大把时间去喝咖啡了。

我信了你的邪了。

......,不信?你就往下看呗

  • 何为意式浓缩咖啡(Espresso)
  • 几种UI自动化测试工具的比较
  • 基础用法
  • 进阶使用

何为意式浓缩咖啡(Espresso)?

Espresso是Google的开源自动化测试框架。相对于Robotium和UIAutomator,它的特点是规模更小、更简洁,API更加精确,编写测试代码简单,容易快速上手。因为是基于Instrumentation的,所以不能跨App

几种UI自动化测试工具的比较

那相比较其他自动化测试工具,有什么不一样呢?

Monkey

Monkey是Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出。实际上该工具只能做程序做一些压力测试,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性

Instrumentation

Instrumentation是早期Google提供的Android自动化测试工具类,虽然在那时候JUnit也可以对Android进行测试,但是Instrumentation允许你对应用程序做更为复杂的测试,甚至是框架层面的。通过Instrumentation你可以模拟按键按下、抬起、屏幕点击、滚动等事件。Instrumentation是通过将主程序和测试程序运行在同一个进程来实现这些功能,你可以把Instrumentation看成一个类似Activity或者Service并且不带界面的组件,在程序运行期间监控你的主程序。缺点是对测试人员来说编写代码能力要求较高,需要对Android相关知识有一定了解,还需要配置AndroidManifest.xml文件,不能跨多个App

UiAutomator

UiAutomator也是Android提供的自动化测试框架,基本上支持所有的Android事件操作,对比Instrumentation它不需要测试人员了解代码实现细节(可以用UiAutomatorviewer抓去App页面上的控件属性而不看源码)。基于Java,测试代码结构简单、编写容易、学习成本,一次编译,所有设备或模拟器都能运行测试,能跨App(比如:很多App有选择相册、打开相机拍照,这就是跨App测试)。缺点是只支持SDK 16(Android 4.1)及以上,不支持Hybird App、WebApp

配置Espresso

1.打开app/build.gradle

在dependencies节点下添加以下库:

androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
androidTestCompile 'com.android.support.test:rules:1.0.2'

2.在android.defaultConfig下添加下面的代码
 defaultConfig {
        //...省略
       "android.support.test.runner.AndroidJUnitRunner"
    }

基础用法

下面写一个简单的Demo来学习一下它的基础用法

1.先写一个Activity用来测试

里面有一个按钮,点击它,里面的文本会改变

MainActivity的代码如下,xml文件省略

public class MainActivity extends AppCompatActivity {
    Button btClick;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btClick=(Button)findViewById(R.id.bt_click);
        btClick.setText("click me");
    }
    
    public void clickButton(View view){
        btClick.setText("learn espresso");
    }
}

2.在src/androidTest/java/com.example.package/路径下新建一个测试类

MyEspressoTest.class

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MyEspressoTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class);
    
    @Test
    public void clickButton(){

        //检查文本是不是Hello World,并点击一下按钮
        onView(withId(R.id.bt_click))
                .check(matches(withText("Hello World!")))
                .perform(click());

        //检验按钮上的文本是否修改
        onView(withId(R.id.bt_click))
                .check(matches(withText("learn espresso")));


    }
}
3.运行该测试
run test.png

观察模拟器的动作变化

模拟器它会自动点击按钮并更改按钮的文本内容

运行结束观察控制台的测试结果

可以看到所有测试通过


test result.png

进阶使用

接下来我们实现一个登录的测试

修改MainActivity

如果用户名为jasonking,密码为123,则登录按钮文本变为登录成功,否则变为登录失败

MainActivity.class

public class MainActivity extends AppCompatActivity {
    EditText edName;
    EditText edPass;
    Button btClick;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btClick=(Button)findViewById(R.id.bt_click);
        edName=(EditText) findViewById(R.id.ed_username);
        edPass=(EditText) findViewById(R.id.ed_pass);
        btClick.setText("登录");
    }

    public void clickButton(View view){
        if(edName.getText().toString().equals("jasonking")&&edPass.getText().toString().equals("123")){
            btClick.setText("登录成功");
        }else{
            btClick.setText("登录失败");
        }
    }
}

修改测试类

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MyEspressoTest {
    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void clickLogin(){
        //清空文本框,然后输入用户名jasonking,关闭软键盘
        onView(withId(R.id.ed_username))
                .perform(
                        clearText(),
                        replaceText("jasonking"),
                        closeSoftKeyboard()
                )
                .check(matches(withText("jasonking")));
        
        //清空文本框,然后输入密码123,关闭软键盘
        onView(withId(R.id.ed_pass))
                .perform(
                        clearText(),
                        replaceText("123"),
                        closeSoftKeyboard()
                )
                .check(matches(withText("123")));



        //点击按钮检查文本是不是登录
        onView(withId(R.id.bt_click))
                .check(matches(withText("登录")))
                .perform(click());

        //检验按钮上的文本是不是登录成功
        onView(withId(R.id.bt_click))
                .check(matches(withText("登录成功")));
    }
}

运行,它会自动填写用户名和密码并点击登录按钮

test screen.png

最后验证登录按钮文本是否变为登录成功,看看控制台结果是pass的

上面只是介绍了Espresso的一小部分内容,关于Espresso还有更多的用法,不想看英文官方文档的,为你准备一份中文文档

Espresso中文文档

下一篇博客会介绍在有网络请求的情况下,我们怎么进行测试。因为并非所有的UI操作都是同步响应的。也就是说我们的UI更新需要等待网络返回结果。如果我们直接测试,那么很大概率会报错,因为在我们要测试数据是否展示在UI上时,网络数据很有可能还没有获取到。。这种情况该怎么办呢,好期待笔者的下篇博客哦[假装很期待]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容