在Android上实现Junit单元测试的四部曲

移动开发 Android
本文讲述在Android上实现Junit单元测试,利用JUnit等单元测试框架进行单元测试对于Java程序员并不陌生,利用这些非常有效的工具,使得代码的质量得到有效的监控和维护。

我们曾经和大家探讨过全面剖析Java ME单元测试理念,其实在Android上实现JUnit单元测试也不是很困难,主要是在配置文件和测试环境上将花费很长时间,下面从四步简单讲一下在Android上实现Junit单元测试。

第一步:新建一个TestCase,记得要继承androidTestCase,才能有getContext()来获取当前的上下文变量,这在Android测试中很重要的,因为很多的Android api都需要context。

Java代码

  1.    
  2. public class TestMath extends AndroidTestCase {    
  3.         
  4.     private int i1;    
  5.     private int i2;    
  6.     static final String LOG_TAG = "MathTest";    
  7.         
  8.     @Override    
  9.     protected void setUp() throws Exception {    
  10.         i1 = 2;    
  11.         i2 = 3;    
  12.     }    
  13.         
  14.     public void testAdd() {    
  15.         assertTrue("testAdd failed", ((i1 + i2) == 5));    
  16.     }    
  17.         
  18.     public void testDec() {    
  19.         assertTrue("testDec failed", ((i2 - i1) == 1));    
  20.     }    
  21.     
  22.     @Override    
  23.     protected void tearDown() throws Exception {    
  24.         super.tearDown();    
  25.     }    
  26.     
  27.     @Override    
  28.     public void testAndroidTestCaseSetupProperly() {    
  29.         super.testAndroidTestCaseSetupProperly();    
  30.         //Log.d( LOG_TAG, "testAndroidTestCaseSetupProperly" );    
  31.     }    
  32.     
  33. }    

第二步:新建一个TestSuit,这个就继承Junit的TestSuite就可以了,注意这里是用的addTestSuite方法,一开始使用addTest方法就是不能成功。

Java代码

  1.    
  2. public class ExampleSuite extends TestSuite {    
  3.         
  4.     public ExampleSuite() {    
  5.         addTestSuite(TestMath.class);    
  6.     }    
  7.     
  8. }    

第三步:新建一个Activity,用来启动单元测试,并显示测试结果。系统的AndroidTestRunner竟然什么连个UI界面也没有实现,这里只是最简单的实现了一个

Java代码

  1. public class TestActivity extends Activity {    
  2.         
  3.     private TextView resultView;    
  4.         
  5.     private TextView barView;    
  6.         
  7.     private TextView messageView;    
  8.         
  9.     private Thread testRunnerThread;    
  10.         
  11.     private static final int SHOW_RESULT = 0;    
  12.         
  13.     private static final int ERROR_FIND = 1;    
  14.     
  15.     @Override    
  16.     protected void onCreate(Bundle savedInstanceState) {    
  17.         super.onCreate(savedInstanceState);    
  18.         setContentView(R.layout.main);    
  19.         resultView = (TextView)findViewById(R.id.ResultView);    
  20.         barView = (TextView)findViewById(R.id.BarView);    
  21.         messageView = (TextView)findViewById(R.id.MessageView);    
  22.         Button lunch = (Button)findViewById(R.id.LunchButton);    
  23.         lunch.setOnClickListener(new View.OnClickListener() {    
  24.             @Override    
  25.             public void onClick(View v) {    
  26.                 startTest();    
  27.             }    
  28.         });    
  29.     }    
  30.         
  31.     private void showMessage(String message) {    
  32.         hander.sendMessage(hander.obtainMessage(ERROR_FIND, message));    
  33.     }    
  34.         
  35.     private void showResult(String text) {    
  36.         hander.sendMessage(hander.obtainMessage(SHOW_RESULT, text));    
  37.     }    
  38.         
  39.     private synchronized void startTest() {    
  40.         if (testRunnerThread != null    
  41.                 && testRunnerThread.isAlive()) {    
  42.             testRunnerThread = null;    
  43.         }    
  44.         if (testRunnerThread == null) {    
  45.             testRunnerThread = new Thread(new TestRunner(this));    
  46.             testRunnerThread.start();    
  47.         } else {    
  48.             Toast.makeText(this,     
  49.                     "Test is still running",     
  50.                     Toast.LENGTH_SHORT).show();    
  51.         }    
  52.     }    
  53.         
  54.     public Handler hander = new Handler() {    
  55.         public void handleMessage(Message msg) {    
  56.             switch (msg.what) {    
  57.                 case SHOW_RESULT:    
  58.                     resultView.setText(msg.obj.toString());    
  59.                     break;    
  60.                 case ERROR_FIND:    
  61.                     messageView.append(msg.obj.toString());    
  62.                     barView.setBackgroundColor(Color.RED);    
  63.                     break;    
  64.                 default:    
  65.                     break;    
  66.             }    
  67.         }    
  68.     };    
  69.         
  70.     class TestRunner implements Runnable, TestListener {    
  71.         
  72.         private Activity parentActivity;    
  73.             
  74.         private int testCount;    
  75.             
  76.         private int errorCount;    
  77.             
  78.         private int failureCount;    
  79.             
  80.         public TestRunner(Activity parentActivity) {    
  81.             this.parentActivity = parentActivity;    
  82.         }    
  83.     
  84.         @Override    
  85.         public void run() {    
  86.             testCount = 0;    
  87.             errorCount = 0;    
  88.             failureCount = 0;    
  89.                 
  90.             ExampleSuite suite = new ExampleSuite();    
  91.             AndroidTestRunner testRunner = new AndroidTestRunner();    
  92.             testRunner.setTest(suite);    
  93.             testRunner.addTestListener(this);    
  94.             testRunner.setContext(parentActivity);    
  95.             testRunner.runTest();    
  96.         }    
  97.     
  98.         @Override    
  99.         public void addError(Test test, Throwable t) {    
  100.             errorCount++;    
  101.             showMessage(t.getMessage() + "\n");    
  102.         }    
  103.     
  104.         @Override    
  105.         public void addFailure(Test test, AssertionFailedError t) {    
  106.             failureCount++;    
  107.             showMessage(t.getMessage() + "\n");    
  108.         }    
  109.     
  110.         @Override    
  111.         public void endTest(Test test) {    
  112.             showResult(getResult());    
  113.         }    
  114.     
  115.         @Override    
  116.         public void startTest(Test test) {    
  117.             testCount++;    
  118.         }    
  119.             
  120.         private String getResult() {    
  121.             int successCount = testCount - failureCount - errorCount;    
  122.             return "Test:" + testCount + " Success:" + successCount + " Failed:" + failureCount + " Error:" + errorCount;    
  123.         }    
  124.             
  125.     }    
  126.     
  127. }    

第四步:修改AndroidManifest.xml,加入,不然会提示找不到AndroidTestRunner,这里需要注意是这句话是放在applications下面的,我一开始也不知道,放错了地方,浪费了不少时间

Xml代码

  1. xml version="1.0" encoding="utf-8"?>      
  2. <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"      
  3.       package="com.test.sample"      
  4.       Android:versionCode="1"      
  5.       Android:versionName="1.0">      
  6.     <application Android:icon="@drawable/icon" Android:label="@string/app_name" Android:debuggable="true">      
  7.         <activity Android:name=".TestActivity"      
  8.                   Android:label="@string/app_name">      
  9.             <intent-filter>      
  10.                 <action Android:name="Android.intent.action.MAIN" />      
  11.                 <category Android:name="Android.intent.category.LAUNCHER" />      
  12.             intent-filter>      
  13.         activity>      
  14.     <uses-library Android:name="Android.test.runner" />      
  15.     application>      
  16.     <uses-sdk Android:minSdkVersion="4" />      
  17. manifest>      

【编辑推荐】

  1. 全面剖析Java ME单元测试理念
  2. Java ME Unit单元测试技术简介
  3. Android数据库事务浅析
  4. 深度剖析Android单元测试问题
  5. Android单元测试源码解读
责任编辑:佚名 来源: JavaEye
相关推荐

2010-10-15 10:43:28

私有云服务器虚拟化

2012-08-30 14:08:47

IBMdW

2011-06-27 09:05:58

云计算私有云CIO

2017-03-29 13:51:06

戴尔混合云四部曲

2012-05-30 10:24:23

服务器选购中小企业

2011-06-10 20:48:47

惠普

2009-03-11 14:13:00

跳槽职场赢家

2017-02-06 10:56:37

大数据现场设备数治

2011-07-05 09:17:41

2017-01-14 23:26:17

单元测试JUnit测试

2017-01-16 12:12:29

单元测试JUnit

2011-11-18 15:18:41

Junit单元测试Java

2011-08-11 13:02:43

Struts2Junit

2009-06-08 20:04:06

EclipseJUnit4单元测试

2009-06-08 19:59:09

EclipseJUnit单元测试

2009-06-08 19:57:29

EclipseJUnit4单元测试

2017-03-23 16:02:10

Mock技术单元测试

2012-02-07 09:08:50

Feed4JUnitJava

2017-01-14 23:42:49

单元测试框架软件测试

2021-01-07 14:06:30

Spring BootJUnit5Java
点赞
收藏

51CTO技术栈公众号