J2ME工具:使用j2meunit进行游戏测试

2016-02-19 13:36 1 1 收藏

下面这个J2ME工具:使用j2meunit进行游戏测试教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

【 tulaoshi.com - 编程语言 】

使用j2meunit进行游戏测试
  
  做一款出色的j2me游戏是属不易呀。但是后面对游戏的测试更是麻烦,这也是一些手机游戏公司中测试人员与开发人员的比例相当的一个重要原因。。究竟有没有好的途径提高游戏测试的速度那??这也是摆在游戏开发team面前的老问题。。
  
  不过现在就使用j2meunit这一利器,它可是好用的开源的东东呀!
  
  j2meunit简介:
  
  利用JUnit等单元测试框架进行单元测试对于Java程序员并不生疏,利用这些非常有效的工具,使得代码的质量得到有效的监控和维护。然而似乎一切在J2ME的平台上,都显得略有些不同。由于J2ME环境不能提供反射(Reflection)API,因此很多基于反射的功能都无法使用,例如JUnit中自动创建并运行test suite的功能。广大的J2ME程序员不能在J2ME平台上使用JUNIT进行单元测试,但谁都知道没有单元测试的程序是多么的脆弱!
  
  J2MEUnit是由Kent Beck和Erich Gamma设计开发的在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,并解压缩到你的常用目录中。
  
  新建一个Midlet Suite,选择Project…>properties…>Java Build Path…>Libraries…>Add External JARs…选择你需好下载的路径中的j2meunit.jar。
  
 
点击查看大图

  这样就可以使用了。
  
  编写测试类:
  
  让我们编写一个TestCase来学习如何使用这套工具。
  
  编写TestCase类
  
  编写测试的类要继续j2meunit.framework.TestCase。如同JUnit中一样,你可以覆写setUp() 和tearDown()方法,虽然这里没有反射机制,但还是推荐你把测试方法以test开头。这样一但J2ME有了反射机制,你也可以快速的移植。还有一点要注重的是,你需要为子类提供一个构造函数(假设你的类叫做TestOne):
  
  public TestOne(String sTestName, TestMethod rTestMethod)
  {
  super(sTestName, rTestMethod);
  }
  
  稍候解释这是为什么?
  
  接下来编写两个个测试方法,这很熟悉:
  public void testOne()
  {
  System.out.println("TestOne.testOne()");
  assertTrue("Should be true", false);
  }
  public void testTwo()
  {
  System.out.println("TestOne.testTwo()");
  throw new RuntimeException("Exception");
  }
  
  正是缺少反射机制,你需要手动编写suite方法,并一一调用你编写的测试方法,这个步骤多多少少有些烦闷。没办法了,这是理解J2MEUnit框架的要害了,咱连write once debug anywhere都忍了,还有什么困难不能克服呢?
  
  suite方法要求我们返回一个TestSuite对象,因此,首先建立一个新的TestSuite对象并调用addTest方法,为他添加Test对象。Test是一个接口,TestSuite、TestCase都实现了他,因此既可以添加测试单元、又可以添加一个测试套件。
  
  根据J2MEUnit的设计思想,一个TestCase在运行时,只能捆绑一个TestMethod对象。TestMethod是一个标准的回调接口,只含有一个回调run(TestCase tc)方法。这个run方法的任务是调用一个,注重,是一个测试方法,那么一旦这个方法出现问题,可以很好的捕捉它,并返回给用户。TestMethod提供了一组set方法用于捆绑一个TestMethod对象,但实际我们不去使用它,因为效率太低了,为了更快捷的捆绑TestMethod对象,我们要利用构造函数和匿名类来捆绑TestMethod类的实例。这个匿名类很好编写,只要将传入的TestCase tc向上转型到你的TestCase子类,然后调用相关方法就可。我们不得不同时提供一个String作为名称给我们的构造函数(还记得吗?我们添加的那个构造函数,这下,明白她的用处了吧)。
  
  看一下下面这个例子,希望能帮助你理解上面那段总觉得有些拗口的话。假如你理解了“一个TestCase在运行时,只能捆绑一个TestMethod对象”这句话,那么就理解了J2MEUnit所谓的新机制。千万不要在一个TestMethod中连续调用多个test方法,这样一旦某个方法出了问题,那么整个方法会结束而后续的测试将不能执行。一定要老老实实做人,认认真真写suite(),似乎又回到了剪刀加浆糊的时代。。。[-_-"]
  public Test suite()
  {
  TestSuite aSuite = new TestSuite();
  aSuite.addTest(new TestOne("testOne", new TestMethod()
  { public void run(TestCase tc) {((TestOne) tc).testOne();
  } }));
  aSuite.addTest(new TestOne("testTwo", new TestMethod()
  { public void run(TestCase tc) {((TestOne) tc).testTwo();
  } }));
  return aSuite;
  }
  
  编写测试套件
  
  接下来编写一个测试套件,其实你可能已经明白了,测试套件不过是一个非凡的TestCase,根据惯例,一般这样的类叫做TestAll,只需要将以前添加的TestCase中的suite添加给TestAll的suite就可以了。
  public class TestAll extends TestCase{
  public Test suite()
  {   TestSuite suite = new TestSuite();
  suite.addTest(new TestOne().suite());
  suite.addTest(new TestTwo().suite());
  return suite;
  }}
  
  调试:
  
  有两个方法运行我们的测试。
  
  使用textui
  
  利用textui,这个大家都熟悉了,不做重点介绍。一般习惯上在TestAll方法中添加一个main方法:
  
  public static void main(String[] args)
  {
  String[] runnerArgs = new String[] { "j2meunit.examples.TestAll" };
  j2meunit.textui.TestRunner.main(runnerArgs);
  }
  
  要为TestRunner.main传入一个String数组,里面罗列所有要测试的TestCase的完整路径,因为我们编写了TestAll,所以只传入他就可以了。
  
 
点击查看大图

  使用midletui
  
  这才是这套框架迷人的地方,正是有了他我们可以在真机上进行Unit Test了,cool,这将节省多少的测试成本呀。所以之前所有的编写suite的工作就认了!
  
  继续j2meunit.midletui.TestRunner,这是一个midlet父类。在startApp中调用如下方法:
  protected void startApp()
  {
  start(new String[] { "j2meunit.examples.TestAll" });
  }
  或者,更为灵活的,你可以在jad文件中编写一个J2MEUnitTestClasses属性,写入你要测试的若干个TestCase,这样也可以进行测试而不更改主类。
  
  如下是在模拟上的结果:
  

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

来源:https://www.tulaoshi.com/n/20160219/1604750.html

延伸阅读
三、需求分析 这部分叫做需求分析,听起来挺吓人的,其实就是搞清楚我们要做什么,做成什么样,那些不做。下面我引领着大家共同来完成这一步骤。首先,我们要做一个华容道的游戏,华容道的故事这里不再赘述了,但其中的人物在这里限定一下,如上面Images类里的定义,我们这个版本只提供曹操(Caocao)、关羽(Guanyu)、张飞(Zhangfei)、...
MIDP2.0中提供了Javax.microedition.lcdui.game包,这样我们可以更轻易的进行游戏开发,在这个包内一共包含了5个类,分别是GameCanvas,Layer,LayerManager,TitledLayder和Sprite。Layer是个抽象类,TiledLayer和Sprite都是Layer的子类,前者是为了绘画场景后者是为了绘画游戏的角色的。而LayerManager则是治理层。本文通过一个简单的例子介绍...
    MIDP是Mobile Information Devices Profile(移动信息设备简表)的简称,而遵照 MIDP和CLDC规范编写的 Java应用程序我们就称其为 MIDlet。     你可以从MIDP这个规范的英文名称的含义推测, MIDlet是定位于提供某种水平的网络连接性的移动设备。运行 MIDlet的设备也有好几个共同的属性:有限的屏...
六.编码 整个项目共有五个类,有四个类的代码前面已经介绍过了,而且是在其他项目中使用过的相对成熟的代码.现在只需全力去实现Displayable1类.Displayable1类的代码如下: package huarongroad; import javax.microedition.lcdui.*; public class Displayable1 extends Canvas implements CommandListener { private int[] loc = ...
在游戏逻辑类里有几十行的变量定义也不足为奇。特别对于j2me来说更是如此,为了节省内存空间很多人舍弃了面向对象的特性把代码挤在一块。通常的情况是自已被自已的代码给淹死了!!所以在做结构设计时我很注重这一点,总是试图让代码节省一点扩展性多一点。这件事并不算很难只要认真去推敲总可以发现一些可以优化的东西,变量就是一例。大...

经验教程

657

收藏

71
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部