自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

編寫Android測試單元該做的和不該做的事

移動開發(fā) Android
在本文中, 我將根據(jù)我的實(shí)際經(jīng)驗(yàn),為大家闡述一個編寫測試用例的最佳實(shí)踐。在本文中我將使用 Espresso 編碼, 但是它們可以用到單元測試和儀器測試(instrumentation test)當(dāng)中。基于以上目的,我們來研究一個新聞程序。

[[183206]]

在本文中, 我將根據(jù)我的實(shí)際經(jīng)驗(yàn),為大家闡述一個編寫測試用例的***實(shí)踐。在本文中我將使用 Espresso 編碼, 但是它們可以用到單元測試和儀器測試(instrumentation test)當(dāng)中?;谝陨夏康?,我們來研究一個新聞程序。

以下內(nèi)容純屬虛構(gòu),如有雷同純屬巧合 :P

一個新聞 APP 應(yīng)該會有以下這些 activity。

  • 語言選擇 - 當(dāng)用戶***次打開軟件, 他必須至少選擇一種語言。選擇后,選項(xiàng)保存在共享偏好中,用戶跳轉(zhuǎn)到新聞列表 activity。
  • 新聞列表 - 當(dāng)用戶來到新聞列表 activity,將發(fā)送一個包含語言參數(shù)的請求到服務(wù)器,并將服務(wù)器返回的內(nèi)容顯示在 recycler view 上(包含有新聞列表的 id, news_list)。 如果共享偏好中未存語言參數(shù),或者服務(wù)器沒有返回一個成功消息, 就會彈出一個錯誤對話框并且 recycler view 將不可見。如果用戶只選擇了一種語言,新聞列表 activity 有個 “Change your Language” 的按鈕,或者如果用戶選擇多種語言,則按鈕為 “Change your Languages” 。 (我對天發(fā)誓這是一個虛構(gòu)的 APP 軟件)
  • 新聞細(xì)節(jié) - 如同名字所述, 當(dāng)用戶點(diǎn)選新聞列表項(xiàng)時將啟動這個 activity。

這個 APP 功能已經(jīng)足夠,,讓我們深入研究下為新聞列表 activity 編寫的測試用例。 這是我***次寫的代碼。

  1. /* 
  2.     Click on the first news item. 
  3.     It should open NewsDetailActivity 
  4.      */ 
  5.     @Test 
  6.     public void testClickOnAnyNewsItem() { 
  7.         onView(allOf(withId(R.id.news_list), isDisplayed())).perform(RecyclerViewActions 
  8.                 .actionOnItemAtPosition(1, click())); 
  9.         intended(hasComponent(NewsDetailsActivity.class.getName())); 
  10.     } 
  11.   /** 
  12.    * To test the correct text on the button 
  13.    */ 
  14.   @Test 
  15.   public void testChangeLanguageFeature() { 
  16.     int count = UserPreferenceUtil.getSelectedLanguagesCount(); 
  17.     if (count == 1) { 
  18.       onView(withText("Choose your Language")).check(matches(isDisplayed())); 
  19.     } else if (count > 1) { 
  20.       onView(withText("Choose your Languages")).check(matches(isDisplayed())); 
  21.     } 
  22.  ?} 

仔細(xì)想想測試什么

在***個測試用例 testClickOnAnyNewsItem(), 如果服務(wù)器沒有返回成功信息,測試用例將會返回失敗,因?yàn)?recycler view 是不可見的。但是這個測試用例的目的并非如此。 不管該用例為 PASS 還是 FAIL,它的***要求是 recycler view 總是可見的, 如果因某種原因,recycler view 不可見,那么測試用例不應(yīng)視為 FAILED。正確的測試代碼應(yīng)該像下面這個樣子。

  1.  /* 
  2.   Click on any news item. 
  3.   It should open NewsDetailActivity 
  4.    */ 
  5.   @Test 
  6.   public void testClickOnAnyNewsItem() { 
  7.     try { 
  8.             /*To test this case, we need to have recyclerView present. If we don't have the 
  9.             recyclerview present either due to the presence of error_screen, then we should consider 
  10.             this test case successful. The test case should be unsuccesful only when we click on a 
  11.             news item and it doesn't open NewsDetail activity 
  12.             */ 
  13.       ViewInteraction viewInteraction = onView(withId(R.id.news_list)); 
  14.       viewInteraction.check(matches(isDisplayed())); 
  15.     } catch (NoMatchingViewException e) { 
  16.       return
  17.     } catch (AssertionFailedError e) { 
  18.       return
  19.     } 
  20.     //在這里我們確信,news_list的 recyclerview 對用戶是可見的。 
  21.     onView(allOf(withId(R.id.news_list), isDisplayed())).perform(RecyclerViewActions 
  22.         .actionOnItemAtPosition(1, click())); 
  23.     intended(hasComponent(NewsDetailsActivity.class.getName())); 
  24.   } 

一個測試用例本身應(yīng)該是完整的

當(dāng)我開始測試, 我通常按如下順序測試 activity:

  • 語言選擇
  • 新聞列表
  • 新聞細(xì)節(jié)

因?yàn)槲沂紫葴y試語言選擇 activity,在測試 NewsList activity 之前,總有一種語言已經(jīng)是選擇好了的。但是當(dāng)我先測試新聞列表 activity 時,測試用例開始返回錯誤信息。原因很簡單 - 沒有選擇語言,recycler view 不會顯示。注意, 測試用例的執(zhí)行順序不能影響測試結(jié)果。 因此在運(yùn)行測試用例之前, 語言選項(xiàng)必須是保存在共享偏好中的。在本例中,測試用例獨(dú)立于語言選擇 activity 的測試。

  1. @Rule 
  2.   public ActivityTestRule activityTestRule = 
  3.       new ActivityTestRule(TopicsActivity.class, falsefalse); 
  4.   /* 
  5.   Click on any news item. 
  6.   It should open NewsDetailActivity 
  7.    */ 
  8.   @Test 
  9.   public void testClickOnAnyNewsItem() { 
  10.     UserPreferenceUtil.saveUserPrimaryLanguage("english"); 
  11.     Intent intent = new Intent(); 
  12.     activityTestRule.launchActivity(intent); 
  13.     try { 
  14.       ViewInteraction viewInteraction = onView(withId(R.id.news_list)); 
  15.       viewInteraction.check(matches(isDisplayed())); 
  16.     } catch (NoMatchingViewException e) { 
  17.       return
  18.     } catch (AssertionFailedError e) { 
  19.       return
  20.     } 
  21.     onView(allOf(withId(R.id.news_list), isDisplayed())).perform(RecyclerViewActions 
  22.         .actionOnItemAtPosition(1, click())); 
  23.     intended(hasComponent(NewsDetailsActivity.class.getName())); 
  24.  ?} 

在測試用例中避免使用條件代碼

現(xiàn)在在第二個測試用例 testChangeLanguageFeature() 中,我們獲取到用戶選擇語言的個數(shù),基于這個數(shù)目,我們寫了 if-else 條件來進(jìn)行測試。 但是 if-else 條件應(yīng)該寫在你的代碼當(dāng)中,而不是測試代碼里。每一個條件應(yīng)該單獨(dú)測試。 因此,在本例中,不是只寫一條測試用例,而是要寫如下兩個測試用例。

  1. /** 
  2.    * To test the correct text on the button when only one language is selected. 
  3.    */ 
  4.   @Test 
  5.   public void testChangeLanguageFeatureForSingeLanguage() { 
  6.     //Other initializations 
  7.     UserPreferenceUtil.saveSelectedLanguagesCount(1); 
  8.     Intent intent = new Intent(); 
  9.     activityTestRule.launchActivity(intent); 
  10.       onView(withText("Choose your Language")).check(matches(isDisplayed())); 
  11.   } 
  12.   /** 
  13.    * To test the correct text on the button when more than one language is selected. 
  14.    */ 
  15.   @Test 
  16.   public void testChangeLanguageFeatureForMultipleLanguages() { 
  17.     //Other initializations 
  18.     UserPreferenceUtil.saveSelectedLanguagesCount(5); //Write anything greater than 1. 
  19.     Intent intent = new Intent(); 
  20.     activityTestRule.launchActivity(intent); 
  21.     onView(withText("Choose your Languages")).check(matches(isDisplayed())); 
  22.   } 

測試用例應(yīng)該獨(dú)立于外部因素

在大多數(shù)應(yīng)用中,我們與外部網(wǎng)絡(luò)或者數(shù)據(jù)庫進(jìn)行交互。一個測試用例運(yùn)行時可以向服務(wù)器發(fā)送一個請求,并獲取成功或失敗的返回信息。但是不能因從服務(wù)器獲取到失敗信息,就認(rèn)為測試用例沒有通過。這樣想這個問題 - 如果測試用例失敗,然后我們修改客戶端代碼,以便測試用例通過。 但是在本例中, 我們要在客戶端進(jìn)行任何更改嗎?- NO。

但是你應(yīng)該也無法完全避免要測試網(wǎng)絡(luò)請求和響應(yīng)。由于服務(wù)器是一個外部代理,我們可以設(shè)想一個場景,發(fā)送一些可能導(dǎo)致程序崩潰的錯誤響應(yīng)。因此,你寫的測試用例應(yīng)該覆蓋所有可能來自服務(wù)器的響應(yīng),甚至包括服務(wù)器決不會發(fā)出的響應(yīng)。這樣可以覆蓋所有代碼,并能保證應(yīng)用可以處理所有響應(yīng),而不會崩潰。

正確的編寫測試用例與編寫這些測試代碼同等重要。

感謝你閱讀此文章。希望對測試用例寫的更好有所幫助。你可以在 LinkedIn 上聯(lián)系我。還可以在這里閱讀我的其他文章。

獲取更多資訊請關(guān)注我們, 我們發(fā)新文章時您將獲得通知。 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2013-09-24 13:58:29

OpenStackIaaS開源云計(jì)算

2011-05-27 16:14:25

設(shè)計(jì)技巧UIAndroid

2013-08-08 10:27:03

云計(jì)算

2011-05-05 09:19:00

2010-10-29 09:08:57

PHPMySQL

2021-12-19 22:31:01

Windows 11Windows微軟

2024-01-19 08:44:54

人工智能OpenAIChatGPT

2011-06-10 09:27:19

iOS 5Twitter

2021-03-06 13:34:20

網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊漏洞

2014-06-24 13:17:50

實(shí)施CRM

2020-07-14 08:16:13

代碼互聯(lián)網(wǎng) PC

2012-09-19 13:08:03

技術(shù)管理程序員

2018-03-07 12:57:55

服務(wù)器RAID磁盤

2022-04-13 10:37:34

首席信息官IT企業(yè)

2011-06-30 15:06:19

SEO

2014-08-22 11:22:09

開發(fā)者

2018-09-11 15:10:31

人工智能機(jī)器人深度學(xué)習(xí)

2010-11-18 11:01:49

面試

2021-12-22 17:45:30

漏洞網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2015-01-07 10:33:17

公共云綠色云云計(jì)算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號