2

私はsqlite::memory:単体テストに使用してきました。これは迅速で、テストのクリーンアップを自動化します。しかし、SQL サーバーの想定により、テストでバグが見つからない可能性があるのではないかと心配しています。(この特定のコードは DB 中立であると想定されていますが、実用的にはMySQL で動作する必要があります。)

具体的な例として、sqlite への日付文字列の入力は文字列 (*) として格納されるため、まったく同じ形式で返されると思います。一方、MySQL では、それらは解析され、正規化され、一貫した形式で返されるように見えます。私のより大きな懸念は、私があまり意識していない違いがあるということです。

これを処理する最善の方法は何ですか? たとえば、mysql のすべての単体テストも繰り返します (遅い - インメモリ MySQL DB を作成する方法はありますか?)。いくつかの主要な関心領域について mysql テストを行うだけですか? MySQL を使用する機能テストに依存します (これが私の現在のアプローチですが、カバレッジはかなりむらがあります)。私が考えていない他の何か?

*: "2012-12-25 09:12:34" を指定すると、正確な文字列が返されます。「2012-12-25 09:12:34 UTC」を指定すると、正確な文字列が返されます (つまり、今回はタイムゾーンが含まれます)。「2012-12-25 09:12:34 hello world」と入力すると、「2012-12-25 09:12:34 hello world」が返されます:-(


この特定のケースでは、PHP、PDO、および PHPUnit を使用しています。私は言語に依存しない戦略を追求していますが、PDO は非常に薄い抽象化であり、接続文字列と低レベル API 呼び出しの抽象化に関係していることに注意してください。データベース間のデータ型の違いを抽象化しようとはしません。

4

2 に答える 2

2

私が働いている場所で通常行っていることは、テストを次のように分割することです。

  • 単体テスト: インメモリ データベース (私の場合はH2 ) を使用して、非常に高速です。

  • 統合テスト: より遅く、「実際の」データベースを使用し、さらに追加の (実行時間の長い) テストを使用します

開発中は、単体テストを実行するだけです。自動ビルドは統合テストも実行します (ただし、必要に応じて自分で実行することもできます)。

于 2013-01-21T12:27:16.867 に答える
2

MySQL 固有の SQL の詳細をテストしたい場合は、MySQL でテストするだけです。

MySQL にはMEMORYストレージ エンジンがありますが、これは他のエンジンと完全に互換性があるわけではありません。データベースは RAM ディスク (tmpfs) に配置する必要があります。

SQLite には、日付/時刻専用のデータ型がありません。

于 2013-01-20T11:48:52.007 に答える