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

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

新規登録して質問してみよう
ただいま回答率
85.49%
テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

Q&A

解決済

3回答

3470閲覧

外部キー制約が関わるテストについて

ponzu_647

総合スコア51

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

0グッド

0クリップ

投稿2016/05/06 11:48

とあるテーブル(仮にA)のデータを削除しテストデータを追加してから、テストをしたいと思っています。

その際に、Aに対して外部キー制約を張っているテーブルBがいます。
Bの制約でAのデータを削除できません。

このような場合、みなさんはどのようなアプローチをとられますか?

思いつくところだと、テスト前にBの制約を外しテスト後に制約を付け直すです。
ただし、制約が複数ついたテーブルは、大変かなという気持ちです。

なにか良い方法があればアイディアお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

テスト駆動開発とあるので、ユニットテストツールを使ってテストしている前提で話をします。

私がテストする場合は、空のテーブルを使うのが基本なのでこの手のものだいは起こらないことが多いです。

ユニットテストでは、実行されるテストの順序が変わったりテストを削除したりするとテスト結果が変わってしまうのを避けるために、個々のテストでテストデータは作り直すことが推奨されます。そのため、ponzuさんの環境は、ユニットテストには向いていないかもしれないと考えています。

テスト用のDBインスタンスは用意できていますか?できていないなら、是非用意してください。リグレッションテストとは違い、データ量は少ないので、作れない理由はあまりないと思います。

テストケース毎に、テストデータを作り直すということからわかると思いますが、ユニットテストでDBを使っていると結構重くなってしまいます。テスト駆動開発の場合、テストの回数はかなり多いので、実行速度はかなり重要になります。オブジェクトのCRUDのテストはともかくとして、ロジックのテストであれば、モックオブジェクトなどを使って、DBアクセスを抑えるのも良い方法です。

投稿2016/05/07 16:26

iwamoto_takaaki

総合スコア2883

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

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

0

これはテストの内容に依ると思います。

例えば、
Aについての単体テスト
「Bの制約」についても試験対象
によって変わってきます。

意見が割れる、というよりは「条件が固まっていない」ことが悩む要因だと思います。仰る通り、「BのみでなくC、D・・・と複雑な依存関係の場合」も考えられますし、逆に「Aが単独で非常に大きく、Bの制約の方を直したほうが楽」ということもありえます。

投稿2016/05/07 00:38

HogeAnimalLover

総合スコア4830

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

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

0

Bも消せばいいんじゃ?

投稿2016/05/06 11:52

takasima20

総合スコア7458

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

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

ponzu_647

2016/05/06 11:54

なるほど、Bを消してしまいテスト後に作り直すというのは、状態を管理しなくなるので良さそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問