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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

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

Q&A

解決済

1回答

637閲覧

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

gano

総合スコア39

CakePHP

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

0グッド

0クリップ

投稿2018/06/08 01:37

編集2018/06/08 01:45

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

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

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

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

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

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

ーーーーーーーーーーーー
■テスト概要
customersテーブルに対する顧客登録のテスト

■customersテーブルの概要とテストパターン
・入力項目は name と email
・テスト項目を合計35パターン用意。

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

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/08 01:41

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

2018/06/08 01:41

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

2018/06/08 01:46

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

回答1

0

ベストアンサー

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

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

投稿2018/06/10 05:17

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gano

2018/06/11 01:55

ご回答ありがとうございます。 結局、 test/TestDataディレクトリを作成し、 test/TestData/CustomersTestData.phpを用意しました。 各テストケースに連番をつけて $this->testData = new CustomersTestData(); $this->testData->getTestData(1) // [ 'name' => '山田 太郎' , 'email' => 'test@email.com'] という感じでアクセスできるようにしています。 モデルのテストでは、入力が誤っているとsaveエラー → 例外処理 コントローラのテストでは、入力が誤っていると確認画面にいかず、入力エラーの文字が表示される というところをassertしておのおの動作確認しています。
popobot

2018/06/11 03:49

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

2018/06/11 12:01

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問