C#的连续基准测试框架

时间:2014-08-26 06:35:40

标签: c# continuous-integration

我正在开发一种传统的软件产品,我们不时会发货 - 或者发货,这些变化会大大降低性能。这个问题源于一些旧的设计选择,在某些原因中看似无辜的变化可能导致某些任务的数据库查询大量增加。

为了提前一点,我们希望自动运行一些基准测试作为Continous Integration构建链的一部分。

我一直在寻找以mstest / nunit属性为基础的样式实现测试的框架。

我已阅读有关该主题的各种帖子并搜索了Google并找到了一些有趣的提示(例如:.NET benchmarking frameworks)。

我似乎能够在NuGet和Google上找到的工具似乎都是较小的实验工具。在这种情况下,我可能会更好地做一些我们完全控制的事情。

问题是,任何人都有经验设置,任何人都可以推荐一个工具,或者我最好创建自己的testrunner来获得适合我们框架的东西。

基本要求是:

  • 能够衡量时间或数字
  • 对于算法测试,确定运行代码以获得平均值的多个循环
  • 对于数据库测试,能够预先运行一些不算作测试时间的东西(例如清除SQL缓存或设置我们的框架)
  • 以数据库或某种结构格式输出数据(mstest trx格式非常适合简单的CruiseControl.Net支持

其他要求可能是

  • 对测试结果进行分组的方法,例如:可以捆绑给定模块或类的所有测试
  • 报告能力 - 显示图表,检测趋势(随着时间的推移逐渐变慢)

当我列出要求时,它感觉它可能非常具体,因此我将更好地实现我们自己的小框架。在这种情况下,我认为如下所述。

的TestRunner

  • 根据属性查找测试类,使用test属性执行所有方法,存储结果(在文件,直接输出或数据库中)

TestMethods

这样的东西
[Benchmark]
public TimeSpan Job_GetAllRows_TimeOnColdCache()
{
    //Arrange
    ...

    //Act
    return Measure( () => Job.GetAllRows());
}

[Benchmark]
public int Job_GetAllJobs_CallsToDatabase()
{
    //Arrange
    ...
    Database.NumberOfQueriesExecuted = 0;

    //Act
    Job.DoHeavyCalculation();

    return Database.NumberOfQueriesExecuted;
}

[Benchmark]
public TimeSpan Job_HeavyCalculation_AverageTimeToCalculate()
{
    //Arrange
    ...

    //Act
    return Measure(Measurement.Average, 1000, () => Job.DoHeavyCalculation());
}

Measure类只是启动秒表的包装器,并且在最后执行try-finally并返回秒表经过的时间。

我希望有人对此发表评论 - 理想情况下有一个解决上述问题并准备使用的框架的经验。

0 个答案:

没有答案