就知道,這肯定是杯假咖啡霹琼,搬磚還有時間喝咖啡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.運行該測試
觀察模擬器的動作變化
模擬器它會自動點擊按鈕并更改按鈕的文本內(nèi)容
運行結束觀察控制臺的測試結果
可以看到所有測試通過
進階使用
接下來我們實現(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("登錄成功")));
}
}
運行淌哟,它會自動填寫用戶名和密碼并點擊登錄按鈕
最后驗證登錄按鈕文本是否變?yōu)榈卿洺晒Γ纯纯刂婆_結果是pass的
上面只是介紹了Espresso的一小部分內(nèi)容辽故,關于Espresso還有更多的用法徒仓,不想看英文官方文檔的,為你準備一份中文文檔
下一篇博客會介紹在有網(wǎng)絡請求的情況下誊垢,我們怎么進行測試掉弛。因為并非所有的UI操作都是同步響應的症见。也就是說我們的UI更新需要等待網(wǎng)絡返回結果。如果我們直接測試殃饿,那么很大概率會報錯谋作,因為在我們要測試數(shù)據(jù)是否展示在UI上時,網(wǎng)絡數(shù)據(jù)很有可能還沒有獲取到乎芳。遵蚜。這種情況該怎么辦呢,好期待筆者的下篇博客哦[假裝很期待]