2024
09
09
2008
11
17
2008
10
28
log4cxx on VC8 リリースビルドの問題
log4cxxのリリースビルドで例外が発生する現象があり、使えなかった。
apatch_log4cxxのmlには、同じような問題に遭遇している人もいるようで、
Log4cxx with VisualC++ 2008 Express Edition - Release issue
で、こことかで落としたプロジェクトを使って見ても、問題は解決しなかった。
ランタイムライブラリが/MDで統一されていないとダメとか色々あるようだが、
log4cxxのスタティックライブラリを作成、リンクでリリースビルドでも
動作するようになった。スタティックライブラリとするには、
1.log4cxxのプロジェクトでlibを生成するように設定する
2.log4cxxのプロジェクトでプリプロに以下を設定(ARPもlibの場合)
LOG4CXX_STATIC
APR_DECLARE_STATIC
APU_DECLARE_STATIC
3.アプリのプロジェクトでプリプロにLOG4CXX_STATICを設定。
これしないとチョーリンクエラー。
Build log4cxx as static library using MS Visual Studio 2003
2008/10/28 (Tue.) Trackback() Comment(0) C++
2008
09
26
log4cxxの関数名の修正
apache-log4cxx-0.10.0\src\main\include\log4cxx\spi\location\location.h
line118くらい
#if !defined(LOG4CXX_LOCATION)
#if defined(_MSC_VER)
#if _MSC_VER >= 1300
// #define __LOG4CXX_FUNC__ __FUNCSIG__
#define __LOG4CXX_FUNC__ __FUNCTION__
#endif
#else
#if defined(__GNUC__)
#define __LOG4CXX_FUNC__ __PRETTY_FUNCTION__
#endif
#endif
#if !defined(__LOG4CXX_FUNC__)
#define __LOG4CXX_FUNC__ ""
#endif
#define LOG4CXX_LOCATION ::log4cxx::spi::LocationInfo(__FILE__, \
__LOG4CXX_FUNC__, \
__LINE__)
#endif
2008/09/26 (Fri.) Trackback() Comment(0) C++
2008
09
12
はまった点
面倒なので、あるクラスの実装をヘッダファイルに書いていた。
そのクラスは、インスタンス化する予定の無い、sutaticメソッドのみ持つクラスだったが、
static変数(std::map)をそのファイルの中で宣言し、使用していた。
と、ヘッダをincludeするオブジェクトファイル(cppファイルから作られた)ごとに、static変数が生成され
(唯一のインスタンスを想定していた)static変数に追加したはずの内容が無くなったりしていた。
(だって違うものだもん。。。)
別のcppファイルで変数を宣言し、externしてどのヘッダに取り込むことにした。
2008/09/12 (Fri.) Trackback() Comment(0) C++
2008
09
11
Assert クラスの使用
UnitTestingFramework 名前空間の Assert クラスは、個別の機能を確認するために使用します。単体テストのメソッドでは、開発コード内のメソッドのコードを実行しますが、Assert ステートメントを含めたときにのみコードの動作に関するレポートが出力されます。
![]() |
---|
Assert ステートメントの有無に関係なく、単体テストではコード カバレッジ データを生成できます。詳細については、「方法 : コード カバレッジ データを取得する」を参照してください。 |
Assert の種類
Microsoft.VisualStudio.TestTools.UnitTesting 名前空間には複数の Assert クラスが用意されています。
テスト メソッドでは、Assert.AreEqual() などの Assert クラスのメソッドを任意の数だけ呼び出すことができます。Assert クラスには、多くの選択可能なメソッドがあり、それらのメソッドの多くには複数のオーバーロードが存在します。
CollectionAssert クラスを使用して、オブジェクトのコレクションを比較したり、1 つ以上のコレクションの状態を確認したりします。
StringAssert クラスを使用して、文字列を比較します。このクラスには、StringAssert.Contains、StringAssert.Matches、 StringAssert.StartsWith など、さまざまな便利なメソッドが含まれています。
AssertFailedException 例外は、テストが失敗すると常にスローされます。タイムアウトした場合、予期しない例外がスローされた場合、または "失敗しました" の結果を出力する Assert ステートメントを含む場合、テストは失敗します。
AssertInconclusiveException は、テストで "結果を作成できません" の結果が出力されると常にスローされます。通常 Assert.Inconclusive ステートメントは、まだ編集中のテストに対して、そのテストを実行する準備ができていないことを示すために追加します。
![]() |
---|
他の方法としては、実行の準備が整っていないテストに Ignore 属性を設定して示す方法もあります。ただし、この方法には、まだ実装していないテストの個数に関するレポートを簡単に作成できないという短所があります。 |
新 規の Assert 例外クラスを作成する場合には、そのクラスに UnitTestAssertException 基本クラスを継承させると、例外が発生した場合に、その例外がテストや製品コードからスローされた予期しない例外なのか、アサーションによる失敗なのかを 識別しやすくなります。
ExpectedExceptionAttribute 属性をテスト メソッドで使用して、開発コード内のメソッドによって例外がスローされることが予期される場合に、例外が実際にそのメソッドでスローされたかを確認します。
Assert.AreEqual による安全でないオーバーロード型
Assert.AreEqual メソッドには、多くのオーバーロードが存在し、個々のデータ型を比較できます。ただし、Assert.AreEqual メソッドには、ポインタ データ型など、安全でない型に対するオーバーロードは存在しません。
これを示すために、次のクラスを含む C# コンソール アプリケーションを作成します。
unsafe public class CUnsafeTest
{
private int* m_pX = null;
unsafe public void VoidPtr(void* voidPtr)
{
}
unsafe public int* ReturnPointer(float* fPtr, TestThis* pTestThis)
{
int x = 5;
return &x;
}
}
次に CunsafeTest クラス用のテストを生成します。詳細については、「方法 : 単体テストを生成する」を参照してください。次の例と同様のコードが生成されます。
[TestMethod()]
public void ReturnPointerTest()
{
unsafe
{
CodeGen.BVT.Unsafe.CUnsafeTest target;
target = new CodeGen.BVT.Unsafe.CUnsafeTest();
// TODO: Initialize to an appropriate value
System.Single* fPtr = null;
// TODO: Initialize to an appropriate value
TestThis* pTestThis = null;
// TODO: Initialize to an appropriate value
System.Int32* expected = null;
System.Int32* actual;
actual = target.ReturnPointer(fPtr, pTestThis);
Assert.AreEqual(actual, expected);
// On the preceding line, no overload is available.
}
}
この場合には、Assert.AreEqual ステートメントを、独自のカスタムな検査コードに置換する必要があります。
2008/09/11 (Thu.) Trackback() Comment(0) C++