投稿

【UnitTest】カバレッジを測りたい

Visual Studio 2017までは、UnitTestのカバレッジ計測にAxoCover( AxoCover - Visual Studio Marketplace )を利用していたのですが、2019以降は(そのままでは)利用できなくなってしまいましたので、別の方法を探しました。その備忘録です。 【coverlet.collectorを利用する】 ※Visual Studio 2022 Communityで動作を確認しています。 ※お試しはNUnitでしたが、xUnit、MSTestにも対応とのことです。  詳しくは →  単体テストにコードカバレッジを使用する - .NET | Microsoft Docs ①テストプロジェクトにNuGetからcoverlet.collectorを導入します。 ②コマンドプロンプト(VSのターミナルからでもOK)を開き、ソリューションフォルダにカレントディレクトリを移動します。 ③コマンドラインで以下のコマンドを実行します。  >  dotnet test --collect:"XPlat Code Coverage"  ※テストが実行されます。成功後はcoverage.cobertura.xmlが作成されます。  ※テスト対象がAnyCPU+32bit優先の場合は、エラーが発生しました。   (Error:MSB4216) ④ReportGeneratorが未導入の場合は、コマンドから導入します。  >  dotnet tool install -g dotnet-reportgenerator-globaltool ⑤以下のコマンドでレポートを作成します。 >   reportgenerator -reports:"③で作成されたxmlのフルパス" -targetdir:"coveragereport" -reporttypes:html  ※上記コマンドの場合は、ソリューションフォルダ内に「coveragereport」フォルダが作成されます。 ⑥成功したら出力フォルダ内にindex.htmlがありますので、それで内容が確認できます。 割とお気軽にできますが、コマンドラインなどは絶対に忘れる自信がありましたので、備忘録として残します。

【C#】2つのコンボボックスを使って、コンボボックスソースを切り替えたい

イメージ
 画面に2つのコンボボックスがあったとして、  ・1つ目のコンボボックスでアイテムを選択する  ・2つ目のコンボボックスのアイテムに、1つ目で選択したデータに関連するアイテムのみを設定 みたいなシチュエーションがあったとします。そんな場合はどうするかメモ。 【画面イメージ(適当)】 カテゴリーのコンボボックスでカテゴリーを選択すると、品名のコンボボックスに選択されたカテゴリーに属する品名のみを表示したい感じです。 それぞれのコンボボックスにはList<KeyValuePair<string, string>>型を使用するとします。 【カテゴリーの種類(これまた適当)】 ・先頭に空白行を追加しています。 【品名の種類(適当)】 ・品名のキー内先頭2桁の数字は、カテゴリーのキーに紐づいているとします。 ①カテゴリーコンボボックスにソースを設定します。 ・ついでに、品名に使用するディクショナリも作っています。 ②カテゴリーコンボボックスのアイテムが選択されたら、品名コンボボックスのソースを設定する ・こちらも先頭に空白行を追加しています。 ・カテゴリーコンボボックスで空白が選択されたときの処理は書いていません。 【結果の画面イメージ】 こんな感じで、カテゴリーに紐づく品名のみを選択項目として設定できます。 ※VisualStudio2022(preview)、.Net6(preview)で動作確認をしています。

【C#】いつもLog4netの設定を忘れる

残念なことに、いつもLog4netの設定を忘れてしまうため、ここにメモを残します。 「日付毎にログファイルを入れ替える」という使い方が多いため、RollingFileAppenderのサンプルを掲載します。 また、設定ファイルはApp.configではなく、専用の設定ファイルを作成しています。 (log4netはNugetで取得してください。) ①Log4netの設定 log4net.config 各設定はXML内のコメントのとおりです。 ログの出力内容は「15:56:29.555, [1], INFO , (method name) Form1_Load, Load Main form.」みたいな感じです。 メソッド名は、非同期メソッドの場合は「MoveNext」が出力されます。ちゃんと表示させたい方はググってみてください。 ②AssemblyInfoにLog4netコンフィグレーションの設定を追加 ※AssemblyInfo.cs ③Log4netのロガーインスタンスを取得 ログを出力したい各クラスに、インスタンス取得を書きます。 ④ログを出力します。 ロガーインスタンス.レベル("メッセージ")で出力できます。 ⑤出力されたログ ログの出力イメージです。 ※Log4netはバージョン2.0.12、VisualStudio2022(preview)、.Net6(preview)で動作確認をしています。

【C#】エンティティクラスから一部のプロパティのみをCSV出力したい(カスタム属性使用)

 エンティティクラスのプロパティにカスタム属性を付けて、その属性を基にCSVへ出力をします。 また、カスタム属性には、出力順とヘッダーテキストを設定できるようにします。 ①カスタム属性クラスをつくります。 今回のカスタム属性はプロパティ向けなので、ターゲットをAttributeTargets.Propertyに。 多重設定を許さないので、AllowMultiple = falseに。 継承は必要ないので、Inherited = falseに。 ②エンティティクラス(適当)を用意して、出力したいプロパティにカスタム属性を設定します。 ※超適当でごめんなさい。 ③動作確認のため、エンティティクラスに適当に値を設定します。 ※ここからは、エンティティクラスを使用する任意のクラス、処理内に記載しています。 ④カスタム属性が設定されたプロパティのみを抽出して、出力順を昇順に並び替えます。 もう少しスマートなLinqの使い方が… .Where(...).OrderBy(...).Select(...)で書けばよいと思うの。 ⑤カスタム属性のヘッダーテキストと出力データを抽出します。 ※ここでは、エンティティの各プロパティもList<string>として格納していますが、お好きな様にしてください。 ⑥取り出した値をカンマ区切りでテキストファイルに出力します。 ソースは特別載せませんが、今回はList<List<string>>で渡していますので、1レコードの文字列リストをカンマでつないで1行として出力をしています。 ※参考:出力結果 ※動作確認はVS2022(preview)/.Net6(preview)です。

【C#】ComboBoxのデータソースにディクショナリを設定したい

コンボボックスのデータソースに、ディクショナリを設定します。 また、ディクショナリはアプリケーション構成ファイル(App.config)から作成します。 ①アプリケーション構成ファイルにディクショナリの素を定義します。 ②アプリケーション構成ファイルからディクショナリに設定します。 ※ディクショナリ(ComboboxSource)は別の場所で定義しています。 ③コンボボックスにディクショナリを設定します。 ※DataSourceはIListを実装しているか、Array系でないと設定できないため、List変換します。 ④コンボボックスで選択されたvalueを取得します。 ※単純にSelectedValueでOK。