Полезно ли писать стандартизированный метод TDD [Test], который выявил бы общие проблемы с памятью?
Набор тестов можно было бы легко и быстро применить к методу, и он мог бы решить «классические» проблемы с памятью .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 ++, Обнаружение утечки памяти при выполнении модульных тестов , что является аналогичным вопросом, но не совсем тем же. Вопрос Твка состоит в том, чтобы смотреть на память после того, как все тесты были выполнены ...
Моя идея здесь для .NET
1) модульное тестирование каждого метода на общие проблемы с памятью
2) сбой классических проблем с памятью
3) передать классические исправления в классические проблемы с памятью
4) быть в состоянии быстро бросить быстрый стандартный тест на функцию, чтобы увидеть, проявляет ли она классические симптомы
5) уметь обновлять стандартное тестирование давления памяти TDD .Net, применяемое в модульном тесте. Это подразумевает рефакторинг вышеприведенного кода, так что при обновлении до стандартного теста будут обновляться тесты памяти, применяемые во всем наборе тестов Nunit для проекта.
(p.s. Я знаю, что нет вызова Is.WithinTolerance, но я просто демонстрировал идею.)
ура ...