簡単な試みVS 2012 RcのC++原生ユニットテスト

2477 ワード


Vs 2012 Rcを装着、その1つの原因は、C++の原生ユニットテストであり、以前と同じである.Netでは完全に一致しています.これはとても楽しいことで、以下は簡単にテストします.
Stlを使用して、structのvectorのために反復器を作成し、structのメンバーを返す比較的一般的な作業を完了するとします.このようにする意味は何ですか?この構造のvectorを,あるフィールドに基づいてソートするには,sortアルゴリズムにこのタイプの反復器を提供するだけでよいと仮定する.このようにアルゴリズムは,コンテナが「何であるか」の問題を考慮する必要がない.
もちろん、sortを使用するために比較関数を書くことができますが、自分でもっと複雑なアルゴリズムを書くとしたら?私たちはstruct配列を直接、あるフィールドの配列に偽造します.これは最も手間のかかる方法ではないでしょうか.
 
では、まず、ネイティブユニットテストプロジェクトを作成します.
テストコードを書きます.簡単な意味です.あるvectorの反復器を作成し、戻り値が正しいかどうかを確認し、vectorの最後の位置に着いたかどうかを確認する必要があります.
TEST_METHOD(Iterator_Test)
{
    vector<Quote> q;
    Quote quote={1.00,2.00};
    q.push_back(quote);
    quote.open=2.00;
    q.push_back(quote);
    myit i(q.begin());
    Assert::AreEqual((double)1.00, (double)(*i),0.0001, L"message", LINE_INFO());
    ++i;
   Assert::AreEqual((double) 2.00, (double)(*i),0.0001, L"message", LINE_INFO());
   ++i;
  Assert::AreEqual<vector<Quote>::iterator>(q.end(),i,L"message", LINE_INFO());

		

 
では、この機能を実現する方法も簡単です.コードは以下の通りです.
 
struct Quote
{
        float open,close;
};

class myit : public std::vector<Quote>::iterator {
public:
    inline myit(std::vector<Quote>::iterator const &c):std::vector<Quote>::iterator(c) {}
    float operator*() {
        const Quote &p = std::vector<Quote>::iterator::operator*();
        return p.open;
    }
    typedef float value_type;
    typedef float *pointer;
    typedef float &reference;
};

 
ここでは抽象的ではなく,vectorに対する反復器を単純に実現し,アルゴリズムのパラメータとして提供することを望んでいることに注意する.興味があれば、任意のコンテナに対して反復器を迅速に提供し、メンバーを返すことを簡単に抽象化することができます.Iteratorのように、float、匿名関数はメンバー>iterを返します.もちろん,抽象的な過程において,既存のユニットテストは依然として有効である.これも敏捷開発でよく見られる順序です.まずテスト表現の意図を書き、最も簡単な方法でテストに合格し、必要に応じて抽象を考慮します.
テストの試行を開きます.既存のテストをリストし、実行するテストを選択し、実行します.ユニットテストはIde内でよく統合され、Tfsド生成サービスと正常に連携でき、Google Testのようなもので、これからよく休むことができます.