我認爲能夠生成一個量化我的ASP.NET MVC項目的幾個方面的非正式報告會很有用。目的是幫助我確定我應該把重點放在測試/重構上。ASP.NET MVC - 代碼分析/審計
一些指標,可能是開發商有用...
- 列表操作方法和單元測試每個
- 列表操作方法的數量和代碼行的每個 數
- 不使用「授權」屬性的列表操作方法
我可以使用反射生成控制器/方法的列表。
var controllers = System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
.Where(t => typeof(IController).IsAssignableFrom(t)).ToList();
foreach (var controller in controllers)
{
var methods = controller.GetMethods()
.Where(m => m.IsAControllerNotDefinedHere()).ToList();
foreach (var method in methods)
// do something
}
不幸的是,我擔心,如果我繼續這樣我可能會傾倒了大量的時間到這一點,並用東西是難以維繫/重用結束。
有沒有人有任何建議可以幫助我實現這一目標的現有解決方案(代碼片段,開源或商業)?
UPDATE: 我還在尋找輸入希望有一個負擔得起的(或免費)的解決方案在那裏,但我想我也有同感,可用於這一目的一些有用的反射技術。
GetCustomAttributes
var controllers = ...;
var controllersWithAuthorizeAttribute = controllers
.Where(c => c.GetCustomAttributes(typeof(System.Web.Mvc.AuthorizeAttribute), false).Count() > 0).ToList();
var methods = ...;
var methodsWithHttpPostAttribute = methods
.Where(m => m.GetCustomAttributes(typeof(System.Web.Mvc.HttpPostAttribute), false).Count() > 0).ToList();
單元測試計數
// get all types in your unit test project
var types = Assembly.GetAssembly(typeof(A.UnitTest.Class)).GetTypes();
// get the test class specific to the current controller (arbitrary)
var testClass = types.Where(t => t.Name == controller.Name + "Tests").SingleOrDefault();
// get unit tests from that test class (specific to NUnit)
var unitTests = testClass.GetMethods().Where(m => m.GetCustomAttributes(typeof(NUnit.Framework.TestAttribute), false).Count() > 0);
// count tests (relying on consistent naming scheme - again arbitrary)
var num = unitTests.Where(t => t.Name.StartsWith(...).Count();
量的代碼
我不能指望使用反射的代碼行,但我可以確定Intermed的數量iate語言字節允許我對那些具有更多IL字節的方法給予更嚴格的審查。
var method = ...;
var numBytes = method.GetMethodBody().GetILAsByteArray().Length;
總而言之,甚至沒有接近完美。但是,我可以反覆獲取所需的數據,而不必說服某人在商業產品上花錢。