网站后台视频教程,免费网站模板网站,南通城乡住房建设厅网站首页,html页面转WordPress文章moreunit就在一年多以前#xff0c;我写了一篇关于在Eclipse中使用JUnit的文章。 评论者之一推荐MoreUnit #xff0c;以进一步提高测试效率。 尝试一下让我感到很高兴#xff0c;并且我的自主神经系统立即记住了该插件的键盘快捷键…… 另外#xff0c;在使用MoreUnit一段… moreunit 就在一年多以前我写了一篇关于在Eclipse中使用JUnit的文章。 评论者之一推荐MoreUnit 以进一步提高测试效率。 尝试一下让我感到很高兴并且我的自主神经系统立即记住了该插件的键盘快捷键…… 另外在使用MoreUnit一段时间后我发现我的一个工作例程发生了细微但值得注意的变化。 更准确地说在重构1时 我倾向于提取比自己以前更多的由单元测试覆盖的类。 由于保持许多小类2的凝聚力这可能是一件好事。 好吧有人可以说“ MoreUnit名字说明了一切”但是由于我并不希望这样使用所以我认为这可能是一篇不错的帖子。 因此让我们看下面的示例开始 class ActionItem extends MouseAdapter {private Label control;private Runnable action;private boolean mouseDown;[...]ActionItem( Composite parent, Runnable action ) {this.control new Label( parent, SWT.NONE );this.control.addMouseListener( this );this.action action;}Overridepublic void mouseDown( MouseEvent event ) {markMouseDown();}Overridepublic void mouseUp( MouseEvent event ) {handleMouseUp( event );}private void markMouseDown() {mouseDown true;}private void handleMouseUp( MouseEvent event ) {if( mouseDown inRange( event ) ) {action.run();}mouseDown false;}private static boolean inRange( MouseEvent event ) {Point size ( ( Control )event.widget).getSize();return event.x 0 event.x size.x event.y 0 event.y size.y;}[...]
} 该类是自定义UI控件3的摘录它显示了此类控件如何实现鼠标单击行为。 我们假设我们有一个适当的单元测试用例并且具有足够的覆盖范围并可以运行。 可以安全地假设在到达上面的代码片段之前已经进行了几个结构重构步骤。 将鼠标单击视为一项责任因此应将鼠标分为自己的类。 为此我通常从内部类开始在该类中将相关的方法和字段移至其中。 之后我将这种新类型的实例分配给周围类的新字段如下面的ActionItem构造函数所示。 最后但并非最不重要的一点是我通过将这些调用委托给新创建的字段4来修复现在未定义的方法 class ActionItem extends MouseAdapter {private Label control;private ClickHandler clickHandler;[...]ActionItem( Composite parent, Runnable action ) {this.control new Label( parent, SWT.NONE );this.clickHandler new ClickHandler( action );this.control.addMouseListener( this );}Overridepublic void mouseDown( MouseEvent event ) {clickHandler.markMouseDown();}Overridepublic void mouseUp( MouseEvent event ) {clickHandler.handleMouseUp( event );}static class ClickHandler {private Runnable action;private boolean mouseDown;ClickHandler( Runnable action ) {this.action action;}private void markMouseDown() { [...] }private void handleMouseUp( MouseEvent event ) { [...] }private static boolean inRange( MouseEvent event ) { [...] }}[...]} 通过成功运行ActionItem的测试用例并再次检查覆盖范围可以确定上述提取没有引入任何错误。 因此将ClickHandler最终移到其自己的文件中感觉很省钱。 但是现在有一个类充当某种“子组件”仅被“主”组件的测试用例间接覆盖。 我观察到这样的阶级经常养成自己的生活。 意味着它们的功能扩展了或者它们正在被其他类或两者重用。 在某个时间点添加有意义的和/或易于理解的测试可能会变得相当困难。 这是因为测试类本身缺乏通过将其分为两部分而引入被测单元的内聚性。 因此我通常立即为提取的类创建一个特定的测试用例。 甚至与MoreUnit可用一样这可以非常直观地实现实际上是自动为新的测试用例提供了一组基本的测试方法存根。 继续我们的例子中我们会打开提取ClickHandler在编辑器中按“Ctrl J” 5在upcomming向导哪种方法我们希望有创建存根和选择 按Finish将创建一个正确位于项目6的相应测试源文件夹下的测试用例根据您的MoreUnit设置其外观如下所示 public class ClickHandlerTest {Testpublic void testMarkMouseDown() {fail( Not yet implemented );}Testpublic void testHandleMouseUp() {fail( Not yet implemented );}
} 存根可以作为从头开始有意义地填充测试用例的起点。 但是请注意已经有完整的内容提供了ActionItemTest中的一组测试。 因此另一种可能性是将鼠标单击相关测试的内容移至新创建的ClickHandlerTest 。 尽管后者现在对新单元进行了彻底的测试但必须注意在ActionItemTest中还有足够的测试可确保ClickHandler 7的正确集成。 结论 现在工作了一段时间给人的印象是代码的可维护性和进一步开发包括测试用例逐渐得到改善。 当然可以说MoreUnit不应成为决定是否将某种责任归入自己的班级的关键因素。 但是在我看来通过帮助克服一个人较弱的自我只需单击几下鼠标就可以为新班级准备一个合适的测试用例从而简化了这样做的决定。 参见“测试驱动开发”的红色/绿色/重构原理。 罗伯特·马丁Robert C. Martin《清洁代码》第10章类 尽管该示例是受我当前工作的启发但我将其简化为本文所需的最低限度 进一步的重构步骤可能是更改ClickHandler使其扩展MouseAdapter或实现MouseListener。 之后单击处理程序本身可以在替换操作项的标签上注册为鼠标侦听器。 这将完全消除ActionItem委派的鼠标处理程序方法。 但是我在这里省略了此步骤以保持帖子的范围 此快捷方式通常用于在被测单元及其相应的测试用例之间切换。 当您很快适应这种情况时它以某种方式比特定的装饰者更多地充当了“缺失的测试提醒”…… 对于基于OSGi的系统这也可能是一个测试片段 请注意提取过程简化了鼠标单击功能测试的测试设置。 提取的类不依赖于构造函数中的SWT小部件派生类从而允许提供基于模拟的测试设置。 如果没有ActionItem麻烦那么后者是不可能的因此例如需要使用setup / teardown方法来创建初始化和处置Display / Shell实例。 参考来自Code Affine博客的JCG合作伙伴 Frank Appel的MoreUnit和MoreUnit 。 翻译自: https://www.javacodegeeks.com/2014/02/more-units-with-moreunit.htmlmoreunit