全面剖析J2ME单元测试理念

开发 前端
本文向大家简单介绍一下J2ME单元测试的概念,利用JUnit等单元测试框架进行单元测试对于Java程序员并不陌生,利用这些非常有效的工具,使得代码的质量得到有效的监控和维护。

J2ME Unit是由KentBeck和ErichGamma设计开发的在J2ME平台上模仿JUnit的单元测试框架,大小17KB。它的运用为编写有保证的J2ME程序代码提供了基础性的支持。

J2ME单元测试(JUnit)

J2ME Unit简介:

利用JUnit等单元测试框架进行单元测试对于Java程序员并不陌生,利用这些非常有效的工具,使得代码的质量得到有效的监控和维护。然而似乎一切在J2ME的平台上,都显得略有些不同。由于J2ME环境不能提供反射(Reflection)API,因此很多基于反射的功能都无法使用,例如JUnit中自动创建并运行testsuite的功能。广大的J2ME程序员不能在J2ME平台上使用JUNIT进行单元测试,但谁都知道没有单元测试的程序是多么的脆弱!

J2ME Unit是由KentBeck和ErichGamma设计开发的在J2ME平台上模仿JUnit的单元测试框架,大小17KB。它的运用为编写有保证的J2ME程序代码提供了基础性的支持。J2MEUnit引入了一些新的机制来解决原有JUnit对反射的依赖。可能在使用中J2MEUnit明显的没有JUnit方便,但现阶段我们也只能利用它了,热烈的期盼着J2ME环境对反射的支持。现有的J2MEUnit的版本是1.1.1。如同JUnit一样,它也是开源的。你可以在sf.net上找到他的下载。相比较JUnit经常升级,J2MEUnit有一段时间没有升级了,一方面投入的力量较小,另外可能是考虑到J2ME环境的特殊性,要保证测试的LIB足够的小。
  
搭建测试平台:
  
  我们以Eclipse配合EclipseME为例子说明如何使用J2MEUnit。
  
  首先到sf下载J2MEUnit的***版本:http://J2MEUnit.sourceforge.net,并解压缩到你的常用目录中。
  
  新建一个MidletSuite,选择Project…>properties…>JavaBuildPath…>Libraries…>AddExternalJARs…选择你需好下载的路径中的J2MEUnit.jar。 
 
  这样就可以使用了。
  
编写测试类:
  
  让我们编写一个TestCase来学习如何使用这套工具。
  
编写TestCase类
  
  编写测试的类要继承J2MEUnit.framework.TestCase。如同JUnit中一样,你可以覆写setUp()和tearDown()方法,虽然这里没有反射机制,但还是推荐你把测试方法以test开头。这样一但J2ME有了反射机制,你也可以快速的移植。还有一点要注意的是,你需要为子类提供一个构造函数(假设你的类叫做TestOne):  

  1.   publicTestOne(StringsTestName,TestMethodrTestMethod)  
  2.   {  
  3.   super(sTestName,rTestMethod);  
  4.   } 

  稍候解释这是为什么?
  
  接下来编写两个个测试方法,这很熟悉: 

  1.   publicvoidtestOne()  
  2.   {  
  3.   System.out.println("TestOne.testOne()");  
  4.   assertTrue("Shouldbetrue",false);  
  5.   }  
  6.   publicvoidtestTwo()  
  7.   {  
  8.   System.out.println("TestOne.testTwo()");  
  9.   thrownewRuntimeException("Exception");  
  10.   } 

  正是缺少反射机制,你需要手动编写suite方法,并一一调用你编写的测试方法,这个步骤多多少少有些烦闷。没办法了,这是理解J2MEUnit框架的关键了,咱连writeoncedebuganywhere都忍了,还有什么困难不能克服呢?
  
  suite方法要求我们返回一个TestSuite对象,因此,首先建立一个新的TestSuite对象并调用addTest方法,为他添加Test对象。Test是一个接口,TestSuite、TestCase都实现了他,因此既可以添加测试单元、又可以添加一个测试套件。
  
  根据J2MEUnit的设计思想,一个TestCase在运行时,只能捆绑一个TestMethod对象。TestMethod是一个标准的回调接口,只含有一个回调run(TestCasetc)方法。这个run方法的任务是调用一个,注意,是一个测试方法,那么一旦这个方法出现问题,可以很好的捕捉它,并返回给用户。TestMethod提供了一组set方法用于捆绑一个TestMethod对象,但实际我们不去使用它,因为效率太低了,为了更快捷的捆绑TestMethod对象,我们要利用构造函数和匿名类来捆绑TestMethod类的实例。这个匿名类很好编写,只要将传入的TestCasetc向上转型到你的TestCase子类,然后调用相关方法就可。我们不得不同时提供一个String作为名称给我们的构造函数
  
  看一下下面这个例子,希望能帮助你理解上面那段总觉得有些拗口的话。如果你理解了“一个TestCase在运行时,只能捆绑一个TestMethod对象”这句话,那么就理解了J2MEUnit所谓的新机制。千万不要在一个TestMethod中连续调用多个test方法,这样一旦某个方法出了问题,那么整个方法会结束而后续的测试将不能执行。一定要老老实实做人,认认真真写suite(),似乎又回到了剪刀加浆糊的时代。 

  1.   publicTestsuite()  
  2.   {  
  3.   TestSuiteaSuite=newTestSuite();  
  4.   aSuite.addTest(newTestOne("testOne",newTestMethod()  
  5.   {publicvoidrun(TestCasetc){((TestOne)tc).testOne();  
  6.   }}));  
  7.   aSuite.addTest(newTestOne("testTwo",newTestMethod()  
  8.   {publicvoidrun(TestCasetc){((TestOne)tc).testTwo();  
  9.   }}));  
  10.   returnaSuite;  
  11.   } 

#p#编写测试套件
  
  接下来编写一个测试套件,其实你可能已经明白了,测试套件不过是一个特殊的TestCase,根据惯例,一般这样的类叫做TestAll,只需要将以前添加的TestCase中的suite添加给TestAll的suite就可以了。 

  1.   publicclassTestAllextendsTestCase{  
  2.   publicTestsuite()  
  3.   {       TestSuitesuite=newTestSuite();  
  4.   suite.addTest(newTestOne().suite());  
  5.   suite.addTest(newTestTwo().suite());  
  6.   returnsuite;  
  7.   }} 

调试:
  
  有两个方法运行我们的测试。
  
使用textui
  
  利用textui,这个大家都熟悉了,不做重点介绍。一般习惯上在TestAll方法中添加一个main方法: 

  1.     
  2.   publicstaticvoidmain(String[]args)  
  3.   {  
  4.   String[]runnerArgs=newString[]{"J2MEUnit.examples.TestAll"};  
  5.   J2MEUnit.textui.TestRunner.main(runnerArgs);  
  6.   }  
  7.    

  要为TestRunner.main传入一个String数组,里面罗列所有要测试的TestCase的完整路径,因为我们编写了TestAll,所以只传入他就可以了。
  
使用midletui
  
  这才是这套框架迷人的地方,正是有了他我们可以在真机上进行UnitTest了,cool,这将节省多少的测试成本呀。所以之前所有的编写suite的工作就认了!
  
  继承J2MEUnit.midletui.TestRunner,这是一个midlet父类。在startApp中调用如下方法: 

  1.   protectedvoidstartApp()  
  2.   {  
  3.   start(newString[]{"J2MEUnit.examples.TestAll"});  
  4.   } 

  或者,更为灵活的,你可以在jad文件中编写一个J2MEUnitTestClasses属性,写入你要测试的若干个TestCase,这样也可以进行测试而不更改主类。
  
  如下是在模拟上的结果: 

  1.     
  2. screen.width-460)this.width=screen.width-460"> 

  在我的MIDP1.0,真机上运行这个例子得到同样的结果,用时401ms。如果你正在使用j2me开发项目,建议把单元测试引入到你的工作当中,正如我们看到单元测试对于别的java平台的影响一样,对于嵌入式开发,它也是大有用武之地的。

【编辑推荐】

  1. Javascript解决浏览器兼容问题12个技巧
  2. 解析J2ME中Font和Color的设置
  3. J2ME应用程序内存优化的三种途径揭秘
  4. 技术分享 如何识别控制DHTML和JS中的页面元素
  5. 深入探究Myeclipse J2ME开发环境配置
责任编辑:佚名 来源: hi.baidu.com
相关推荐

2010-09-29 16:06:02

J2ME Unit单元

2010-09-29 08:57:04

J2ME前景

2010-10-09 15:52:28

J2ME3D技术

2010-10-09 15:07:09

J2MEWeb服务

2010-09-29 09:19:39

J2ME开发工具

2010-09-29 11:23:53

unicodeJ2ME

2009-03-22 09:38:03

Android移植J2ME

2010-09-30 13:28:55

J2ME图形

2010-09-30 09:56:26

J2ME Polish

2009-06-23 11:30:16

RMSJ2ME

2009-06-08 21:34:09

J2EEJ2SEJ2ME

2009-06-16 15:56:10

MIDlet生命周期J2ME程序测试

2010-09-29 13:50:31

J2MEJ2SE

2009-07-09 16:06:10

JDK J2EE J2

2011-09-01 16:45:15

J2MELua

2010-09-29 12:45:50

J2ME

2009-05-26 17:35:40

J2ME软件签名证书

2010-09-29 14:54:34

J2MEHashtable

2010-02-04 13:15:59

Android J2M

2010-09-30 11:04:53

J2MERMS
点赞
收藏

51CTO技术栈公众号