我认为能够生成一个量化我的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;
总而言之,甚至没有接近完美。但是,我可以反复获取所需的数据,而不必说服某人在商业产品上花钱。