【发布时间】:2009-02-20 20:37:34
【问题描述】:
编写一个标准化的 TDD [测试] 方法是否有用,这会暴露常见的内存问题?
这组测试可以轻松、快速地应用于一个方法,并且会使“经典”.NET 内存问题失败,但会通过经典解决方案。
例如,常见的内存问题可能是:垃圾收集器重定位过多 ;分配太多;太多的垃圾回收(经典示例更喜欢 StringBuilder 而不是字符串 reallocs );持有内存太久(经典示例调用 dispose 并且不依赖终结器);物体不恰当地到达 g1, g2, LOH ;随着时间的推移,小泄漏会增加一些重要的事情,......等等。
也许代码看起来像这样……
[Test]
public void Verify_MyMethodUnderTest_Is_Unlikely_To_Have_Common_Memory_Problem()
{
//-Setup
var ExpectationToleranceA = ...
var ExpectationToleranceB = ...
...
//-Execute
var MeasurementA = MyClassUnderTest.MyMethodUnderTest( dependancyA ) ;
var MeasurementB = MyClassUnderTest.MyMethodUnderTest( dependancyB ) ;
…
//-Verfiy
Assert.That( MeasurementA , Is.WithinTolerance( ExpectationToleranceA ) ) ;
Assert.That( MeasurementB , Is.WithinTolerance( ExpectationToleranceB ) ) ;
}
还有其他关于内存压力问题的帖子,但这里的想法是能够快速将标准测试指向一个方法,并且测试会在常见/经典内存压力问题上失败,但通过常见解决方案绿色通过.然后可能会指示开发人员检查失败的代码并可能修复泄漏、更改容差甚至删除 TDD 内存压力测试。
这个想法有腿吗?
这里有一个与 C++ 应用程序相关的问题,Memory leak detection while running unit tests,这是一个类似的问题,但并不完全相同。 Twk 的问题是指在所有的测试都跑完之后再看内存...
我的想法是让 .NET 1) 对常见内存问题的每种方法进行单元测试 2)失败的经典内存问题 3)通过经典修复经典常见内存问题 4) 能够快速对函数进行快速标准测试,以查看它是否表现出典型症状 5) 能够升级单元测试中应用的Standard TDD .Net Memory Pressure Test。这意味着对上述代码进行重构,以便升级到标准测试将更改升级整个项目的 Nunit 测试套件中应用的内存测试。
(p.s. 我知道没有 Is.WithinTolerance 调用,但我只是在展示一个想法。) 干杯...
【问题讨论】:
标签: .net unit-testing memory-management memory-leaks