これは、単体テストの世界への私の最初のステップですので、しばらくお待ちください。Qt 4.8.1 C++ プログラムを作成しており、テスト フレームワークとして統合された QTestLib を使用しています。基本ファイルから継承し、特定の XML ファイルを読み込んで、set/get 関数を介して取得および設定できる xml 値を持つ C++ クラス オブジェクトを返す関数を使用して、後でそのファイルを読み込んで解析するクラスをテストする必要があります。コンストラクターのクラスは QFile オブジェクトをインスタンス化し、readXml 関数でそれを使用して QXmlStreamReader でファイルを解析します。このすべてのクラスを単体テストでテストする最良の方法は何ですか? ファイルの内容を表す独自の文字列を挿入するために、ファイルの読み取り操作をバイパスする方法がわかりません。または、別のアドホック XML ファイルをテスト コンテンツとして使用する必要がありますか?
1 に答える
ファイルの内容を表す文字列を挿入することは、このようなクラスをテストする最も簡単な方法のようです。ただし、クラス コンストラクターでインスタンスを直接インスタンス化すると、QFile
これが不可能になります (つまり、依存関係を注入することは不可能です)。QFile
さらに、 a の「フェイク」または「モック」バージョン(別名 a のTest Double )を作成するのはかなりの作業QFile
です。
QIODevice
これを解決する最も簡単な方法は、クラス コンストラクターにa を渡すことです(QFile
継承元QIODevice
)。単体テストでは、QIODevice
テストしたい内容を含む を渡すことで、ファイルの内容を偽造できます。この場合、コンテンツを任意に設定できるQBufferを使用してこれを実現できます。そのため、クラスは次のようになります。
class MyXmlParser
{
MyXmlParser(QIODevice* device);
...
};
単体テストは、QBuffer
;を使用してクラスを構築します。プロダクション コードは、QFile
.
テストで実際の XML ファイルを使用する必要がありますか?
一般的に言えば、単体テストの外部依存関係が多いほど、将来壊れないようにするためのコストが高くなります (単体テストがそのコンテキストに敏感になる可能性があります)。そのため、テストが自己完結型であることを確認するために、実際の XML ファイルの使用を避けることをお勧めします。さらに、実際の XML を渡すということは、QFile と XML パーサーを暗黙的にテストしていることを意味します (つまり、単体テストではなく、統合テストです)。一般に、パーサーに渡す IO デバイスは機能すると想定できます。パーサーが IO デバイスを正しく使用し、XML を適切に解析できることを確認するだけで済みます。
xunitpatterns.com の資料、特にTest Smellsのセクションを読むことを検討してください。