LoginSignup
2
3

More than 5 years have passed since last update.

LumenプロジェクトでDBを使用した部分のテストをする(Sqlite in-memory)

Last updated at Posted at 2017-06-24

Lumenフレームワークを使用したプロジェクトのテストを書く.

通常実行時とテスト実行時で使用するDBを分けるのがミソ

同じDBを使う設定にしているとCI/CDツールを用いたテストにこける時が多々ある.

環境

項目 バージョン
OS macOS Sierra ver.10.12.5
php 5.6
Lumen 5.2.9

サンプルプロジェクト

すでにテストなしの実装が完了している小さなapiです.
ダウンロード

振る舞いはLumenでDBと連携した簡単なapiを作ってみるに書いてあります.

手元で動かしたいって方は使用してください.
.envファイルがないので.env.sampleをコピーして適宜変更してくださいね.
composer installも忘れずに

実装

テスト時の設定

phpunitを用いてテストをする.
phpunit.xmlを編集

phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/app.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests/</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist>
            <directory suffix=".php">app/</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <!--以下を追加-->
        <env name="DB_CONNECTION" value="testing"/>
    </php>
</phpunit>

このファイルでテスト時の設定をいろいろいじることができます(できるらしい)が今回は1番シンプルな方法でいきます.

この<php>タグ内の記述はアプリケーションの環境変数を設定していますね.通常実行時はアプリケーションルート配下の.envを参照しますが,テスト時はここを参照するようです.

そしてDB_CONNECTIONtestingを設定したのですが,これはvendor/laravel/lumen-framework/config/database.php

database.php

・・・

'testing' => [
            'driver' => 'sqlite',
            'database' => ':memory:',
        ],

        ・・・

の部分を参照しています.このファイルにmysqlやsqlite使用の設定も書いてあります.

Laravelではconfigディレクトリがアプリケーションルート下に置かれてるのにLumenにはないので一応記述しておきました.

Migration & Seeding

database/migrationsdatabase/seeds以下にそれぞれ記述していく.

インメモリDBを使用するため,テストの都度MigrationとSeedingをしていく必要がある.

Migration,Seedingの記述をしても,それだけだと正常にテストされません.
テスト実行時にMigrationとSeedingが実行される設定が記述されていないからです.

その設定はRoutingTestが継承しているTestCaseクラスに記述します.

tests/TestCase.php
<?php
use \Illuminate\Support\Facades\Artisan;
class TestCase extends Laravel\Lumen\Testing\TestCase
{
    /**
     * Creates the application.
     *
     * @return \Laravel\Lumen\Application
     */
    public function createApplication()
    {
        return require __DIR__.'/../bootstrap/app.php';
    }
    /**
     * Create the TestDatabase
     */
    public function setUp()
    {
        parent::setUp();
        Artisan::call('migrate');
        Artisan::call('db:seed');
    }
}

setUpメソッドを追加しました.
このメソッドはテストが実行される前に実行されます.

*このTestCaseクラスではFacadeを利用しているため,bootstrap/app.php$app->withFacades();をコメントインしといてくださいね.

テスト

./vendor/bin/phpunitで実行できます.

$ ./vendor/bin/phpunit
PHPUnit 4.8.35 by Sebastian Bergmann and contributors.

..

Time: 614 ms, Memory: 14.25MB

OK (2 tests, 4 assertions)

長くなってしまいましたが,問題なくテストが通りましたね.

サンプル

今回,Migration,Seedingのところは割愛したので気になる方は,MigrationSeedingを参考にしてみてください

2
3
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
2
3