Pythonのdoctestの概念は素晴らしいと思います。また、リアルタイムショップのC ++プログラマーとして、私は非常に嫉妬しています。基本的にユニットテスト機能はありませんが、これは深刻な障害です。C ++ Unitなどを見たことがありますが、Pythonのdoctestのようなコメントからテストケースを直接コードに入れるのではなく抽出できるものはありますか?
6 に答える
doctestをリリースしました- 最軽量の機能豊富な C++ シングル ヘッダー テスト フレームワーク。
コメントでテストを書くためではなく、本番コードで直接テストを書くためのものです。ニーズに完全には適合しませんが、前処理のステップがない C++ では依然として最良のオプションです。
これは便利かもしれません。私は自分のコードでこれが必要になった後、これを開発し始めました。
http://github.com/panyam/DocTestPlusPlus
これは、コメントを調べてテストを抽出し、テスト ファイルを生成する Python スクリプトです。
まだ開発およびテスト中です。ありとあらゆるフィードバックに感謝します。
乾杯スリ
doctestを見たばかりですが、本当に素晴らしいです。Python言語の使いやすさのアプローチもそうです。
ただし、C ++の場合、そのようなツールはおそらく見つかりません。
テストの1つが失敗した場合は、何が起こるかをデバッグすることをお勧めします。テストケースのソースをコメントから生成するのは簡単ではありません。代わりに、C ++の既存の単体テストフレームワークには、コンパイルされてデバッグが容易な特別な構文を使用したテストのソースがあります。また、コメントからソースを生成することは、もう1つの追加の(事前の)コンパイル手順であり、これは生活を困難にするだけです。
C ++でのコーディングは、Pythonでのコーディングほど迅速ではないため、単体テストも同様にやや困難です。一方、より多くのツールがある場合、たとえば、Pythonでは不可能な、型の関係に静的アサーションを配置できます。
簡単に言うと、C++用のPythondoctestの類似物には、既存のツールと比較して非常に多くの欠点があり、誰もそれを実装し始めなかったと思います。
既存のツールよりも優れていると本当に確信している場合は、いくつかの例を提供してください。実生活でもっと使いやすいケースがあるとは思えません。
コメントからCxxTestファイルを生成する方法に沿って何かを考えていました。私はそのフレームワークを使用していませんが、有望に見えます。彼らのマニュアルから、単体テスト ファイルは次のようになります。
// MyTestSuite.h
#include <cxxtest/TestSuite.h>
class MyTestSuite : public CxxTest::TestSuite
{
public:
void testAddition( void )
{
TS_ASSERT( 1 + 1 > 1 );
TS_ASSERT_EQUALS( 1 + 1, 2 );
}
};
私の提案は、すべてを記述するのではなく、コメントからこれらの testX 関数の内容を抽出するパーサーです。たとえば、(ここではコメントの構文を作成しているだけなので、もっときれいな書き方があるかもしれません):
// MyRegularCode.cpp
/// Description of the function here
/// Then test case below that gets extracted
/// and turned into CxxTest .h files
/**testAddition
MyClass mc;
mc.MyFunction();
TS_ASSERT( mc.m_value > 1 );
TS_ASSERT_EQUALS( mc.m_value, 3 );
**/
void MyClass::MyFunction()
{
m_value = 3;
};
フィクスチャの作成など、CxxTest のより強力な側面がどのように実装されるかはわかりませんが、このようなものは、C++ の世界で Python docstring と doctest の一体性を提供する可能性があります。
Fostに付属するテストフレームワークは、かなり類似したものを処理します。テストはドキュメントに埋め込まれませんが、テストするコードの横に置くことができます。構造上、テストはcxxtestコードと非常によく似ています。
#include "myclass.hpp"
#include <fost/test>
FSL_TEST_SUITE( myclass );
/*
Your documentation
*/
FSL_TEST_FUNCTION( constructors ) {
fostlib::test::default_constructable< myclass >();
}
myclass::myclass() {
}
FSL_TEST_FUNCTION( some_method ) {
myclass instance;
FSL_CHECK_NOTHROW( instance.some_method(0) );
FSL_CHECK_EQ( instance.some_method(2), 2 );
FSL_CHECK_NEQ( instance.some_method(-2), 0 );
}
int myclass::some_method( int arg ) {
// implementation
}
このロットはすべて、テストが埋め込まれた状態でコンパイルされます(#defineを使用してビルドからテストを削除できます。実装されていませんが、簡単に実行できます)。次に、ビルドされた.DLLまたは.soをロードし、テストを見つけて実行する別のプログラムを介してテストが実行されます。
試したことはありませんが、静的ライブラリで動作し、Windowsの.EXEファイルにあるテストを動的にロードして実行する必要がありますが、LinuxやMacでそのように実行できるかどうかはわかりません。
実際のコードのコメントに物事を入れるという古いトリックを認識しています(IIRC、これはプログラミングの実践の一部です)。ただし、単体テストを#ifdef
ブロックに単純に配置する方が簡単な場合があります。通常、この種のことのために、プリプロセッサを単独で実行できます。
繰り返しになりますが、 Perl を超大型のプリプロセッサとして使用する1 つのプロジェクトを認識しています。