- 精通移動App測試實戰:技術、工具和案例
- 于涌 王磊 曹向志
- 1926字
- 2019-01-05 04:20:03
2.2 JUnit在Android開發中的應用
2.2.1 單元測試的重要性
前面我們提到了單元測試,那么什么叫單元測試呢?單元測試(Unit Testing),是指對軟件中的最小可測試單元進行的檢查和驗證。對于單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如在Java中單元指一個類,在C語言里單元指一個函數等。單元測試是在軟件開發過程中要進行的最低級別的測試活動,軟件的獨立單元將在與程序的其他部分相隔離的情況下進行測試。通常,我們在編寫大型應用系統的時候,都要寫成千上萬個方法或函數,這些方法或函數的功能通常都是有限的,但是它們卻是這個應用系統的根基,只有確保每一個函數或者方法都實現了其意圖,才能保證整個系統能夠正常、準確地運行。千里之堤潰于蟻穴,如果我們沒有對每一個細小的函數或者方法進行系統的單元測試,很有可能最后直接導致整個系統最終被淘汰的結果。由此可見,單元測試十分重要,也非常必要。
2.2.2 單元測試實施者
我們在進行軟件開發過程中,發現在不同的軟件企業可能會經常提到一個問題就是“單元測試”應該由誰來做?不同的軟件企業可能答案也是不一樣的,有的公司單元測試是由程序編寫人員實施,有的企業則是由測試人員來實施,我們說其實施的形式無所謂,關鍵是針對單元測試一定要有實施效果,經過單元測試后的源代碼的健壯性、穩定性、執行效率等方面一定要有提升的才是關鍵所在。也許我們聽說過有很多著名的國際軟件公司,它們的開發與測試人員的比例是10比1 ,20比1,有的甚至是50比1。看到這個數字,也許我們第一反應就是怎么可能?絕對不會吧?試想一下,如果自己的單位也這樣去做后果是什么樣呢?最后,我們可以得出一個一致的結論,對于我們公司若是這樣的人員配比,開發的軟件產品一定是一坨“屎”。結合作者以往在國內的一些中小型軟件企業的工作經歷來講,也同意大家得出的最后結論。為什么同樣的人員配比,在不同的軟件企業得到的最終產品會有如此之大的差異呢?根本原因就是大家對待單元測試的態度不同,最終導致的結果不同。在國內很多程序編寫人員認為凡是涉及到測試的,都應該由測試人員來做,不管是單元測試、功能測試、性能測試、安全性測試等統統應該由測試人員來搞,然而大多數公司在人員招聘的時候對測試人員的要求偏低,招聘的人員數量也較少,試想在招聘的時候僅僅要求做功能測試,公司3、5個人測試一個龐大的系統軟件,在時間少、任務重的情況下,這些測試人員哪有時間進行其他類型的測試,同時在沒有白盒測試經驗的積累情況下,突然要求測試人員做基于源代碼的單元測試工作是不是有點更加“搞笑”呢。與之不同,在國際上出名的一些大公司,它們的程序編寫人員是具備單元測試理論和實踐知識的,他們在編寫程序代碼的時候,就會對其實現的類的方法和模塊功能進行單元測試,他們不僅僅把實現其負責的軟件功能作為自己的工作內容,還把單元測試同樣作為其重要職責之一。而專業的測試人員則主要針對軟件集成、一些重要的容易被忽視的測試關鍵技術的應用做測試,這當然就減少了測試人員的工作量,也相應會提升測試產品的質量了。
由此,我們是不是能夠得到一些啟發呢?
單元測試應該是程序編寫人員必備的一項基本素質,所有的程序編寫人員應該把其作為自己工作內容的一部分,而專業的白盒測試人員也應該加強對程序編寫人員相關單元測試理論和實踐經驗的培訓與指導,不斷提升程序編寫人員的理論和實踐經驗。同時白盒測試人員應該更加關注系統的集成測試、接口測試和那些容易被程序編寫人員忽視的一些地方的測試工作。
2.2.3 單元測試測試哪些內容
我們在進行單元測試時,通常應把以下內容作為單元測試的重點。
(1)核心的類方法。
(2)異常處理內容。
(3)邊界條件。
(4)算法效率。
(5)業務邏輯。
(6)需求變動頻繁之處。
2.2.4 單元測試不測試哪些內容
我們在進行單元測試時,通常不應把以下內容作為單元測試的內容。
(1)不測構造函數。
(2)不測Setter()、Getter()方法。
(3)不測框架。
2.2.5 創建基于Android的測試項目
前面我們介紹了一些關于單元測試的知識,相信大家都已經理解了,現在就讓我們結合在1.5節實現的樣例程序,如圖2-2所示,作為我們使用JUnit進行單元測試的例子,來詳細向大家介紹JUnit在基于Android項目進行單元測試的應用。

圖2-2 兩整數求和運行后的界面顯示信息
讓我們再看一下這個小應用的完整實現源代碼。
MainActivity.java文件內容如下。
package com.yuy.calculatoroftwonum; import android.R.string; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { public int add(int num1, int num2){ return num1+num2; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button calc = (Button)findViewById(R.id.btncalc); calc.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub EditText t1 = (EditText)findViewById(R.id.edtnum1); EditText t2 = (EditText)findViewById(R.id.edtnum2); int a= Integer.parseInt(t1.getText().toString()); int b= Integer.parseInt(t2.getText().toString()); String s= Integer.toString(add(a, b)); Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show(); } } ); Button exit = (Button)findViewById(R.id.btnexit); exit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
- CorelDRAW X6圖形設計立體化教程
- IBM Cognos 8 Report Studio Cookbook
- Photoshop 2022從入門到精通
- Python 2.6 Graphics Cookbook
- UG NX 8.0基礎與實例教程
- 數碼攝影后期高手之路(第2版)
- 中文版CorelDRAW基礎培訓教程
- Joomla! Social Networking with JomSocial
- ADempiere 3.6 Cookbook
- 中文版Photoshop 2020完全自學教程
- SPSS統計分析從基礎到實踐
- The PEAR Installer Manifesto
- 邊做邊學:Photoshop CS6數碼藝術照片后期處理教程
- AutoCAD 2016入門與提高(超值版)
- IBM WebSphere eXtreme Scale 6