geb for browser functional testing

虽然现在不做前段了,但是发现好的工具还是很兴奋。今天在twitter上看到Grails in Action的作者 @pledbrook 转了一个geb 0.4的消息,顺带看了一下这个工具 http://geb.codehaus.org geb项目旨在创造一套groovy dsl帮助人们进行webapp的functional test。它是对selenium的封装,举例: @Grapes([     @Grab(’org.seleniumhq.selenium:selenium-firefox-driver:latest.release’),     @Grab(’org.codehaus.geb:geb-core:latest.release’) ]) import geb.* println "Dependencies downloaded, ready for testing" Browser.drive(’http://sunng.info:8000/Pacajus’){     assert title== ‘Pacajus’     assert $("p", 3).text() == ‘Population: 41558′ } println "Tested, bye" 打开页面,执行断言。如果断言失败,driver方法会报null: Caught: geb.error.DriveException: null 只要在命令行用groovy执行即可,grapes会搞定依赖关系。 很方便吧,文档上说还可以跟grails / junit等等集成,快去看看吧 http://geb.codehaus.org/manual/latest/index.html The post [...]

Posted in: 装备 by Sunng No Comments , ,

Maven recipe #1: Test Java code with groovy

问题: 受够了,不想写Java了,写个含有数据的map还要new出来一个一个put进去,想用groovy解决单元测试 解决: gmaven+groovy eclipse插件可以解决这个需求 在pom.xml中添加gmaven的依赖,注意,仅用来测试。老大不让生产代码里有不可靠的东西。 …         <dependency>             <groupId>org.codehaus.groovy.maven.runtime</groupId>             <artifactId>gmaven-runtime-default</artifactId>             <version>1.0-rc-3</version>             <scope>test</scope>         </dependency> …             <plugin>     [...]

Posted in: 把戏 by Sunng No Comments , ,

Groovy http-builder tips

最近用Groovy的HttpBuilder模块开发RESTful服务的客户端,遇到不少问题,浪费不少时间 网上的例子都是从Grape开始的,但是按照例子上运行,无论是通过grape install还是在代码里@Grab都没有办法把http builder加到classpath里,甚至依赖关系已经下载到~/.groovy/grapes里了,但是还是在import的时候报错。用Grails的时候也是一样,如果通过ivy定义依赖,通过ant下载到lib目录中,在grails shell里还是没有办法引用。不理解了,难道还需要手动再指定path吗。最后用grails的rest插件(grails install-plugin rest)总算是下载到了path中了。 第二是http builder的报错太智能了,它会把服务器端50x的报错输出在客户端。在查看错误的时候一定要分清楚。 第三是net.sf.json-lib这个库在转json的时候有一点问题,比如这样的js对象 {“result”:”success”} 会因为key上有引号而无法解析,必须是这样的格式: {result: “success”} 至于那种是正确的json我也没有兴趣了解了,只是非常遗憾的是couchdb返回的都是前一种形式。 当然了,瑕不掩瑜,http builder还是提供了非常方便的封装,比直接用HttpURLConnection或是HttpClient更加Groovy

Posted in: 把戏 by Sunng No Comments ,

Mapping Geometry in Grails and MySQL

针对地理数据的ORM,有一个Hibernate的扩展HibernateSpatial项目可以将JTS对象映射到MySQL/PostGIS/Oracle中。这个扩展同样可以用在Grails里,这里有一篇简单的介绍,关于在Grails和MySQL中管理地理数据: http://www.grails.org/MySQL+GIS-Geometry+with+Grails 不过按照这个文章里介绍的方法用,很可能会遭遇这样的报错: org.hibernate.MappingException: No Dialect mapping for JDBC type: 2003 这个问题最终在这里得到了解答: http://n2.nabble.com/No-Dialect-mapping-for-JDBC-type-2003-td1141106.html 按照邮件列表里的反映,上面的配置在Postgis里是可以work的,但是如果用Mysql还需要指定JPA的columnDefinition,对应的Hibernate属性是sql-type。虽然作者承诺会在今后的版本里修改这个问题,不过眼下的M2版本还没有修正这个问题。为此,Grails的用户特地提出在Grails中加入sql-type的支持: http://jira.codehaus.org/browse/GRAILS-3201 现在按照下面文档的说明,可以在mapping里指定sqlType了: http://grails.org/doc/latest/ref/Database%20Mapping/column.html 实例代码里的domain定义应该改成: import com.vividsolutions.jts.geom.Polygon import org.hibernatespatial.GeometryUserType public class MyPoly { String name Polygon poly static mapping = { poly type: GeometryUserType, sqlType:”GEOMETRY” } } 于是,再也没有莫名其妙的No Dialect报错了。

Posted in: 手艺 by Sunng No Comments , , , ,

Reading GPS Data From EXIF Using Groovy

废话不说了,直接上code吧: import com.drew.imaging.jpeg.*; import com.drew.metadata.*; import com.drew.metadata.exif.*; file = new File(“sample.jpg”); meta = JpegMetadataReader.readMetadata(file); gpsdir = meta.getDirectory(GpsDirectory.class); lat = gpsdir.getRationalArray(GpsDirectory.TAG_GPS_LATITUDE); lon = gpsdir.getRationalArray(GpsDirectory.TAG_GPS_LONGITUDE); lats = lat[0].doubleValue() + lat[1].doubleValue()/60 + lat[2].doubleValue()/3600; lons = lon[0].doubleValue() + lon[1].doubleValue()/60 + lon[2].doubleValue()/3600; println(lats); println(lons); metadata-extractor似乎是现在惟一的读取exif信息的java库。在ivy中可以添加这样一个依赖: <dependency org="com.drewnoakes" name="metadata-extractor" rev="2.4.0-beta-1" conf="runtime"/>

Posted in: 手艺 by Sunng 2 Comments , ,