是否可以纯粹使用单元测试来诊断性能问题?

Is it possible to diagnose performance issues purely using unit tests?

是否可以在像 NUnit 这样的框架中编写单元测试,以便检查框架 class 库提供的对象(如 RegularExpression)是否仅在应用程序代码中初始化一次(或有限次)? 是否有可能(并推荐)进行单元测试来强制执行有关对象初始化及其生命周期的某些规则?例如在下面的代码中 -

class Utility{
    public bool IsGuide(string key){
        string strRegex = @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b";
        Regex guidRegEx = new Regex(strRegex, RegexOptions.Compiled);
        return guidRegEx.IsMatch(stringValue);    
    }
}

上面的代码是从 page.aspx 中的一个循环中调用的。每次由于在内存中初始化大量 RegEx 对象而调用此页面时,都会观察到性能受到影响。解决方案是将 RegEx 对象初始化为静态 class 级别实例。

为了确保此代码不会再次被意外修改,可以模拟 RegEx 并检查初始化次数吗?

从 'semantics' 的角度来看,我认为这种对设计和实现的控制是矫枉过正的。开发人员应该了解对象类型及其生命周期等基础知识。但是我想知道是否有已知的 patterns/standard 实践来解决此类问题?

我会说单元测试不是解决这个问题的方法。您需要纯粹出于测试目的围绕 Regex 创建抽象,并且还依赖开发人员创建适当的测试。我想你最终会遇到类似的情况,但代码更混乱。

因为你想强制执行编码标准,所以我会考虑创建 an analyser or, if required, an FxCop rule,它可以检查 Regex 是否在方法内部被实例化。这当然会变得复杂,因为毫无疑问,在某些情况下您 想要打破这条规则,但这对我来说似乎是一个更合适的解决方案,而且开发人员更难回避。