如何轻松地对Blackberry代码进行单元测试?

21

我正在为大学课程开发多线程的Blackberry应用程序,该应用程序可以使用蓝牙扫描运行我们应用程序的其他设备,然后通过Wifi接口进行TCP文件传输,实现NAT穿透,同时记录GPS位置。(这是由RIM赞助的计算机网络课程,以防还不明显。)

我喜欢使用测试驱动开发来开发我的作业。然而,在测试期间调用或扩展的任何Blackberry类都会给我带来ClassFormatError错误,提示非法修改器。我认为这个错误是由于Blackberry代码的jar文件必须经过专门为他们的专有JVM编译而引起的。

到目前为止,我已经开始使用代理模式和实现代理的Mock对象。但是,由于我继承了许多本地Blackberry类,这变得非常乏味。

如果可能的话,我也想避免启动Blackberry模拟器。启动它可能需要几分钟,这对于单元测试来说既不实用又很烦人。

有没有简单的方法来对我的Blackberry代码进行单元测试?


2
+1 因为公开承认你在寻求作业帮助。 - Soviut
这个任务实际上没有任何测试要求。我们在方法论方面有自由裁量权,所以我想尝试一下TDD...但它并不像我预期的那样容易。 - Ben S
值得一提的是,在https://dev59.com/YnRA5IYBdhLWcg3wtwSe#859688,我提出了一个理论,即何时有必要对模拟接口进行单元测试...在这种情况下/您目前的情况下,也许*不*是必要的,也不是最有效的方法。 - ChrisW
这并不意味着 TDD(尤其是分阶段部署,在集成测试之前进行单元测试,然后进行系统测试)是不好的,只是在考虑到这个特定的项目+团队+工具时,它不一定是最好/最快的方式。 - ChrisW
这个问题更多关于“如何”,而不是“何时”或“为什么”。我理解TDD的优缺点。 - Ben S
2个回答

19

模型测试

您正在进行模拟,但我不建议您在J2SE平台上测试Blackberry功能。我认为只有在本机源中没有测试数据可用的情况下,才应该使用代理和模拟,例如:

"扫描其他设备" - 没有其他设备,但您想测试扫描功能
"通过Wifi接口的TCP" - 您想在Storm上进行测试(没有WiFi)
"记录我们的GPS位置" - 设备位置是静态的,但您想测试其他位置

然后,您可以使用Blackberry平台模拟此类功能:
BlackBerry GPS位置模拟

仍然可以从头开始使用相同的名称和签名在J2SE上复制BlackBerry API类。这意味着您将不得不自己实现所有类功能。

无模拟器测试j2me

那将是一个非常好的选择,但到目前为止,我看不到如何做到这一点。

测试涉及应用程序运行,这涉及平台模拟。可能存在一些无需整个UI模拟器运行即可测试j2me代码的可能性,但我不知道。

您可以在Java标准版上进行最少的代码更改,测试一些业务逻辑。

你仍然需要在模拟器上运行平台相关的功能测试,但你可以在一个应用程序中完成这项工作,该应用程序将是一组单元测试,就像ChrisW已经说过的那样。只需逐个运行测试方法并在屏幕上输出结果:
Method1 - 通过 - 0.03秒
Method2 - 通过 - 1.30秒
Method3 - 通过 - 0.25秒

J2MEUnit

http://j2meunit.sourceforge.net/:

J2MEUnit是一个Java 2微型版(J2ME)库,包含用于J2ME应用程序的单元测试框架。它基于原始JUnit的源代码,这是Java标准(桌面)版J2SE的成功单元测试框架。 使用J2MEUnit和Eclipse进行J2ME应用程序的单元测试 快速教程以设置和学习J2MEUnit

JMUnit

http://jmunit.sourceforge.net/:

JMUnit是一个基于JUnit的Java ME(J2ME)单元测试框架。它具有以下特点:
- 可在Sun模拟器和实际设备上运行。
- 体积小(即使在旧的MIDP 1.0设备上也可以运行测试)。
- 具有全面的Assert方法集,用于检查测试失败。
- 支持TestCases和TestSuites。
- 包括Ant任务,可在连续构建中运行JMUnit测试。
- 具有受JUnitPerf启发的性能监控类。

编写和运行JMUnit测试

BUnit

BUnit是一个基于jmunit的RIM黑莓单元测试库。

http://sourceforge.net/projects/b-unittesting/
BlackBerry支持社区论坛:如何对我的Blackberry应用程序进行单元测试

附加

如何使用BlackBerry模拟器进行自动化测试


不错的答案,coldice - 非常详尽! - Marc Novakowski

1

当我想要对一些Windows Mobile代码进行单元测试时,我会在模拟器/仿真器上运行它们,或者在设备本身上运行。

这并不实用,因为我不想在每个测试/功能实现后启动需要近一分钟的模拟器。

我可以将其启动,将软件加载到其中,并运行测试......让其继续运行......重新加载新的应用程序软件而无需重新启动,然后再运行测试。也许黑莓不允许这样做?

此外,我可以一次性运行整套测试(无需在每个测试/功能之间重新启动)。但是,如果你的习惯是:

  1. 编写测试用例
  2. 运行测试确保它失败
  3. 编写实现
  4. 再次运行测试以确保成功
  5. (针对下一个要实现的函数重复以上步骤)

尽管如此,这种情况仍可能发生。例如,设备驱动程序:由于系统可能需要每次启动,因为它们会挂起系统,如果有错误则调试起来很繁琐,因为调试器不够用户友好......像这样的环境交互性较差,因此更加强调:

  • 第一次就做对(这样你就不必调试)
  • 一次实现更大的(也许是整个)功能块,并编写测试,随后进行测试

这不太实际,因为我不会在每个测试/函数实现后启动需要近一分钟的模拟器。 - Ben S
据我所知,我需要关闭我的应用程序,模拟与其的USB连接并重新上传二进制文件。这可以通过脚本实现,但仍然比在Eclipse中点击JUnit重新运行按钮要麻烦得多。 - Ben S
此外,在另一个评论中回复评论可以实现通知,并提供比复制粘贴编辑更好的历史记录。 - Ben S
是的,抱歉,但是注释没有格式,并且注释长度有限制。 - ChrisW
也许可以考虑使用脚本。对于 Windows Mobile,只需在 Visual Studio 中按下一个键(F5)即可构建代码、启动仿真器(如果目标是仿真器而不是实际设备,并且如果仿真器尚未启动),将构建的可执行文件复制到目标(仿真器或硬件)并带有调试器运行。速度有点慢,但少于一分钟(除非我正在测试需要设备重新启动的东西)。 - ChrisW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接