LoginSignup
10
7

More than 5 years have passed since last update.

SQLServerだからといって諦めずに、CircleCIでテスト自動化する

Last updated at Posted at 2017-01-15

はじめに

昨年後半からデータベースにSQLServerを使っているプロジェクトに携わっています。
TravisCICircleCIなどの代表的なCI as a ServiceMySqlPostgreSQLはサポートしていますが、SQLServerはサポートしていません。

ここで諦めずに、CircleCIでテスト自動化する方法を探っていきます。

Microsoft SQL Server on Linux for Docker Engine.を使う

はじめ、CIのコンテナに直接、SQL Server on Linuxをインストールする方法を考えました。

が、CI as a Serviceでよく使われているUbuntuだと、16.04 and 16.10のみサポートしているとのことで、公式のDockerイメージを使うことにしました。

使用上の注意事項

mssql-server-linuxを使用するには、いくつか要件と制限事項があります。

要件

制限事項(2017年1月15日現在)

ボリュームのマッピングに対応してません。
したがって、データの永続化ができません。
CIでテスト自動化する分には問題ありませんが、ローカルの開発環境にはほぼ使えないかと思います。

PHPで小さいアプリを作り、docker-composeで動かす

PHPでDBマイグレーションするだけの小さいアプリを作り、mssql-server-linuxコンテナとリンクするようにしました。
docker-compose.ymlは下記のとおりです。

# docker-compose.yml
mssql:
  build: ./docker/mssql
  env_file: ./docker/mssql/.env
  ports:
    - "1433:1433"
php:
  build: ./docker/php
  env_file: ./docker/php/.env
  links:
    - mssql
  volumes:
    - .:/data/

githubにレポジトリを公開してますので、詳細はそちらをご確認ください。

CircleCIで動かしてみる

circle.ymlは、最終的に下記のようになりました。

# circle.yml
machine:
  timezone:
    Asia/Tokyo
  services:
    - docker

dependencies:
  override:
    - docker-compose up -d
    - docker-compose run php composer install

database:
  override:
    - docker-compose run php php app/bootstrap.php

test:
  override:
    - docker-compose run php vendor/bin/phpunit

docker-compose.yml のフォーマットは、Version 1のみサポート

CircleCIにおいて、Version 2は、現状、サポートされないので、Version 1で記述します。

テスト

マイグレーションで投入した3件のレコードを取得して、件数があっているか確認するだけのテストをPHPUnitで実行します。

<?php

class Example extends PHPUnit_Framework_TestCase
{
    /** @var PDO */
    private $pdo;

    public function setUp()
    {
        $container = require __DIR__. '/../app/container.php';
        $this->pdo = $container['db'];
    }

    /**
     * @test
     */
    public function findRecords()
    {
        $sql = <<<SQL
SELECT * FROM [user] WHERE [id] in (1, 2, 3);
SQL;

        $records = $this->pdo->query($sql)->fetchAll();

        $this->assertCount(3, $records);
    }

}

下記のように、OKが出れば成功です。

ci.png

おわりに

とかくプロプライエタリなソフトウェアな印象が強いSQLServerですが、Microsoft SQL Server on Linuxの登場によって、UNIXベースのエコシステムに乗っけやすくなってきました。

Windows AzurePHPを動かす場合であってもMySQLが選ばれてきたケースが多いと思いますが、今後はSQLServerが積極的に選ばれるかもしれませんね。

ではでは。

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7