web-dev-qa-db-ja.com

自分の単体テストを書くには?

私は現在、独自の単体テストを作成しようとしています。私が書いている単体テストは、主に線形代数のためのものです(私はそこに素晴らしいパッケージがあることを知っていますが、自分のプロジェクトに自分のパッケージを使用したいと思います)。私の現在の線形代数はmy_vector.hpp/cpp(3d)とmy_matrix.h/cppで構成されています。

だから私は現在、test_vector.cpptest_matrix.cppを書いていて、my_vectorとmy_matrixの機能をテストしています。

vectorクラスのテストに関して、test_vector.cpp内でmy_vectorの加算、減算、除算、ドット積などの機能をテストします。

私のやり方は:

// test_vector.cpp
void test_add(){

    my_vector a(2.0, 1.1, 2.1);
    my_vector b(2.1, 2.0, 1.1);

    // manually computed by adding a and b by hand
    // 
    my_vector expected(4.1, 3.1, 3.2);


    my_vector c = a + b;

    assert(c.x == expected.x);
    assert(c.y == expected.y);
    assert(c.z == expected.z);
}

void test_sub(){

    .....
}

int main(){
    test_add();
    test_sub();
    ....
return 0;
}  

Test_matrix.cppについても同様です。

my_vector expected(4.1, 3.1, 3.2);では、最初に2.0、1.1、2.1のaと2.1、2.0、1.1のbを手動で追加し、次にc = a + bを使用した後に計算された値と比較しました。これは単体テストを行う適切な方法だと思いますか?回転やクロス積など、他の複雑なテストのために手作業で計算を行わなければならないので、少し面倒です。こういうのは、何か悪いことをしているような気がします。

私は何か間違ったことをしていますか?私に知らせてください、私はどんな提案でも開いています。

7
solti

これは非常に一般的な方法であり、wrongとは記述しません。ただし、別の方法もあります。たとえば、結果に適用できる別の計算を見つけることができます。この計算は、計算がより簡単で、正しいことを示すはずです。さらに、それはおそらく実現不可能ですが、約90度の回転の場合、内積を適用してそのゼロをチェックし、大きさが正しいことを確認することを検討できます。これにより、実装が正しいことを非常によく理解できます(これらの他のより単純な操作の実装が正しいことがすでにわかっている)。

これをさらに一歩進めて、ランダムデータに対してこのような計算を実行できます。多数のアイテムでこれを行うと、アルゴリズムですべてのEdgeケースをキャッチしたことを確信できます。

もう1つのアドバイス:ユニットテストフレームワークを使用していないことに気づきました。これは可能ですが、問題が発生した場合のフィードバックが改善されるため、フレームワークを使用することを強くお勧めします。 C++の場合、私は Catch を使用する傾向がありますが、他にも多くの選択肢があります。

5
Periata Breatta

Pariata Breattaが指摘したように、ユニットテストフレームワークを使用することは非常に健全なアドバイスです。テストがはるかに簡単になり、多くのIDEでサポートされています。

同等性テストをベクタークラス自体に置くことを検討してください。後でユニットテストでそれを再利用するのがはるかに簡単になります。おそらくいずれにしても、非常に便利になるでしょう。もちろん、そのための非再帰的な単体テストも作成します。すべてのコンポーネントをチェックするのが通常の方法であり、新しいメソッドを使用すると、それに対してアサーションが必要になるだけです。合計を比較するだけで、考えられる新しい障害ポイントが発生します(置換または数値エラーについて考えてください)。

浮動小数点数を処理すると期待どおりに結果が得られない可能性があるため、数値の不正確さの影響を考慮して、値の周りのイプシロンをサポートする「ほぼ等しい」チェックを提供することができます。

2
Eiko

あなたはそれを正しくやっています。手動のアプローチに対して私が見ることができる唯一の代替案は、信頼できるサードパーティのライブラリを使用して計算を実行し、テストスイートに計算とライブラリの計算を比較させることです。

もちろん、すでにアクセスできるライブラリの機能を実装することは冗長です。ライブラリが何らかの理由でライブに移行できず、独自のライブラリを実装する必要がある場合にのみ、これを行うと思います。

ちなみに、期待される結果は(4.1、3.1、3.2)になりませんか?

1
Eren

Google Test フレームワークを使用します。モック用にGoogle モックフレームワーク もあります。どちらもC++で使用するためのものです。

1
Eternal21