Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發之在Eclipse中單元測試,在Class中進行單元測試與Activity中單元測試

Android開發之在Eclipse中單元測試,在Class中進行單元測試與Activity中單元測試

編輯:關於Android編程

我們在進行項目開發時,為了提高項目開發效率,方便項目測試中的局部代碼功能測試會用到單元測試。這樣就不用重新運行一遍整個項目。長期以此我們會就節省大量的時間去做其他的事。

首先來介紹一下如何進行單元測試:

A . 創建一個Android項目,我這裡為TestDemo;

B . 配置AndroidManifest

C . 創建測試Class與測試Activity

D . 創建Android Junit Test 與 Android Application

 

這是我的項目結構,並且創建了MainActivity,TestActivity ,TestClass

\

1.在AndroidManifest配置單元測試

 



    

    

    
        
        
        
            
                

                
            
        

        
        
    

    
    


代碼1: Android:name="android.test.runner"/>代表把單元測試框架中的一些依賴庫引入進來

 

代碼2 :代表配置單元測試框架的啟動裝置,啟動裝置有好幾個類,可以選擇,一般情況下我們使用上面這個。

這裡需要注意targetPackage中的包名要與項目包名一致;我這裡都是com.example.testdemo

 

2.開始編寫測試代碼

MainActivity . class :


public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { open(); } catch (Exception e) { e.printStackTrace(); } } public void open() throws Exception { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { String sdStatus = Environment.getExternalStorageState(); if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 檢測sd是否可用 Log.i("TestFile", "SD card is not avaiable/writeable right now."); return; } String name = new android.text.format.DateFormat().format( "yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg"; Toast.makeText(this, name, Toast.LENGTH_LONG).show(); Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data");// 獲取相機返回的數據,並轉換為Bitmap圖片格式 FileOutputStream b = null; File file = new File("/sdcard/myImage/"); file.mkdirs();// 創建文件夾 String fileName = "/sdcard/myImage/" + name; try { b = new FileOutputStream(fileName); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把數據寫入文件 } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { b.flush(); b.close(); } catch (IOException e) { e.printStackTrace(); } } } } }

 


這裡我調用了攝像頭的測試功能,是想展示單元測試如何在Activity進行並且是否可以測試硬件功能。

 

 

TestActivity .class :

 

public class TestActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		try {
			open();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void open() throws Exception {
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		startActivityForResult(intent, 1);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == Activity.RESULT_OK) {
			String sdStatus = Environment.getExternalStorageState();
			if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 檢測sd是否可用
				Log.i("TestFile",
						"SD card is not avaiable/writeable right now.");
				return;
			}
			String name = new android.text.format.DateFormat().format(
					"yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA))
					+ ".jpg";
			Toast.makeText(this, name, Toast.LENGTH_LONG).show();
			Bundle bundle = data.getExtras();
			Bitmap bitmap = (Bitmap) bundle.get("data");// 獲取相機返回的數據,並轉換為Bitmap圖片格式

			FileOutputStream b = null;	
			File file = new File("/sdcard/myImage/");
			file.mkdirs();// 創建文件夾
			String fileName = "/sdcard/myImage/" + name;

			try {
				b = new FileOutputStream(fileName);
				bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把數據寫入文件
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} finally {
				try {
					b.flush();
					b.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

		}
	}

}

其實TestActivity與MainActivity中的代碼是一樣的,這是只是想展示如何切換Activity間的測試,這個問題我糾結了半天,所以我不希望這個問題困惑到大家。

 

 

TestClass.class :

 

public class TestClass extends AndroidTestCase {

	private List list;

	//這個方法是正常執行的
	public void test_1() throws Exception {
		list = new ArrayList();
		list.add("他們都說蔡睿智很帥,但他總覺得自己很丑");
		list.add("他們都說蔡睿智是男神,但他總覺得自己是男生");
		list.get(0);
	}
	
	//這個方法會拋出數組下標越界異常
	public void test_2() throws Exception {
		list = new ArrayList();
		list.add("蔡睿智不是男神");
		list.add("蔡睿智是男生");
		list.add("蔡睿智貌似是gay");
		list.get(4);
	}

	//這個數組會拋出空指針異常
	public void test_3() throws Exception{
		List list = null;
		list.add("蔡睿智是彎的");
	}

}

下來我們進行測試操作:首先進行Activity的單元測試,選中MainActivity,會在Outline中出現這個類的目錄結構,

 

\

然後右擊紅色框選的MainActivity,選中Run As選項來添加測試類。

\

這裡需要注意的是 Launch 這個選項即是我們要測的那個activity,這個是根據在AndroidManifest中的這段代碼來選擇的測試Activity的

 

            
                

                
            

然後點擊Run來測試我們指定的Activity。

 

 

\接下來介紹Class的測試步驟:同樣的選中的TestClass,在Outline中右擊TestClass,選擇Run AS
\
我這裡直接選擇的單個的class測試的,注意Instrumentation runner這個選項,如果沒有的話,就去檢查一下AndroidManifest中的Instrumentation是否寫在了Application裡面。然後運行

TestClass的測試結果如下:

\

Test_1的方法拋出了數組下標越界的異常。




\

 

 

Test_2的方法拋出了空指針的異常。

 

寫到這裡關於Android的單元測試都寫完了,歡迎大家提出自己的意見相互交流,共勉。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved