TDD开发实践
JParsec 与 JPJson最近两天写了两个项目,一个是JParsec,另一个是JPJson. JParsecJParsec是Parsec的Java版本实现.由于暑假实习的时候已经写过了JSParsec,所以JParsec写起来还算是轻车熟路.但是说实话,动态语言写Parsec这种东西还是比Java这种静态的,朴素的纯面向对象语言写起来要舒服很多.由于JParsec涉及的类型转换比较多,所以写完JParsec之后,也算比较深刻的理解了为什么Java的类型系统这么招黑. JPJsonJPJson是一个json数据解析引擎.对外设计的接口模仿了Google的Gson. Why JParsec and JPJson?在开发JParsec和JPJson的过程中呢,我也是第一次开始体验了TDD开发的模式. Intelij IDEA中的单元测试的使用在Intelij中使用单元测试功能非常的方便,只需要下面几步就可以了. JParsec中一个使用单元测试的实例@Test
public void testSepBy() throws Exception {
State state = new TextState("a|a|a|a");
Parser s = AtomOperator.equal('|');
Parser eq = AtomOperator.equal('a');
Parser sepBy = CombinatorOperator.sepBy(eq,s);
List<Object> list = (List<Object>) sepBy.parse(state);
assertEquals(4,list.size());
assertEquals(7,state.pos());
}
在准备写SepBy这个算子之前,我写下了上面这个测试用例. 接下来就是返回值,这里可以返回数组,同时也可以返回Collection.各有各的好处,如果使用数组,就可以支持Primitive类型数组的直接返回,但是拓展性难以保证,并且没有充分利用到面向对象的特性.如果使用List看似很好,只是不能使用基本类型的数组而已,但是实际上还是挺麻烦的,因为 经过两相权衡,最终我选择了返回List类型. 接下来就是Junit库的功能了,使用assertEqual()方法,可以断言一次运行返回的结果. 这里有个小技巧,为了避免每次断言的时候都写上Assert.assertEquals(),我们可以使用java提供(se5)的静态导入功能 从上面就可以看出来,TDD让我在实现具体的功能之前,已经对整个功能有了一个比较具体的的概念
TDD开发体验经过这两个项目的实践,我掌握了TDD的基本使用. 使用TDD在写代码之前强迫程序员先思考好某个模块的具体功能,边界条件等.为了能够达到比较高的测试覆盖率,TDD也会倒逼程序员改善整个项目的代码结构以便单元测试达到较高的测试覆盖率. 由于JParsec项目天然的特性,所以JParsec项目中测试的覆盖率达到了100%. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |