作者:佚名
原文链接:http://googletesting.blogspot.tw/2009/08/tott-testing-gwt-without-gwttest.html
由于GWT(Google Web开发工具集)是新的,而且令人兴奋的是它很容易让人忽略那些累积了三十多年的GUI代码结构。
GwtTestCase 很适合测试那些用Javascript编写的特定UI的代码。但如果用GwtTestCase你会发现测试非UI客户端逻辑,你可能没有一个很清晰的视图/视图处理分离方式。独立的视图层和视图处理层有利于多模块化,有更容易测试的代码并且更短的测试时间。这里介绍如何把它们应用到一个GWT应用中。
术语定义:
l Server- 一个完全不依赖于GWT的标准后端。
l Model- 数据层。可以在客户端和服务端共享,或者如果合适的话,你可以为客户端弄一个不同的数据层。数据层同样不依赖GWT。
l View- 视图层。通过包装GWT小部件的视图类,从你剩余的代码中隐藏它们。该层不考虑逻辑,无状态,都是可以很容易被mock化的。
l Presenter -视图处理层,所有客户端逻辑和状态;它和服务端交互,并通知视图要做什么。它使用来自GWT的RPC机制,但不包括部件。
视图处理层,包含了所有感兴趣的客户端代码,是完全可以通过Java测试的。
public void testRefreshPersonListButtonWasClicked() { IMocksControl easyMockContext = EasyMock.createControl() mockServer = easyMockContext.createMock(Server.class); mockView = easyMockContext.createMock(View.class); List franz = Lists.newArrayList(new Person("Franz", "Mayer")); mockServer.getPersonList(AsyncCallbackSuccessMatcher<list<person>>reportSuccess(franz))); mockView.clearPersonList()); mockView.addPerson(“Franz”, “Mayer”); easyMockContext.replay(); presenter.refreshPersonListButtonClicked(); easyMockContext.verify(); } |
测试失败的用例,现在可以像改变预期结果一样简单。通过在以下期望值之间切换,上面的测试可以执行一条成功的和两条服务端失败的测试。我们输出一条错误信息。
mockServer.getPersonList(AsyncCallbackFailureMatcher<list<person>>reportFailure(failedExpn)) |
你还需要一个端到端测试。但所有的逻辑是要可测的,并且是小而快的测试。
源码是开源的,可以从以下地址下载:
1. AsyncCallbackSuccessMatcher.java.
2.AsyncCallbackFailureMatcher.java.
考虑到可以利用测试驱动开发(TDD)去开发视图处理层。它趋向于更高的测试覆盖率,更快以及更重要的测试,以及更好的代码结构。