Touryo.Infrastructure.Public を中心とした部品層の総合テスト。DB には接続しない。
データ アクセスは TestDataAccess に分けてある(#520)。
コンソール EXE で、Program.cs が Test*.Root() を順に呼び、
出力を Result48.txt / ResultCore100.txt に書く。
判定はこのファイルとの比較で行う(TESTING.md が一次情報)。
y_Build_TestCode_Public.bat … ビルド → 実行 → 結果ファイル出力
net48 と core100 の 2 プロジェクトが ..\*.cs を Link で共有する(実体は 1 つ)。
Program.cs の呼び出し順に対応する。
| ファイル | 対象 | 見ていること |
|---|---|---|
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 コードの判定 |
| ファイル | 対象 | 見ていること |
|---|---|---|
TestEnumToStringExtensions |
Public.FastReflection |
列挙体 ⇔ 文字列 |
TestXmlLib |
Public.Xml |
XML の読み書き |
TestDeflateCompression |
Public.IO |
Deflate の圧縮・伸張 |
TestResourceLoader |
Public.IO |
ファイル・埋め込みリソースの読み取り(#522) |
TestZipV2 |
Public.IO |
ZIP の圧縮・解凍(ZipperV2 / UnZipperV2、#524) |
| ファイル | 対象 | 見ていること |
|---|---|---|
TestDto |
Public.Dto |
DataToPoco / PocoToPoco / DataToDictionary の項目移送(#522) |
| ファイル | 対象 | 見ていること |
|---|---|---|
TestObjectInspector |
Public.Diagnostics |
オブジェクトの再帰的な文字列化と再帰の上限(#522) |
| ファイル | 対象 | 見ていること |
|---|---|---|
TestLatebind |
Public.Reflection |
遅延バインドによる呼び出し(NonPublic を含む) |
TestFastReflection |
Public.FastReflection |
AccessorCacher / InstanceCreator 等の高速リフレクション(#522) |
TestEmbedded.txt は TestResourceLoader が読む埋め込みリソース。
LogicalName を TestCode.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);net48/TestCodeFx.csproj と core100/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.ps1 は Compare-Object -SyncWindow 20 で比較するため、
20 行を超える挿入があると以降の行が総崩れになる。
合否(OK / NG)は正しい。誤るのは件数と一覧の見え方だけ。
実差分を見たいときは -SyncWindow を外して突き合わせる。詳細は
TESTING.md の「差分の『件数』は当てにならないことがある」。