2017-06-20 34 views
3

我们有一个相当大的Eclipse RCP应用程序,不确定如何正确测试它的插件。如何高效地进行JUnit测试Eclipse RCP插件

  • 对于每个插件,都有一个包含单元测试的测试片段。
  • 对于较小的测试,不需要运行RCP平台,我们只需调用“标准”JUnit测试运行器即可。

enter image description here

  • 对于测试,需要在RCP平台,有使用JUnit插件测试运行,以测试它的可能性。

enter image description here

  • 对于JUnit的插件测试,它可以定义当RCP平台启动的插件被加载。

enter image description here enter image description here

  • 问题:运行JUnit插件测试需要花费大量的时间(秒而不是millicseconds简单的JUnit测试)和资源,因为RCP平台和所有插件需要启动。

  • 问题:如何有效地最小化为测试运行的插件? 我有哪些选择可以最大限度地减少对RCP平台的依赖(例如首选项服务和扩展点)? 是否有一些Mocking库或至少一些嘲笑RCP平台服务的最佳实践?

现在我不能想象做了JUnit插件测试运行一些体面的TDD,它只是需要太长时间来执行这些测试。

任何有关该主题的建议和经验非常受欢迎!

回答

4

我能感觉到你的痛苦:插件测试很糟糕!而且我还没有找到一个完全令人满意的解决方案。

尽管您可能会获得一些(毫秒 - 秒)的秒数,因此您将所需的插件减少到了最低限度,但我发现它不切实际,因为依赖关系图中的更改通常还需要调整启动配置。如果您的(共享)启动配置中有平台依赖片段(即SWT),则情况会变得更糟。我通常会回退到所有工作空间并启用目标插件选项,并且没有看到启动速度的显着差异。

我不知道RCP平台的模拟库。

除非是非常简单的情况,否则我会避免嘲笑平台的某些部分,因为您可能容易导致行为错误。另请参阅本文后的内容:https://stackoverflow.com/a/31938571/2986905

我的做法是将平台依赖关系尽可能地保留在我的应用程序代码之外,这样我就可以编写纯JUnit测试。对平台API的自定义抽象可以帮助您重复使用这些案例。

另外,可以在没有工作台的情况下使用大量的平台API,当然也包括所有SWT和JFace API,首选项......因此,用最小的依赖关系编写小而简单的类又有助于远离插件测试。例如,将视图的内容从IViewPart(或其e4等价物)中分离出来,可以在不需要视图的情况下编写测试,从而可以编写运行的工作台实例(如果我明确指出,请原谅)。

+1

不错的答案。在Robert Martin的其中一本书中提出了一个核心建议:*在可能的情况下,编写POJO,以便您可以正确地单元测试其逻辑*。 – GhostCat

+1

感谢您的贡献!我同意,我正试图让平台尽可能地摆脱一切。不幸的是,我不是唯一编写代码的应用程序;)应用程序模型,平台和首选项/ UI的封装对许多类都不是真的。重构优化可测试性是很危险的,因为代码没有经过适当的测试;)并且从经验上讲,它们有时会产生奇怪的副作用并破坏事物。 – kerner1000