質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • CakePHP

    2386questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

CakePHP3でテストコードを書く際にテストデータを共通化したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 160

gano

score 6

いろいろ調べながら
CakePHP3で始めてテストコードを書いています。

理解が正しいのか不安なのですが、
現在、テストに関わるデータとして
FixtureとSeedとテストデータが
あると考えており、簡単に以下の理解をしております。

・Fixture
テスト開始時にDBに予め登録しておくデータ(TearDownで削除)

・Seed
本番環境で実際に使うデータ(テストには使わない方が良い)

・テストデータ
テスト対象のプロセスに対してインプットする値

また、いまやろうとしていることを
以下に示します。

ーーーーーーーーーーーー
■テスト概要
customersテーブルに対する顧客登録のテスト
 
■customersテーブルの概要とテストパターン
・入力項目は name と email
・テスト項目を合計35パターン用意。

■テスト対象
・customersTableに顧客登録のメソッドを書いたのでこれをユニットテストしたい。
・customersControllerで顧客登録フォームのロジックを書いたのでこれを結合テストしたい。
ーーーーーーーーーーーー

上記のことを行う場合、
customersテーブルのテストとcustomersControllerのテストは、
同じテストデータ(35パターンのテストデータ)を使うことになります。

ですので、テストデータを一元管理しようと思い、
testsディレクトリの中などにTestDataディレクトリを作り、
そこでCustomersTestDataなどのクラスを用意しようかと考えています。

最初、Fixtureで同じことができるのでは?と考えたのですが、
Fixutreはあくまでテスト実行前にDBをテスト開始状態にしておくもの
と解釈しており、正常系しか入力しないものと考えています。

しかしネット等で調べてもそのような記述は見つからず、、、
そもそも考え方が間違っているのではないかと
不安になり、こちらで質問をしております。

方向性としてどこか勘違い、理解不足の点ありませんでしょうか?
アドバイスを頂きたいと思います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/06/08 10:41

    タイトルには要件のみを記載してください。タグにある内容や、要件と関係のない文言はタイトルだけを見たときに質問内容を想像しづらくするのでなるべく入れないようにしてください。(質問本文も同様です。ノイズが多いと何が伝えたいのか分かりづらくなります)https://teratail.com/help/question-tips#questionTips3-1 >ありがちな失敗としては、「助けてください」「初心者です」という表題をつけてしまうことです

    キャンセル

  • mts10806

    2018/06/08 10:41

    質問編集画面タイトル横にある「初心者アイコン」をご活用ください。「初心者」と質問で書くよりも伝わりますし、質問一覧に表示されるのでわかりやすくなります。

    キャンセル

  • gano

    2018/06/08 10:46

    至らない書き方をしてしまい申し訳ございません。タイトル修正いたしました。

    キャンセル

回答 1

checkベストアンサー

0

ご認識の通り、フィクスチャは、テスト実行前にDBに投入されるデータなので、テスト時の入力パターンを定義する場所としては不適切だと思います。emailの重複チェックなどの目的で事前にDBに投入するデータがあるのであれば、フィクスチャを使えばいいと思います。

テスト実行時の入力パターンの定義については、複数の場所で利用されるのであれば、クラスなどを自前で作って管理するのは、別に間違ってはいないと思います。ただ、コントローラのテストとモデルのテストでは、実行の結果(出力)が異なってくる気がするので、それはどうするのか気になりました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/11 10:55

    ご回答ありがとうございます。

    結局、
    test/TestDataディレクトリを作成し、
    test/TestData/CustomersTestData.phpを用意しました。

    各テストケースに連番をつけて
    $this->testData = new CustomersTestData();
    $this->testData->getTestData(1) // [ 'name' => '山田 太郎' , 'email' => 'test@email.com']
    という感じでアクセスできるようにしています。

    モデルのテストでは、入力が誤っているとsaveエラー → 例外処理
    コントローラのテストでは、入力が誤っていると確認画面にいかず、入力エラーの文字が表示される
    というところをassertしておのおの動作確認しています。

    キャンセル

  • 2018/06/11 12:49

    いいと思いました!
    コントローラのテストの期待するエラーメッセージもテストデータと一緒に管理してもいいかもしれません。
    入力と出力が一緒に定義されていた方が可読性がいいので

    キャンセル

  • 2018/06/11 21:01

    ありがとうございます。
    記載していませんが、エラーメッセージもデータと一緒に管理する形にしております。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • CakePHP

    2386questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。