搬磚之余來一杯意式濃縮咖啡(Espresso基礎用法)

就知道,這肯定是杯假咖啡霹琼,搬磚還有時間喝咖啡N癜痢A沟薄!

年輕人售葡,別急躁看杭,工欲善其事必先利其器√焱ǎ看完之后泊窘,你會發(fā)現(xiàn)可能真的可以空出一大把時間去喝咖啡了。

我信了你的邪了像寒。

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

  • 何為意式濃縮咖啡(Espresso)
  • 幾種UI自動化測試工具的比較
  • 基礎用法
  • 進階使用

何為意式濃縮咖啡(Espresso)?

Espresso是Google的開源自動化測試框架烘豹。相對于Robotium和UIAutomator,它的特點是規(guī)模更小诺祸、更簡潔携悯,API更加精確,編寫測試代碼簡單筷笨,容易快速上手憔鬼。因為是基于Instrumentation的,所以不能跨App胃夏。

幾種UI自動化測試工具的比較

那相比較其他自動化測試工具轴或,有什么不一樣呢?

Monkey

Monkey是Android SDK自帶的測試工具仰禀,在測試過程中會向系統(tǒng)發(fā)送偽隨機的用戶事件流照雁,如按鍵輸入、觸摸屏輸入答恶、手勢輸入等)饺蚊,實現(xiàn)對正在開發(fā)的應用程序進行壓力測試,也有日志輸出悬嗓。實際上該工具只能做程序做一些壓力測試污呼,由于測試事件和數(shù)據(jù)都是隨機的,不能自定義包竹,所以有很大的局限性燕酷。

Instrumentation

Instrumentation是早期Google提供的Android自動化測試工具類,雖然在那時候JUnit也可以對Android進行測試周瞎,但是Instrumentation允許你對應用程序做更為復雜的測試悟狱,甚至是框架層面的。通過Instrumentation你可以模擬按鍵按下堰氓、抬起挤渐、屏幕點擊、滾動等事件双絮。Instrumentation是通過將主程序和測試程序運行在同一個進程來實現(xiàn)這些功能浴麻,你可以把Instrumentation看成一個類似Activity或者Service并且不帶界面的組件得问,在程序運行期間監(jiān)控你的主程序。缺點是對測試人員來說編寫代碼能力要求較高软免,需要對Android相關知識有一定了解宫纬,還需要配置AndroidManifest.xml文件,不能跨多個App膏萧。

UiAutomator

UiAutomator也是Android提供的自動化測試框架漓骚,基本上支持所有的Android事件操作,對比Instrumentation它不需要測試人員了解代碼實現(xiàn)細節(jié)(可以用UiAutomatorviewer抓去App頁面上的控件屬性而不看源碼)榛泛。基于Java蝌蹂,測試代碼結構簡單、編寫容易曹锨、學習成本孤个,一次編譯,所有設備或模擬器都能運行測試沛简,能跨App(比如:很多App有選擇相冊齐鲤、打開相機拍照,這就是跨App測試)椒楣。缺點是只支持SDK 16(Android 4.1)及以上给郊,不支持Hybird App、WebApp捧灰。

配置Espresso

1.打開app/build.gradle

在dependencies節(jié)點下添加以下庫:

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

觀察模擬器的動作變化

模擬器它會自動點擊按鈕并更改按鈕的文本內(nèi)容

運行結束觀察控制臺的測試結果

可以看到所有測試通過


test result.png

進階使用

接下來我們實現(xiàn)一個登錄的測試

修改MainActivity

如果用戶名為jasonking跪另,密碼為123拧抖,則登錄按鈕文本變?yōu)榈卿洺晒Γ駝t變?yōu)榈卿浭?/p>

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

最后驗證登錄按鈕文本是否變?yōu)榈卿洺晒Γ纯纯刂婆_結果是pass的

上面只是介紹了Espresso的一小部分內(nèi)容辽故,關于Espresso還有更多的用法徒仓,不想看英文官方文檔的,為你準備一份中文文檔

Espresso中文文檔

下一篇博客會介紹在有網(wǎng)絡請求的情況下誊垢,我們怎么進行測試掉弛。因為并非所有的UI操作都是同步響應的症见。也就是說我們的UI更新需要等待網(wǎng)絡返回結果。如果我們直接測試殃饿,那么很大概率會報錯谋作,因為在我們要測試數(shù)據(jù)是否展示在UI上時,網(wǎng)絡數(shù)據(jù)很有可能還沒有獲取到乎芳。遵蚜。這種情況該怎么辦呢,好期待筆者的下篇博客哦[假裝很期待]

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奈惑,一起剝皮案震驚了整個濱河市吭净,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌携取,老刑警劉巖攒钳,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雷滋,居然都是意外死亡不撑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門晤斩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焕檬,“玉大人,你說我怎么就攤上這事澳泵∈涤蓿” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵兔辅,是天一觀的道長腊敲。 經(jīng)常有香客問我,道長维苔,這世上最難降的妖魔是什么碰辅? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮介时,結果婚禮上没宾,老公的妹妹穿的比我還像新娘。我一直安慰自己沸柔,他們只是感情好循衰,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著褐澎,像睡著了一般会钝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上工三,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天顽素,我揣著相機與錄音咽弦,去河邊找鬼。 笑死胁出,一個胖子當著我的面吹牛型型,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播全蝶,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闹蒜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抑淫?” 一聲冷哼從身側響起绷落,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎始苇,沒想到半個月后砌烁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡催式,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年函喉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荣月。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡管呵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哺窄,到底是詐尸還是另有隱情捐下,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布萌业,位于F島的核電站坷襟,受9級特大地震影響,放射性物質發(fā)生泄漏生年。R本人自食惡果不足惜婴程,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晶框。 院中可真熱鬧排抬,春花似錦懂从、人聲如沸授段。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侵贵。三九已至,卻和暖如春缘薛,著一層夾襖步出監(jiān)牢的瞬間窍育,已是汗流浹背卡睦。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漱抓,地道東北人表锻。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像乞娄,于是被迫代替她去往敵國和親瞬逊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容