😨

Laravel テストコード実装中誤ってDBの情報を消してしまった件

2022/04/14に公開

はじめに

Laravelでのはじめてテストコード記述。
Rubyではテストコードを書いたことあったので、いけるだろうと思って実装。
そのテストの確認作業においてDBのデータを全て消してしまいました。
かろうじてdev環境のデータベースでしたので、なんとかなりましたが、これが本番データだったらと思うと血の気が引くばかりです。
単純なミスなので、完全に自分事ですが、2度と起こさない事を誓うために、書き留めておきます。

DB削除までの流れ

テストコードを記述。
Factoryを使いながら仮データを作成してテスト実行。
その中で、何故かFactoryで作ったデータが反映されない。
そうか、テストを何回も実行していたので、テストのDBにデータが残ってしまったのかもしれない、と思い、一旦DBの中を消そうと考える。←最大で唯一の誤り

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;

公式のマニュアルを確認すると上記記述発見。
この記述をすることでテストのDBの中身が消えるのか、と。

CLIで下記記述し、テストの実行

./vendor/bin/phpunit tests/Feature/Api/xxファイル名xx.php

はい。テストうまく通りました。
ってそういえば、テストのDBって作っていたっけ?
dev環境のDBだけだった気が。。

dev環境のDB確認。

・・・

まっさらでした。

頭の中もまっさらになりました。

原因

テスト用のDBの所在を確認していなかった

今回のシステムでは、テストのDBを作っておらず、dev環境のDBをもとにテストをしておりました。
既に記載のあるテストコードを確認すると、

Illuminate\Foundation\Testing\DatabaseTransactions

use DatabaseTransactions;

上のような記述が。
こちらのコードによって、テストを実行している間のみ有効なトランザクションとなるようです。
※dev環境のDBに、テスト時だけデータが追加されて、テストが終われば追加したデータが削除される

もっとよく調べて確認すべきでした。その1点です。

さいごに

DB削除後、バックアップを取っていただいていたので即リストアしていただきました。
が、普通ならありえないような事をおこしてしまいました。
テスト時に、どのDBに繋がっているか、確認をすることを怠らないようにします。(当たり前)
&感覚で作業しないよう気をつけてまいります。

Discussion