3

私は単体テストが初めてで、現在取り組んでいる既存のプロジェクトで PHPUnit を使い始めようとしています。

私が直面している問題は、十分に公平なデータベースを必要とする多くの単体テストがあることです。単体テストのみを目的として SQLite DB をセットアップしました。不必要なデータの衝突を防ぐために、新しいテスト用にデータベースを削除して再作成したい場合があります (これは、個別のクラスを意味します)。

ただし、同じクラスに相互に依存する単体テストがある場合、これが発生したくない場合があります。これらは、以前のテストで保存されたデータにアクセスする必要がある場合があります。

現在、各クラスの setUp() 関数で「新しい」データベースを取得しています。私が予想していなかったのは、この関数 (__construct() と同様) が、そのクラス内のすべてのテスト ケースの後に実行されることです。

各テスト クラスでデータベースをフラッシュする方法はありますか? それとも、プロセス全体を間違って進めていますか?

ヒントをいただければ幸いです。

4

2 に答える 2

3

私もかなり最近(約1年前)にPHPUnitを使い始めました。私が最初にしたことは、当時取り組んでいたプロジェクトの単体テストを設定することでした。データアクセス層もテストするのは良い考えだと思い、あなたと同じようなことをしました。セットアップに数日かかり、実行に8分かかる単体テストになりました。その時間の99%は、テストデータベースのセットアップと破棄に費やされました。なんて惨事だ!

私が行ったのは、プロジェクトをリファクタリングして、実際に1つのクラスだけがデータベースと通信する必要があり、このための統合テストが行​​われるようにすることでしたが、単体テストはありませんでした。つまり、私のプロジェクトでは、テストを容易にするために依存性注入を使用する必要がありました。最終的には、約2〜3秒で実行される一連のテストと、実際に自分自身を作成するプロジェクトになりました。維持し、変更/追加を行うことは夢です。すべてのコードがそのように記述されていればよかったのですが。

基本的に、私が長い間言いたいのは、テスト駆動の方法で設計されていないコードに単体テストを強制的に適合させるのではなく、テストしやすいようにコードを変更する必要があるということです。あなたが今それに投資した時間(可能であれば)は後で配当金で返済されます!

弾丸を噛んで今すぐリファクタリングしてください!

于 2012-07-30T17:41:21.813 に答える
2

setUp および tearDown 関数は、あなたが言及したとおりに動作します。つまり、テスト実行ごとにテスト環境をセットアップし、テスト ケース実行ごとにクリーンアップします。

おそらくやりたいことは、データベース データ プロバイダーをスイート レベルでセットアップすることです。

スイートレベルの備品

これは、真に分離された単体テストを取得するための最善の方法ではない可能性があります (つまり、DB などのモック データ プロバイダーを設定できます)。しかし、それはあなたの差し迫ったニーズを満たすためにあなたができることです.

于 2012-07-30T17:11:23.977 に答える