免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

android單元測試

 軟件團隊頭目 2012-01-09
測試相關(guān)資源
讓開發(fā)自動化: 用 Eclipse 插件提高代碼質(zhì)量http://www.ibm.com/developerworks/cn/java/j-ap01117/index.html

代碼測試覆蓋率介紹:http://www.cnblogs.com/coderzh/archive/2009/03/29/1424344.html


學(xué)習(xí)android單元測試時遇到的一些問題:
1.開始以為單元測試一定要從程序的launch Activity,一步一步的跳轉(zhuǎn)到所要測試的Activity能對其進(jìn)行測試。
但實際上,我們可以從任意一個activity開始,對任意一個activity進(jìn)行測試。

2.在運行單元測試之前,一定要先將要測試的程序安裝到模擬器或真機上。

junit相關(guān)
android中的測試框架是擴展的junit3,所以在學(xué)習(xí)android中的單元測試簽,可以先熟悉下junit3的使用,junit3要學(xué)習(xí)的東西應(yīng)該并不多,就幾頁紙的東西。入門可以參考這個:http://android.blog.51cto.com/268543/49994

android單元測試框架中涉及的注解
@Suppress 可以用在類或這方法上,這樣該類或者該方法就不會被執(zhí)行
@UiThreadTest 可以用在方法上,這樣該方法就會在程序的ui線程上執(zhí)行
@LargeTest, @MediumTest, @SmallTest 用在方法上,標(biāo)記所屬的測試類型,主要是用于單獨執(zhí)行其中的某一類測試時使用。具體參考InstrumentationTestRunner類的文檔。
@Smoke 具體用法還不清楚

android單元測試框架中涉及的一些類的uml


接下來我們以demo project來講解如何使用android中的單元測試
主要包括了三個activity:
MainActivity:僅包含一個button,點擊后就可以進(jìn)入LoginActivity

LoginActivity:可以輸入username, password,然后點擊submit的話可進(jìn)入HomeActivity,如果點擊reset的話,輸入的內(nèi)容就會被清空

HomeActivity:在TextView中顯示LoginActivity輸入的內(nèi)容

首先我們創(chuàng)建要測試的項目demo(使用了2.1)





MainActivity代碼
Java代碼  收藏代碼
  1. public class MainActivity extends Activity {  
  2.     private static final boolean DEBUG = true;  
  3.     private static final String TAG = "-- MainActivity";  
  4.   
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         if (DEBUG) {  
  8.             Log.i(TAG, "onCreate");  
  9.         }  
  10.   
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.act_main);  
  13.         View toLoginView = findViewById(R.id.to_login);  
  14.         toLoginView.setOnClickListener(new View.OnClickListener() {  
  15.             public void onClick(View view) {  
  16.                 if (DEBUG) {  
  17.                     Log.i(TAG, "toLoginView clicked");  
  18.                 }  
  19.   
  20.                 Intent intent = new Intent(getApplicationContext(), LoginActivity.class);  
  21.                 startActivity(intent);  
  22.             }  
  23.         });  
  24.     }  
  25. }  

MainActivity的布局文件
Xml代碼  收藏代碼
  1. <LinearLayout  
  2.     xmlns:android="http://schemas./apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5. >  
  6.     <Button  
  7.         android:id="@+id/to_login"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_gravity="bottom"  
  11.         android:text="to login" />  
  12. </LinearLayout>  



LoginActivity代碼
Java代碼  收藏代碼
  1. public class LoginActivity extends Activity {  
  2.     private static final boolean DEBUG = true;  
  3.     private static final String TAG = "-- LoginActivity";  
  4.   
  5.     private EditText mUsernameView;  
  6.     private EditText mPasswordView;  
  7.   
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         if (DEBUG) {  
  11.             Log.i(TAG, "onCreate");  
  12.         }  
  13.   
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.act_login);  
  16.         mUsernameView = (EditText) findViewById(R.id.username);  
  17.         mPasswordView = (EditText) findViewById(R.id.password);  
  18.   
  19.         View submitView = findViewById(R.id.submit);  
  20.         submitView.setOnClickListener(new View.OnClickListener() {  
  21.             public void onClick(View view) {  
  22.                 if (DEBUG) {  
  23.                     Log.i(TAG, "submitView clicked");  
  24.                 }  
  25.   
  26.                 Intent intent = new Intent(getApplicationContext(), HomeActivity.class);  
  27.                 intent.putExtra(HomeActivity.EXTRA_USERNAME, mUsernameView.getText().toString());  
  28.                 intent.putExtra(HomeActivity.EXTRA_PASSWORD, mPasswordView.getText().toString());  
  29.                 startActivity(intent);  
  30.             }  
  31.         });  
  32.   
  33.         View resetView = findViewById(R.id.reset);  
  34.         resetView.setOnClickListener(new View.OnClickListener() {  
  35.             public void onClick(View view) {  
  36.                 if (DEBUG) {  
  37.                     Log.i(TAG, "resetView clicked");  
  38.                 }  
  39.   
  40.                 mUsernameView.setText("");  
  41.                 mPasswordView.setText("");  
  42.                 mUsernameView.requestFocus();  
  43.             }  
  44.         });  
  45.     }  
  46. }  

LoginActivity的布局文件
Xml代碼  收藏代碼
  1. <LinearLayout  
  2.     xmlns:android="http://schemas./apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical"  
  6. >  
  7.     <TextView  
  8.         android:id="@+id/label_username"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:text="username:" />  
  12.           
  13.     <EditText  
  14.         android:id="@+id/username"  
  15.         android:layout_width="fill_parent"  
  16.         android:layout_height="wrap_content"  
  17.         android:inputType="text" />  
  18.           
  19.     <TextView  
  20.         android:id="@+id/label_password"  
  21.         android:layout_width="fill_parent"  
  22.         android:layout_height="wrap_content"  
  23.         android:text="password:" />  
  24.           
  25.     <EditText  
  26.         android:id="@+id/password"  
  27.         android:layout_width="fill_parent"  
  28.         android:layout_height="wrap_content"  
  29.         android:inputType="textPassword" />  
  30.           
  31.     <Button  
  32.         android:id="@+id/submit"  
  33.         android:layout_width="fill_parent"  
  34.         android:layout_height="wrap_content"  
  35.         android:text="submit" />  
  36.           
  37.     <Button  
  38.         android:id="@+id/reset"  
  39.         android:layout_width="fill_parent"  
  40.         android:layout_height="wrap_content"  
  41.         android:text="reset" />  
  42. </LinearLayout>  



HomeActivity代碼
Java代碼  收藏代碼
  1. public class HomeActivity extends Activity {  
  2.     private static final boolean DEBUG = true;  
  3.     private static final String TAG = "-- HomeActivity";  
  4.   
  5.     public static final String EXTRA_USERNAME = "yuan.activity.username";  
  6.     public static final String EXTRA_PASSWORD = "yuan.activity.password";  
  7.   
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         if (DEBUG) {  
  11.             Log.i(TAG, "onCreate");  
  12.         }  
  13.         super.onCreate(savedInstanceState);  
  14.         Intent intent = getIntent();  
  15.         StringBuilder sb = new StringBuilder();  
  16.         sb.append("username:").append(intent.getStringExtra(EXTRA_USERNAME)).append("\n");  
  17.         sb.append("password:").append(intent.getStringExtra(EXTRA_PASSWORD));  
  18.   
  19.         setContentView(R.layout.act_home);  
  20.         TextView loginContentView = (TextView) findViewById(R.id.login_content);  
  21.         loginContentView.setText(sb.toString());  
  22.     }  
  23. }  

HomeActivity的布局文件
Xml代碼  收藏代碼
  1. <LinearLayout  
  2.     xmlns:android="http://schemas./apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5. >  
  6.     <TextView  
  7.         android:id="@+id/login_content"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_gravity="center_vertical"  
  11.         android:gravity="center"  
  12.         android:textColor="#EEE"  
  13.         android:textStyle="bold"  
  14.         android:textSize="25sp" />  
  15. </LinearLayout>  



程序非常簡單,接下來我們?yōu)閐emo創(chuàng)建單元測試工程demo_unittest

選擇之前創(chuàng)建的工程demo,然后eclipse會自動幫我們設(shè)定api level,包名等。(測試用例的包名一般就是在要測試類的包名后加上test)




創(chuàng)建完后eclipse會自動為我們創(chuàng)建好所需的目錄,Manifest.xml文件


接下來就是為要測試的類編寫測試用例。關(guān)于要用哪個測試用例類,在第一張UML圖中也做了簡要的說明。
ActivityInstrumentationTestCase2:主要是用于進(jìn)行activity的功能測試,和activity的交互測試,如activity間的跳轉(zhuǎn),ui的交互等。

ActivityInstrumentationTestCase:這個類現(xiàn)在已deprecated了,所以不許考慮。

SingleLaunchActivityTestCase:該測試用例僅掉用setUp和tearDown一次,而不像其它測試用例類一樣,沒調(diào)用一次測試方法就會重新調(diào)用一次setUp和tearDown。所以主要測試activity是否能夠正確處理多次調(diào)用。

ActivityUnitTestCase:主要用于測試Activity,因為它允許注入MockContext和MockApplicaton,所以可以測試Activity在不同資源和應(yīng)用下的情況。

還有Application等的測試用例比較簡單,看uml圖。如果覺得不夠詳細(xì),可以參考sdk文檔的dev guide和api reference。

MainActivityTest測試用例
Java代碼  收藏代碼
  1. public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {  
  2.     private static final String TAG = "=== MainActivityTest";  
  3.   
  4.     private Instrumentation mInstrument;  
  5.     private MainActivity mActivity;  
  6.     private View mToLoginView;  
  7.   //必不可少的東西, 不要忘記
  8.     public MainActivityTest() {  
  9.         super("yuan.activity", MainActivity.class);  
  10.     }  
  11.   
  12.     @Override  
  13.     public void setUp() throws Exception {  
  14.         super.setUp();  
  15.         mInstrument = getInstrumentation();  
  16.         // 啟動被測試的Activity  
  17.         mActivity = getActivity();  
  18.         mToLoginView = mActivity.findViewById(yuan.activity.R.id.to_login);  
  19.     }  
  20.   
  21.     public void testPreConditions() {  
  22.         // 在執(zhí)行測試之前,確保程序的重要對象已被初始化  
  23.         assertTrue(mToLoginView != null);  
  24.     }  
  25.   
  26.   
  27.     //mInstrument.runOnMainSync(new Runnable() {  
  28.     //  public void run() {  
  29.     //      mToLoginView.requestFocus();  
  30.     //      mToLoginView.performClick();  
  31.     //  }  
  32.     //});  
  33.     @UiThreadTest  
  34.     public void testToLogin() {  
  35.         // @UiThreadTest注解使整個方法在UI線程上執(zhí)行,等同于上面注解掉的代碼  
  36.         mToLoginView.requestFocus();  
  37.         mToLoginView.performClick();  
  38.     }  
  39.   
  40.     @Suppress  
  41.     public void testNotCalled() {  
  42.         // 使用了@Suppress注解的方法不會被測試  
  43.         Log.i(TAG, "method 'testNotCalled' is called");  
  44.     }  
  45.   
  46.     @Override  
  47.     public void tearDown() throws Exception {  
  48.         super.tearDown();  
  49.     }  
  50. }  


LoginActivityTest測試用例
Java代碼  收藏代碼
  1. public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {  
  2.     private static final String TAG = "=== LoginActivityTest";  
  3.   
  4.     private Instrumentation mInstrument;  
  5.     private LoginActivity mActivity;  
  6.     private EditText mUsernameView;  
  7.     private EditText mPasswordView;  
  8.     private View mSubmitView;  
  9.     private View mResetView;  
  10.   
  11.     public LoginActivityTest() {  
  12.         super("yuan.activity", LoginActivity.class);  
  13.     }  
  14.   
  15.     @Override  
  16.     public void setUp() throws Exception {  
  17.         super.setUp();  
  18.         /* 
  19.          *  要向程序發(fā)送key事件的話,必須在getActivity之前調(diào)用該方法來關(guān)閉touch模式 
  20.          * 否則key事件會被忽略 
  21.          */  
  22.         setActivityInitialTouchMode(false);  
  23.   
  24.         mInstrument = getInstrumentation();  
  25.         mActivity = getActivity();  
  26.         Log.i(TAG, "current activity: " + mActivity.getClass().getName());  
  27.         mUsernameView = (EditText) mActivity.findViewById(yuan.activity.R.id.username);  
  28.         mPasswordView = (EditText) mActivity.findViewById(yuan.activity.R.id.password);  
  29.         mSubmitView = mActivity.findViewById(yuan.activity.R.id.submit);  
  30.         mResetView = mActivity.findViewById(yuan.activity.R.id.reset);  
  31.     }  
  32.   
  33.     public void testPreConditions() {  
  34.         assertTrue(mUsernameView != null);  
  35.         assertTrue(mPasswordView != null);  
  36.         assertTrue(mSubmitView != null);  
  37.         assertTrue(mResetView != null);  
  38.     }  
  39.   
  40.     public void testInput() {  
  41.         input();  
  42.         assertEquals("yuan", mUsernameView.getText().toString());  
  43.         assertEquals("1123", mPasswordView.getText().toString());  
  44.     }  
  45.   
  46.     public void testSubmit() {  
  47.         input();  
  48.         mInstrument.runOnMainSync(new Runnable() {  
  49.             public void run() {  
  50.                 mSubmitView.requestFocus();  
  51.                 mSubmitView.performClick();  
  52.             }  
  53.         });  
  54.     }  
  55.   
  56.     public void testReset() {  
  57.         input();  
  58.         mInstrument.runOnMainSync(new Runnable() {  
  59.             public void run() {  
  60.                 mResetView.requestFocus();  
  61.                 mResetView.performClick();  
  62.             }  
  63.         });  
  64.         assertEquals("", mUsernameView.getText().toString());  
  65.         assertEquals("", mPasswordView.getText().toString());  
  66.     }  
  67.   
  68.     @Override  
  69.     public void tearDown() throws Exception {  
  70.         super.tearDown();  
  71.     }  
  72.   
  73.     private void input() {  
  74.         mActivity.runOnUiThread(new Runnable() {  
  75.             public void run() {  
  76.                 mUsernameView.requestFocus();  
  77.             }  
  78.         });  
  79.         // 因為測試用例運行在單獨的線程上,這里最好要  
  80.         // 同步application,等待其執(zhí)行完后再運行  
  81.         mInstrument.waitForIdleSync();  
  82.         sendKeys(KeyEvent.KEYCODE_Y, KeyEvent.KEYCODE_U,  
  83.                 KeyEvent.KEYCODE_A, KeyEvent.KEYCODE_N);  
  84.   
  85.         // 效果同上面sendKeys之前的代碼  
  86.         mInstrument.runOnMainSync(new Runnable() {  
  87.             public void run() {  
  88.                 mPasswordView.requestFocus();  
  89.             }  
  90.         });  
  91.         sendKeys(KeyEvent.KEYCODE_1, KeyEvent.KEYCODE_1,  
  92.                 KeyEvent.KEYCODE_2, KeyEvent.KEYCODE_3);  
  93.     }  
  94. }  


HomeActivityTest測試用例
Java代碼  收藏代碼
  1. public class HomeActivityTest extends ActivityUnitTestCase<HomeActivity> {  
  2.     private static final String TAG = "=== HomeActivityTest";  
  3.   
  4.     private static final String LOGIN_CONTENT = "username:yuan\npassword:1123";  
  5.   
  6.     private HomeActivity mHomeActivity;  
  7.     private TextView mLoginContentView;  
  8.   
  9.     public HomeActivityTest() {  
  10.         super(HomeActivity.class);  
  11.     }  
  12.   
  13.     @Override  
  14.     public void setUp() throws Exception {  
  15.         super.setUp();  
  16.         Intent intent = new Intent();  
  17.         intent.putExtra(HomeActivity.EXTRA_USERNAME, "yuan");  
  18.         intent.putExtra(HomeActivity.EXTRA_PASSWORD, "1123");  
  19.         // HomeActivity有extra參數(shù),所以我們需要以intent來啟動它  
  20.         mHomeActivity = launchActivityWithIntent("yuan.activity", HomeActivity.class, intent);  
  21.         mLoginContentView = (TextView) mHomeActivity.findViewById(yuan.activity.R.id.login_content);  
  22.     }  
  23.   
  24.     public void testLoginContent() {  
  25.         assertEquals(LOGIN_CONTENT, mLoginContentView.getText().toString());  
  26.     }  
  27.   
  28.     @Override  
  29.     public void tearDown() throws Exception {  
  30.         super.tearDown();  
  31.     }  
  32. }  


接下來是運行測試用例,首先我們需要把要測試的程序安裝到模擬器或真機上




運行測試用例,查看運行結(jié)果




這里僅僅講了使用eclipse來進(jìn)行單元測試,當(dāng)然也是可以在命令行中進(jìn)行單元測試的,但既然有eclipse這種圖形界面的工具,就不再折騰什么命令行了。
還有就是測試用例也可以直接創(chuàng)建在源程序中(即源代碼和測試代碼放在一個項目中),具體怎么做的話google一些吧,就是把測試時涉及的一些Manifest元素移到源碼工程的Manifest中等
  • 大小: 33.9 KB
  • 大小: 52.2 KB
  • 大小: 51.6 KB
  • 大小: 49.2 KB
  • 大小: 49.4 KB
  • 大小: 89.3 KB
  • 大小: 4.4 KB
  • 大小: 6 KB
  • 大小: 7.5 KB
  • 大小: 23.3 KB
  • 大小: 80.4 KB
  • 大小: 61.1 KB
  • 大小: 55.8 KB
  • 大小: 53.7 KB
  • 大小: 13 KB
  • demo.rar (49.2 KB)
  • 下載次數(shù): 36

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多