Pleasanter で遊ぼう! ということで Pleasanter にテストを書いていきたいと思います。
まずは全容をつかむために、テスト対象候補のクラス、メソッド、プロパティの数を探ってみましょう。
■ 結果

Implem.MySql , classes: 1, methods: 16, properties: 6 Implem.PostgreSql , classes: 1, methods: 16, properties: 6 Implem.SqlServer , classes: 1, methods: 16, properties: 6 Implem.CodeDefiner , classes: 3, methods: 27, properties: 6 Implem.DefinitionAccessor, classes: 24, methods: 171, properties: 12 Implem.DisplayAccessor , classes: 3, methods: 13, properties: 0 Implem.Factory , classes: 1, methods: 5, properties: 0 Implem.Libraries , classes: 70, methods: 1161, properties: 91 Implem.ParameterAccessor , classes: 72, methods: 553, properties: 118 Implem.Pleasanter , classes: 590, methods: 54554, properties: 12651 Implem.Plugins , classes: 1, methods: 6, properties: 2 implem.TestAutomation , classes: 6, methods: 102, properties: 16
■ 調べ方
簡単に言うと、リフレクションで Public クラスを取ってきて数えています。
■ テストソリューションの作り方
Pleasanter は一つのリポジトリで構成されています。テストを追加するにあたってそのリポジトリを崩したくありません。そこで、通常は一つのソリューションにプロダクトとテストを含めるスタイルも多いところですが、今回は敢えて、テストプロジェクトをリポジトリを分けることを試みていきます。
テストソリューションを作って別のソリューションのプロジェクトを追加する


追加したプロジェクトをテストソリューションのプロジェクトで参照に追加する


追加されています。

対象プロジェクトを追加した結果
このようにプロジェクトを参照に追加した場合、その参照されているプロジェクトが参照しているものも見えるようになります。
しかし、Pleasanter のソリューションでは、メインのプロダクトのプロジェクトから参照されないプロジェクトがあるのでそれも追加していきます。
そうしてこうなりました。
CollectTestables と PleasanterTest は今回作ったプロジェクトです。

テスト対象を考える
Pleasanter のプロダクトのプロジェクトのコードはサンプリングしてみると基本 public のようです。というわけで今回は public クラスをテスト対象として数える方針とします。

■ 数えるコード
using System.Reflection; Count(typeof(Implem.MySql.MySqlObjectFactory)); Count(typeof(Implem.PostgreSql.PostgreSqlObjectFactory)); Count(typeof(Implem.SqlServer.SqlServerObjectFactory)); Count(typeof(Implem.CodeDefiner.Starter)); Count(typeof(Implem.DefinitionAccessor.CodeColumn2nd)); Count(typeof(Implem.DisplayAccessor.Display)); Count(typeof(Implem.Factory.RdsFactory)); Count(typeof(Implem.Libraries.Classes.Csv)); Count(typeof(Implem.ParameterAccessor.Parts.ActionTypes)); Count(typeof(Implem.Pleasanter.Controllers.AdminsController)); Count(typeof(Implem.Plugins.IPdfPlugin)); Count(typeof(Implem.TestAutomation.Parts.AutoTestLog)); static void Count(Type type) { var asm = Assembly.GetAssembly(type)!; var types = asm.GetTypes().Where(x => x.IsClass && x.IsPublic).ToArray(); Console.WriteLine($"{asm.FullName?.Split(',')[0],-25}, classes: {types.Length,3}, methods: {types.Select(x => x.GetMethods().Length).Sum(),5}, properties: {types.Select(x => x.GetProperties().Length).Sum(),6}"); }
■ 結果

Implem.MySql , classes: 1, methods: 16, properties: 6 Implem.PostgreSql , classes: 1, methods: 16, properties: 6 Implem.SqlServer , classes: 1, methods: 16, properties: 6 Implem.CodeDefiner , classes: 3, methods: 27, properties: 6 Implem.DefinitionAccessor, classes: 24, methods: 171, properties: 12 Implem.DisplayAccessor , classes: 3, methods: 13, properties: 0 Implem.Factory , classes: 1, methods: 5, properties: 0 Implem.Libraries , classes: 70, methods: 1161, properties: 91 Implem.ParameterAccessor , classes: 72, methods: 553, properties: 118 Implem.Pleasanter , classes: 590, methods: 54554, properties: 12651 Implem.Plugins , classes: 1, methods: 6, properties: 2 implem.TestAutomation , classes: 6, methods: 102, properties: 16
かなりの数。やりがいがありそうですね。
ちなみにやたらと数の少ないプロジェクトがありますね。これは......

プロジェクトによっては internal ばかりのプロジェクトもあるようですね。
まあ、public だけでも十分な数があるので、これから public クラスを狙ってテストを書いていってみましょう。
■ いかがでしたか?
今回はここまで。