• android单元测试 activity跳转 以及 input 输入后 测试


     

    Android junit实现多个Activity跳转测试

    分类: Android Junit测试
     

    测试相关资源 
    让开发自动化: 用 Eclipse 插件提高代码质量http://www.ibm.com/developerworks/cn/java/j-ap01117/index.html

    代码测试覆盖率介绍:http://www.cnblogs.com/coderzh/archive/2009/03/29/1424344.html


    学习android单元测试时遇到的一些问题: 
    1.开始以为单元测试一定要从程序的launch Activity,一步一步的跳转到所要测试的Activity能对其进行测试。 
    但实际上,我们可以从任意一个activity开始,对任意一个activity进行测试。 

    2.在运行单元测试之前,一定要先将要测试的程序安装到模拟器或真机上。 

    junit相关 
    android中的测试框架是扩展的junit3,所以在学习android中的单元测试签,可以先熟悉下junit3的使用,junit3要学习的东西应该并不多,就几页纸的东西。入门可以参考这个:http://android.blog.51cto.com/268543/49994

    android单元测试框架中涉及的注解 
    @Suppress 可以用在类或这方法上,这样该类或者该方法就不会被执行 
    @UiThreadTest 可以用在方法上,这样该方法就会在程序的ui线程上执行 
    @LargeTest, @MediumTest, @SmallTest 用在方法上,标记所属的测试类型,主要是用于单独执行其中的某一类测试时使用。具体参考InstrumentationTestRunner类的文档。
    @Smoke 具体用法还不清楚 

    android单元测试框架中涉及的一些类的uml 



    接下来我们以demo project来讲解如何使用android中的单元测试 
    主要包括了三个activity: 
    MainActivity:仅包含一个button,点击后就可以进入LoginActivity 

    LoginActivity:可以输入username, password,然后点击submit的话可进入HomeActivity,如果点击reset的话,输入的内容就会被清空

    HomeActivity:在TextView中显示LoginActivity输入的内容 

    首先我们创建要测试的项目demo(使用了2.1) 


    MainActivity代码

    Java代码  

    public class MainActivity extends Activity {

      private static final boolean DEBUG = true;

      private static final String TAG = "-- MainActivity";

     

      @Override

      protected void onCreate(Bundle savedInstanceState) {

       if (DEBUG) {

         Log.i(TAG, "onCreate");

       }

     

       super.onCreate(savedInstanceState);

       setContentView(R.layout.act_main);

       View toLoginView = findViewById(R.id.to_login);

       toLoginView.setOnClickListener(new View.OnClickListener() {

         public void onClick(View view) {

          if (DEBUG) {

            Log.i(TAG, "toLoginView clicked");

          }

     

          Intent intent = new Intent(getApplicationContext(), LoginActivity.class);

          startActivity(intent);

         }

       });

      }

    }


    MainActivity的布局文件

    Xml代码  

    1. <LinearLayout  
    2.     xmlns:android="http://schemas.android.com/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>  

    <LinearLayout

      xmlns:android="http://schemas.android.com/apk/res/android"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent"

      <Button

       android:id="@+id/to_login"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:layout_gravity="bottom"

       android:text="to login" />

    </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. }  

    public class LoginActivity extends Activity {

      private static final boolean DEBUG = true;

      private static final String TAG = "-- LoginActivity";

     

      private EditText mUsernameView;

      private EditText mPasswordView;

     

      @Override

      protected void onCreate(Bundle savedInstanceState) {

       if (DEBUG) {

         Log.i(TAG, "onCreate");

       }

     

       super.onCreate(savedInstanceState);

       setContentView(R.layout.act_login);

       mUsernameView = (EditText) findViewById(R.id.username);

       mPasswordView = (EditText) findViewById(R.id.password);

     

       View submitView = findViewById(R.id.submit);

       submitView.setOnClickListener(new View.OnClickListener() {

         public void onClick(View view) {

          if (DEBUG) {

            Log.i(TAG, "submitView clicked");

          }

     

          Intent intent = new Intent(getApplicationContext(), HomeActivity.class);

          intent.putExtra(HomeActivity.EXTRA_USERNAME, mUsernameView.getText().toString());

          intent.putExtra(HomeActivity.EXTRA_PASSWORD, mPasswordView.getText().toString());

          startActivity(intent);

         }

       });

     

       View resetView = findViewById(R.id.reset);

       resetView.setOnClickListener(new View.OnClickListener() {

         public void onClick(View view) {

          if (DEBUG) {

            Log.i(TAG, "resetView clicked");

          }

     

          mUsernameView.setText("");

          mPasswordView.setText("");

          mUsernameView.requestFocus();

         }

       });

      }

    }


    LoginActivity的布局文件

    Xml代码  

    1. <LinearLayout  
    2.     xmlns:android="http://schemas.android.com/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>  

    <LinearLayout

      xmlns:android="http://schemas.android.com/apk/res/android"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent"

      android:orientation="vertical"

      <TextView

       android:id="@+id/label_username"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:text="username:" />

      

      <EditText

       android:id="@+id/username"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:inputType="text" />

      

      <TextView

       android:id="@+id/label_password"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:text="password:" />

      

      <EditText

       android:id="@+id/password"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:inputType="textPassword" />

      

      <Button

       android:id="@+id/submit"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:text="submit" />

      

      <Button

       android:id="@+id/reset"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:text="reset" />

    </LinearLayout>




    HomeActivity代码

    Java代码  

    public class HomeActivity extends Activity {

      private static final boolean DEBUG = true;

      private static final String TAG = "-- HomeActivity";

     

      public static final String EXTRA_USERNAME = "yuan.activity.username";

      public static final String EXTRA_PASSWORD = "yuan.activity.password";

     

      @Override

      protected void onCreate(Bundle savedInstanceState) {

       if (DEBUG) {

         Log.i(TAG, "onCreate");

       }

       super.onCreate(savedInstanceState);

       Intent intent = getIntent();

       StringBuilder sb = new StringBuilder();

       sb.append("username:").append(intent.getStringExtra(EXTRA_USERNAME)).append(" ");

       sb.append("password:").append(intent.getStringExtra(EXTRA_PASSWORD));

     

       setContentView(R.layout.act_home);

       TextView loginContentView = (TextView) findViewById(R.id.login_content);

       loginContentView.setText(sb.toString());

      }

    }


    HomeActivity的布局文件

    Xml代码  

    <LinearLayout

      xmlns:android="http://schemas.android.com/apk/res/android"

      android:layout_width="fill_parent"

      android:layout_height="fill_parent"

      <TextView

       android:id="@+id/login_content"

       android:layout_width="fill_parent"

       android:layout_height="wrap_content"

       android:layout_gravity="center_vertical"

       android:gravity="center"

       android:textColor="#EEE"

       android:textStyle="bold"

       android:textSize="25sp" />

    </LinearLayout>




    程序非常简单,接下来我们为demo创建单元测试工程demo_unittest 

    选择之前创建的工程demo,然后eclipse会自动帮我们设定api level,包名等。(测试用例的包名一般就是在要测试类的包名后加上test)


    创建完后eclipse会自动为我们创建好所需的目录,Manifest.xml文件 


    接下来就是为要测试的类编写测试用例。关于要用哪个测试用例类,在第一张UML图中也做了简要的说明。
     
    ActivityInstrumentationTestCase2:主要是用于进行activity的功能测试,和activity的交互测试,如activity间的跳转,ui的交互等。

    ActivityInstrumentationTestCase:这个类现在已deprecated了,所以不许考虑。 

    SingleLaunchActivityTestCase:该测试用例仅掉用setUp和tearDown一次,而不像其它测试用例类一样,每调用一次测试方法就会重新调用一次setUp和tearDown。所以主要测试activity是否能够正确处理多次调用。

    ActivityUnitTestCase:主要用于测试Activity,因为它允许注入MockContext和MockApplicaton,所以可以测试Activity在不同资源和应用下的情况。

    还有Application等的测试用例比较简单,看uml图。如果觉得不够详细,可以参考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.         // 在执行测试之前,确保程序的重要对象已被初始化   
    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线程上执行,等同于上面注解掉的代码   
    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. }  

    public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

      private static final String TAG = "=== MainActivityTest";

     

      private Instrumentation mInstrument;

      private MainActivity mActivity;

      private View mToLoginView;

     

      public MainActivityTest() {

       super("yuan.activity", MainActivity.class);

      }

     

      @Override

      public void setUp() throws Exception {

       super.setUp();

       mInstrument = getInstrumentation();

       // 启动被测试的Activity

       mActivity = getActivity();

       mToLoginView = mActivity.findViewById(yuan.activity.R.id.to_login);

      }

     

      public void testPreConditions() {

       // 在执行测试之前,确保程序的重要对象已被初始化

       assertTrue(mToLoginView != null);

      }

     

     

      //mInstrument.runOnMainSync(new Runnable() {

      //  public void run() {

      //   mToLoginView.requestFocus();

      //   mToLoginView.performClick();

      //  }

      //});

      @UiThreadTest

      public void testToLogin() {

       // @UiThreadTest注解使整个方法在UI线程上执行,等同于上面注解掉的代码

       mToLoginView.requestFocus();

       mToLoginView.performClick();

      }

     

      @Suppress

      public void testNotCalled() {

       // 使用了@Suppress注解的方法不会被测试

       Log.i(TAG, "method 'testNotCalled' is called");

      }

     

      @Override

      public void tearDown() throws Exception {

       super.tearDown();

      }

    }



    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.          *  要向程序发送key事件的话,必须在getActivity之前调用该方法来关闭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,等待其执行完后再运行   
    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. }  

    public class LoginActivityTest extends ActivityInstrumentationTestCase2<LoginActivity> {

      private static final String TAG = "=== LoginActivityTest";

     

      private Instrumentation mInstrument;

      private LoginActivity mActivity;

      private EditText mUsernameView;

      private EditText mPasswordView;

      private View mSubmitView;

      private View mResetView;

     

      public LoginActivityTest() {

       super("yuan.activity", LoginActivity.class);

      }

     

      @Override

      public void setUp() throws Exception {

       super.setUp();

       /*

        *  要向程序发送key事件的话,必须在getActivity之前调用该方法来关闭touch模式

        * 否则key事件会被忽略

        */

       setActivityInitialTouchMode(false);

     

       mInstrument = getInstrumentation();

       mActivity = getActivity();

       Log.i(TAG, "current activity: " + mActivity.getClass().getName());

       mUsernameView = (EditText) mActivity.findViewById(yuan.activity.R.id.username);

       mPasswordView = (EditText) mActivity.findViewById(yuan.activity.R.id.password);

       mSubmitView = mActivity.findViewById(yuan.activity.R.id.submit);

       mResetView = mActivity.findViewById(yuan.activity.R.id.reset);

      }

     

      public void testPreConditions() {

       assertTrue(mUsernameView != null);

       assertTrue(mPasswordView != null);

       assertTrue(mSubmitView != null);

       assertTrue(mResetView != null);

      }

     

      public void testInput() {

       input();

       assertEquals("yuan", mUsernameView.getText().toString());

       assertEquals("1123", mPasswordView.getText().toString());

      }

     

      public void testSubmit() {

       input();

       mInstrument.runOnMainSync(new Runnable() {

         public void run() {

          mSubmitView.requestFocus();

          mSubmitView.performClick();

         }

       });

      }

     

      public void testReset() {

       input();

       mInstrument.runOnMainSync(new Runnable() {

         public void run() {

          mResetView.requestFocus();

          mResetView.performClick();

         }

       });

       assertEquals("", mUsernameView.getText().toString());

       assertEquals("", mPasswordView.getText().toString());

      }

     

      @Override

      public void tearDown() throws Exception {

       super.tearDown();

      }

     

      private void input() {

       mActivity.runOnUiThread(new Runnable() {

         public void run() {

          mUsernameView.requestFocus();

         }

       });

       // 因为测试用例运行在单独的线程上,这里最好要

       // 同步application,等待其执行完后再运行

       mInstrument.waitForIdleSync();

       sendKeys(KeyEvent.KEYCODE_Y, KeyEvent.KEYCODE_U,

          KeyEvent.KEYCODE_A, KeyEvent.KEYCODE_N);

     

       // 效果同上面sendKeys之前的代码

       mInstrument.runOnMainSync(new Runnable() {

         public void run() {

          mPasswordView.requestFocus();

         }

       });

       sendKeys(KeyEvent.KEYCODE_1, KeyEvent.KEYCODE_1,

          KeyEvent.KEYCODE_2, KeyEvent.KEYCODE_3);

      }

    }



    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 password: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参数,所以我们需要以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. }  

    public class HomeActivityTest extends ActivityUnitTestCase<HomeActivity> {

      private static final String TAG = "=== HomeActivityTest";

     

      private static final String LOGIN_CONTENT = "username:yuan password:1123";

     

      private HomeActivity mHomeActivity;

      private TextView mLoginContentView;

     

      public HomeActivityTest() {

       super(HomeActivity.class);

      }

     

      @Override

      public void setUp() throws Exception {

       super.setUp();

       Intent intent = new Intent();

       intent.putExtra(HomeActivity.EXTRA_USERNAME, "yuan");

       intent.putExtra(HomeActivity.EXTRA_PASSWORD, "1123");

       // HomeActivity有extra参数,所以我们需要以intent来启动它

       mHomeActivity = launchActivityWithIntent("yuan.activity", HomeActivity.class, intent);

       mLoginContentView = (TextView) mHomeActivity.findViewById(yuan.activity.R.id.login_content);

      }

     

      public void testLoginContent() {

       assertEquals(LOGIN_CONTENT, mLoginContentView.getText().toString());

      }

     

      @Override

      public void tearDown() throws Exception {

        super.tearDown();

      }

    }



    接下来是运行测试用例,首先我们需要把要测试的程序安装到模拟器或真机上 




    运行测试用例,查看运行结果 




    这里仅仅讲了使用eclipse来进行单元测试,当然也是可以在命令行中进行单元测试的,但既然有eclipse这种图形界面的工具,就不再折腾什么命令行了。 
    还有就是测试用例也可以直接创建在源程序中(即源代码和测试代码放在一个项目中),具体怎么做的话google一些吧,就是把测试时涉及的一些Manifest元素移到源码工程的Manifest中等

  • 相关阅读:
    06.04 html
    汉企第一天
    Django之ajax
    Diango之图书管理系统编辑
    Django之模型层&ORM操作
    Django 之模板层
    Django之 路由层
    Django之ORM简单操作(一)
    迭代器、可迭代对象、迭代器对象、生成器、生成器对象、枚举对象
    装饰器
  • 原文地址:https://www.cnblogs.com/duanweishi/p/4605402.html
Copyright © 2020-2023  润新知