月度归档: 2015 年 10 月

  • Maven Wrapper

    Maven Wrapper

    Maven是一个常用的构建工具,但是Maven的版本和插件的配合并不是那么完美,有时候你不得不切换到一个稍微旧一些的版本,以保证所有东西正常工作。

    而Gradle提供了一个Wrapper,可以很好解决版本切换的问题,当然更重要的是不需要预安装Gradle。

    Maven虽然没有官方的Wrapper,但是有一个第三方的Wrapper可以使用。

    安装很简单mvn -N io.takari:maven:wrapper,安装完成如下

    安装

    使用的时候直接./mvnw clean install即可,它会自动下载最新版本来执行。

    运行

    如果需要指定版本,重新生成mvnw文件在运行即可

    mvn -N io.takari:maven:wrapper -Dmaven=3.1.0
    ./mvnw clean install

    切换版本…

  • Spring Boot结合FluentLenium做集成测试

    对于Web应用,一般为了测试功能性,都会结合selenium做功能性测试。

    Selenium会启动浏览器访问网站,然后对网站进行交互性操作,并判断结果。

    一般的操作流程是,打war包,部署war包,等待Web应用启动,开始测试,整理测试结果,关闭Web应用。

    而Selenium只是一个测试工具,并不会管理其他问题,需要自己处理web应用的启动和关闭。

    同时Selenium暴露的API有些底层,对于WebDriver的管理需要自己控制,对于元素的查找等也比较繁碎。

    Spring Boot在1.2.X版本中增强了对于Integration测试的集成,当然也包括了WebIntegration的集成,可以使用这部分功能来管理除具体测试以外的管理问题,
    Spring Boot会在测试开始前启动Web应用,并在测试后关闭它们。

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = WebApplication.class)
    @WebIntegrationTest({"server.port=0","spring.profiles.active=test"})

    在测试类加上这段注解,server.port=0表示随机选取端口,而spring.profiles.active=test指定了当前profile为test。

    修改profile是很实用的,比如以我个人的习惯,我会在dev和prod中使用真实的数据库和其他组件,而在CI服务器上一般使用内存数据库,其他依赖组件尽可能使用内嵌式的,或者由docker提供,这样的话相关配置的区别就需要在不同的profile中区分了。

    随机化的端口可以保证测试不会由于端口占用失败,但是测试中我们需要用

    @Value("${local.server.port}")
    int port;

    把具体的端口号取到,以便在测试中使用。

    FluentLenium是一个写selenium测试的工具库,它可以帮你管理webdriver,并提供了更简单的API来加快测试的开发速度和可读性。

    FluentLenium默认使用的是Firefox Driver,可以自己修改。

    比如有一个测试去测试首页的标题

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = WebApplication.class)
    @WebIntegrationTest({"server.port=0","spring.profiles.active=test"})
    publicclass HomeTest extends FluentTest {
    @Value("${local.server.port}")
    
    …
  • 使用Java DSL配置Spring Integration

    Spring Integration是Spring下的一个项目,主要为了扩展Spring现有的模型已支持Enterprise Integration Patterns。

    Spring Integration还和其他项目结合紧密,比如Spring XD就可以使用其作为输入来源。

    Spring Integration可以完全依赖于xml工作,即意味着一个核心系统完成后,可以只单单更改xml配置本身来完成相关功能变更。

     

    但是xml配置也有不便利的地方,特别是在项目开发初期,对于开发人员而言,xml的表达能力自然不如java,在需要功能扩展的时候也必须需要java代码才行。

    而Spring的一个新的子项目spring-integration-java-dsl就可以实现使用java dsl来配置相关功能。

    以最简单的消费atom源为例,xml的配置如下

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:int="http://www.springframework.org/schema/integration"
    xmlns:file="http://www.springframework.org/schema/integration/file"
    xmlns:feed="http://www.springframework.org/schema/integration/feed"
    xsi:schemaLocation="http://www.springframework.org/schema/integration/feed http://www.springframework.org/schema/integration/feed/spring-integration-feed.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/integration/file http://www.springframework.org/schema/integration/file/spring-integration-file.xsd
    http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd">
    <feed:inbound-channel-adapter id="news" url="https://spring.io/blog.atom">
    <int:poller fixed-rate="5000"/>
    </feed:inbound-channel-adapter>
    <int:transformer
    
    …