Skip to content

Latest commit

 

History

History
187 lines (132 loc) · 8.85 KB

File metadata and controls

187 lines (132 loc) · 8.85 KB

TestCode — 部品層(Public)のテスト

Touryo.Infrastructure.Public を中心とした部品層の総合テスト。DB には接続しない。 データ アクセスは TestDataAccess に分けてある(#520)。

コンソール EXE で、Program.csTest*.Root() を順に呼び、 出力を Result48.txt / ResultCore100.txt に書く。 判定はこのファイルとの比較で行う(TESTING.md が一次情報)。

y_Build_TestCode_Public.bat     … ビルド → 実行 → 結果ファイル出力

net48core100 の 2 プロジェクトが ..\*.csLink で共有する(実体は 1 つ)。


何をテストしているか

Program.cs の呼び出し順に対応する。

Basic

ファイル 対象 見ていること
TestOutputLog Public.Log log4net / NLog へのログ出力(LogIF
TestGetMessageAndProperty Framework.Common / Framework.Util GetMessage(メッセージ定義 XML)、GetSharedProperty
TestStringChecker Public.Str 数字・英字・かな・漢字・Shift_JIS の判定
TestFormatChecker Public.Str 郵便番号・電話番号・日付などの書式判定
TestStringVariableOperator Public.Str a=1;b=2 形式の解析と、環境変数の埋め込み(#522)
TestStringExtractor Public.Str クエリ文字列・XML 属性からの抽出、XmlToString(#522)
TestUtil Public.Util 型変換・配列操作・設定の読み取り・環境情報(#522)
TestStringConverter Public.Str 半角/全角・ひらがな/カタカナの変換
TestFormatConverter Public.Str 西暦/和暦、数値の書式化
TestCustomEncode Public.Str Base64URL・パーセント エンコード等
TestJISCode Public.Str JIS コードの判定

Extension

ファイル 対象 見ていること
TestEnumToStringExtensions Public.FastReflection 列挙体 ⇔ 文字列
TestXmlLib Public.Xml XML の読み書き
TestDeflateCompression Public.IO Deflate の圧縮・伸張
TestResourceLoader Public.IO ファイル・埋め込みリソースの読み取り(#522)
TestZipV2 Public.IO ZIP の圧縮・解凍(ZipperV2 / UnZipperV2、#524)

Dto

ファイル 対象 見ていること
TestDto Public.Dto DataToPoco / PocoToPoco / DataToDictionary の項目移送(#522)

Diagnostics

ファイル 対象 見ていること
TestObjectInspector Public.Diagnostics オブジェクトの再帰的な文字列化と再帰の上限(#522)

Reflection

ファイル 対象 見ていること
TestLatebind Public.Reflection 遅延バインドによる呼び出し(NonPublic を含む)
TestFastReflection Public.FastReflection AccessorCacher / InstanceCreator 等の高速リフレクション(#522)

TestEmbedded.txtTestResourceLoader が読む埋め込みリソース。 LogicalNameTestCode.TestEmbedded.txt に固定している (既定のままだと TestCodeFx / TestCodeCore で名前が食い違うため)。


テストを書き足すときの決まり

結果ファイルとの比較で判定するため、実行するたびに変わる値を出してはならない。 CompareResult.ps1 の正規化で吸収できるもの(日時・処理時間・GUID 等)もあるが、 吸収に頼らず、そもそも出さない方がよい。

例外は必ず捕まえ、型名だけを出す

捕まえないと Program.Main まで抜けて実行が中断し、 さらにパス入りのスタック トレースが結果ファイルに書き込まれる(環境依存の差分になる)。

場所 ...\ArrayOperator.cs:行 62

メッセージ本文も出してはならない。OS とランタイムの言語で変わるため (CI は英語環境、ローカルは日本語環境)。

catch (Exception ex)
{
    // メッセージは環境の言語で変わるため、型名だけを出す。
    MyDebug.OutputDebugAndConsole(caseName + " : 例外 " + ex.GetType().FullName);
}

環境で変わる値は「取れること」までに留める

EnvInfo(マシン名・OS・ビット数)や GetConfigParameter の設定値がこれにあたる。 設定値は net48 と .NET (Core) でパス区切りが違うため、値そのものは比較できない。

MyDebug.OutputDebugAndConsole(
    "EnvInfo.MachineName が取れる : " + !string.IsNullOrEmpty(EnvInfo.MachineName));

期待値は「出力をそのまま貼る」のではなく、検算する

結果ファイルとの比較方式は、実装が誤っていても、その誤った出力を「正」として固定してしまう。 OK が出続けるので、後から気付けない。

値が自明でないものは、実装を読んで手計算で確かめてから記録すること。

ArrayOperator.GetLongFromByte がこれで漏れた(#522)。 桁の重みを 256 * j(掛け算)で求めていたため 3 byte 目から誤っていたが、 8 byte の出力をそのまま期待値にしていたため、いったん見逃した。

境界は必ず跨ぐ

同じ GetLongFromByte は、1〜2 byte だけを見ていると不具合に気付けない。 256 * 1 == 256 ^ 1 のため、2 byte までは誤った実装でも正しい値になる。

2 byte : 258      ← 誤った実装でも一致する
3 byte : 66051    ← ここで初めて差が出る

「たまたま一致する範囲」の外側にケースを置く。

日時は固定値を与える

DateTime.Now を使わない。UTC で与えれば、時差のある環境でも同じ結果になる。

DateTimeOffset dto = new DateTimeOffset(2026, 8, 6, 12, 34, 56, TimeSpan.Zero);

csproj は 2 つとも直す

net48/TestCodeFx.csprojcore100/TestCodeCore.csproj両方Compile を足す。片方だけだと、そちらのフレームワークでしかテストが動かない。

フレームワークが使うパッケージは、テスト側にも並べる

フレームワークは HintPath で参照しており、NuGet の推移的依存が効かない。 OpenTouryo.Public が新しいパッケージを使い始めたら、 core100/TestCodeCore.csproj にも同じ PackageReference を足す。

足りないとビルドは通るのに実行時に落ちる

System.IO.FileNotFoundException: Could not load file or assembly
'ICSharpCode.SharpZipLib, Version=1.4.2.13, ...'

net48 側は 4_Build_CopyAssemblies.bat が依存 DLL を Build_net48 へ並べるため 顕在化しにくい。.NET (Core) 側だけで落ちることがある(#524 で踏んだ)。


記録している「仕様」(不具合ではない)

読み違えやすい挙動は、誤用したときの結果も含めてケースに残してある。

対象 挙動
PubCmnFunction.GetFileNameNoEx 第 2 引数はパス区切り。拡張子の区切りだと思って '.' を渡すと空文字が返る
ArrayOperator.CopyArray 配列を伸ばせない。 コピー長が「コピー先配列の長さ」で固定のため、コピー先を大きくするとコピー元が足りず落ちる。書込開始位置を 0 より後ろにしても落ちる
ArrayOperator.ShortenByteArray 単純な切り詰めではなく、XOR で畳み込む(暗号鍵の生成用)
ArrayOperator.GetLongFromByte ビッグ エンディアン。8 byte で最上位ビットが立つと Int64 の範囲を超えて負になる(2 の補数として解釈した値)
StringExtractor.GetParameterFromQueryString 「値が空」と「名前が無い」を区別できない(どちらも ""
ObjectInspector 再帰の深さは 5 まで。入口で加算・出口で減算するカウンタで抑えている
Latebind NonPublic を含むため private も呼べる。呼び先の例外は TargetInvocationException に包まれる

差分が大量に出たときの読み方

テストを足した直後は、差分件数が実態より大きく出る。 CompareResult.ps1Compare-Object -SyncWindow 20 で比較するため、 20 行を超える挿入があると以降の行が総崩れになる。

合否(OK / NG)は正しい。誤るのは件数と一覧の見え方だけ。 実差分を見たいときは -SyncWindow を外して突き合わせる。詳細は TESTING.md の「差分の『件数』は当てにならないことがある」。