GeekFactory

int128.hatenablog.com

2016年の振り返り

2016年もお世話になりました。

概況

f:id:int128:20161231234424p:plain

振り返り

  • 仕事
    • Spring CloudとかSwaggerとかAWSとか触ってた。
    • JIRA, Confluence, Mattermost, ownCloud, GitBucket, Jenkins, Artifactory, SonarQubeとかをDocker Composeベースで開発基盤に導入してた。
    • 上期は暇で、下期は炎上してた。
  • 開発
  • プライベート
    • 3ヶ月弱の育休を取得した。視野が広がった。
    • 家族と過ごす時間を大切にできた。(12月以外)
    • 環境の変化に対応しながら家計を管理できた。

計画

エンジニア35歳定年を迎えます。家族と過ごす時間を大切にしつつ、専門性の高い仕事をしていけるように、働く環境を改善していきたいと思います。

2017年もよろしくお願いいたします。

Jenkinsで自分でビルドしたGitコマンドを使う

Jenkins Agentで自分でビルドしたGitコマンドを使う方法を説明します。新しいバージョンのGitを使いたい場合に有用です。

方針

JenkinsにはGitやAntなどの外部ツールを管理する機能があります。 外部ツールが必要になった場合に自動的にインストールスクリプトを実行することもできます。

設定方法

JenkinsのGlobal Tool ConfigurationにあるGit installationで、以下を設定します。

  • Name:適当な名前(例えば compiled-git)
  • 自動インストール:チェック
  • コマンド実行
    • ラベル:自動インストールを行うノードを限定する場合はラベルを指定します。
    • ツールホーム: bin/git

コマンドは以下を指定します。

GIT_VERSION=2.11.0
GIT_HOME="`pwd`"
echo "Using $GIT_HOME/bin/git"
if [ ! -x bin/git ]; then
  curl -LO "https://github.com/git/git/archive/v${GIT_VERSION}.tar.gz"
  tar -zxf "v${GIT_VERSION}.tar.gz"
  cd "git-${GIT_VERSION}"
  make configure
  ./configure --prefix="$GIT_HOME"
  make install
fi

これで設定は完了です。

実行

Jenkins Slaveにあらかじめ開発用パッケージを入れておく必要があります。RHEL系の場合は以下になります。

yum -y groupinstall 'Development Tools'
yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker

Gitを利用するジョブを実行してみましょう。初回のみGitのダウンロードとコンパイルが実行されるはずです。

CentOSに標準で入っているGitが古すぎてJenkinsのgit cloneが失敗する場合に使いました。Git以外にも応用できるので、いろんな場面で役に立つと思います!

改訂新版Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

改訂新版Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Spring BootアプリのテストをSpockで書く

Spring BootアプリケーションのテストをSpockで書く方法を説明します。最近のバージョンを対象にしています。

  • Spring Boot 1.4
  • Spock 1.1-rc-3
  • Groovy 2.4

本稿では以下のテストレベルを対象とします。

まずは、build.gradleに依存関係を追加しておきます。

dependencies {
    testCompile 'org.springframework.boot:spring-boot-starter-test'
    testCompile 'org.spockframework:spock-core:1.1-groovy-2.4-rc-3'
    testCompile 'org.spockframework:spock-spring:1.1-groovy-2.4-rc-3'
    testRuntime 'cglib:cglib-nodep:3.2.4'
}

コンポーネントテスト

このテストレベルでは、テスト対象の依存コンポーネントをモックに差し替えた状態でテストを行います。

SpockのSpecificationでDIコンテナを利用するには、以下のように@SpringBootTestアノテーションを付加します。

@SpringBootTest(webEnvironment = NONE)
class HelloServiceSpec extends Specification {
}

これにより@AutowiredでSpringがコンポーネントを注入してくれるようになります。Web Environmentは不要なのでNONEを指定しています。

モックを利用するには@TestConfigurationを定義します。以下のようにDetachedMockFactory#Mock()メソッドでモックオブジェクトを注入することを宣言します。SpockのMock()記法は使えないので注意が必要です。

    // Specificationのインナークラス
    @TestConfiguration
    static class MockConfig {
        final detachedMockFactory = new DetachedMockFactory()

        @Bean
        ExternalApiClient externalApiClient() {
            detachedMockFactory.Mock(ExternalApiClient)
        }
    }

あとは、Spockのお作法に従ってgivenブロックの中でモックのインタラクションを宣言します。

        given:
        1 * client.getDefault() >> new Hello('world')

E2Eテスト

このテストレベルでは、テスト対象のAPIに対してHTTPリクエストを投げてレスポンスを検証します。

@SpringBootTestアノテーションwebEnvironment = RANDOM_PORTを指定することで、実際にアプリケーションサーバが起動した状態でテストを実行できます。

@SpringBootTest(webEnvironment = RANDOM_PORT)

テスト対象にRESTリクエストを送るにはTestRestTemplateクラスを利用します。

    @Autowired
    TestRestTemplate restTemplate

RestTemplateのお作法に従ってリクエストを送り、レスポンスを検証します。

        when:
        def entity = restTemplate.getForEntity('/hello', Hello)

        then:
        entity.statusCode == HttpStatus.OK
        entity.body.name == 'world'

この場合も`DetachedMockFactory#Mock()で依存コンポーネントをモックに差し替えることが可能です。

まとめ

@SpringBootTestアノテーションでDIコンテナを使ってテストを実行する方法を説明しました。また、DetachedMockFactory#Mock()メソッドで依存コンポーネントをモックに差し替える方法を説明しました。TestRestTemplateクラスを使うとテスト対象APIにRESTリクエストを送信できます。

GitHubにサンプルプロジェクトを置いているので参考にどうぞ。

github.com