1

私は現在、機能を拡張する前に既存のプログラムをリファクタリングするために、単体テスト (今週学んだばかりです) を実行しています。

ただし、UnitTest ++は、テンプレートクラスで約5〜6個のテストを実行した後(完全なコードはこちら)、「プロジェクトに0個のテストが含まれています」というエラーが突然発生し、テストを元に戻したにもかかわらず、このエラーが発生し続けますエラーが表示される前のコードに戻します。現在、オブジェクトがインスタンス化されるたびに失敗します。

このクラスは、最適化アルゴリズムでデータの配列を管理するためのものであるため、関数は配列を初期化、読み取り、書き込み、および更新するだけであり、それ自体は問題になることはありません (または多くのテストが必要)。

同様の問題を議論しているスレッドが見つかりません。誰かが私にその原因を指摘できれば、それは素晴らしいことです.

仕様:

Windows 8.1 の IDE として CodeLite 8.2.0 を、コンパイラとして MinGW (TDM-GCC-32) を、ユニット テスト フレームワークとして UnitTest++1.3 を使用しています。

UnitTest++ が壊れる前のコードは次のとおりです (役に立つ場合があります)。

#include "C:\UnitTest++-1.3\src\UnitTest++.h"
#include "candidate.h"
#include <stdexcept>
using namespace std;
int main(int argc, char **argv)
{
   return UnitTest::RunAllTests();
}
//Test constructor and initialization of memories
TEST(init_num){
int numvar=4;
int fit_size=2;
int err=0;
Candidate<double> can;
try{
    can.init_can(numvar, fit_size);
}
catch(out_of_range){
    err=1;
    }
catch(invalid_argument){
    err=2;
    }
CHECK(err==0);
//CHECK(can.num==numvar);
}
TEST(init_fitrange){
int numvar=2;
int fit_size=-1;
bool err=0;
Candidate<double> can;
try{
    can.init_can(numvar, fit_size);
    }
catch(invalid_argument){
    err=1;
    }
CHECK(err==1);
}
//Skip memory initialization check. If numvar and num_fit are valid the memory will be initialized properly.
TEST(velocity_init){
int numvar=2;
int fit_size=2;
double vel[numvar];
double total=0;
Candidate<double> can;
can.init_can(numvar, fit_size);
can.init_velocity();
for(int i=0;i<numvar;++i){
    vel[i]=1;
    }
can.update_vel(vel);
for(int i=0;i<numvar;++i){
    total+=can.velocity[i];
    }
CHECK(total==numvar);
//same mechanism as update_global, update_best and read functions
}

このテストをリストに追加すると、エラーが発生しました。

TEST(write_contfit){
int numvar=2;
int fit_size=2;
Candidate<double> can;
can.init_can(numvar, fit_size);
double fit[fit_size];
int tt=fit_size;
double total=0;
for(int i=0;i<fit_size;++i){
   fit[i]=1;
}
can.write_contfit(fit,tt);
for(int i=0;i<fit_size;i++){
total+=can.contfit[i];
}
CHECK(total==fit_size);
}
4

1 に答える 1

0

基本的にクラスをバラバラにして、単体テスト フレームワークの下で再度ビルドした後、コードのどこでフレームワークがおかしくなったのかを突き止めました。これは、メモリが割り当てられていない配列ポインタの操作に関係しています。最も問題のある関数は、 を使用してメモリ割り当てを解放するデストラクタdelete[]です。delete[]簡単な汚い修正は、すべての行をコメントアウトすることです。良い方法だとは思いませんが、少なくともクラスの残りの部分をテストすることはできます。

于 2015-09-28T21:19:39.750 に答える