Як статичний аналіз може доповнювати юніт-тестування на прикладі NUnit

PVS-Studio and NUnitДосить часто при обговоренні засобів статичного аналізу для C# проектів програмісти пишуть про те, що в цьому немає необхідності, тому що за допомогою юніт-тестування вони відловлюють більшість помилок. Я вирішив перевірити, наскільки добре протестований один з найвідоміших юніт-тест фреймворків — NUnit, і подивитися знайде там що-небудь наш аналізатор.

Введення
NUnit — це портована з Java на C# популярна бібліотека для юніт-тестування .NET проектів. Вихідний код відкритий і доступний на сайті проекту http://www.nunit.org/.

Варто відзначити, що JUnit — проект, з якого був портований NUnit, створили такі відомі програмісти як Еріх Гамма — один з авторів книги про шаблони об'єктно-орієнтованого проектування, і Кент Бек — творець методологій розробки через тестування та екстремального програмування. Я пам'ятаю, як колись читав його книгу Test Driven Development By Example, де він розповідає про розробці через тестування на прикладі створення тестового фреймворку, аналогічного JUnit, слідуючи всім своїм методологій. Тобто можна не сумніватися в тому, що JUnit і NUnit розроблені в кращих традиціях юніт-тестування, про що так само говорить цитата Кента Бека на сайті NUnit: "… чудовий приклад ідіоматичного дизайну. Більшість тих, хто портувати xUnit просто переносили версію для Smalltalk або Java. Те ж саме зробили і ми з NUnit в перший раз. Ця нова версія NUnit є такою, якою вона повинна була бути, якби була написана на C# з самого початку".

Я подивився исходники NUnit — там дуже багато тестів, відчуття таке, що протестовано все що тільки можна. Враховуючи відмінний дизайн і той факт, що NUnit використовується тисячами розробників протягом багатьох років, я думав, що PVS-Studio не знайде в ньому жодної помилки. Але ні, помилка знайшлася.

Про знайдену помилку
Спрацювала діагностика V3093 про те, що іноді програмісти замість операторів && та || використовують оператори & і |. Проблема може виникнути в тому випадку, коли важливо, щоб права частина виразу не виконувалася при певних умовах. Подивимося, як ця помилка видається у NUnit.
public class SubPathConstraint : PathConstraint
{
protected override bool Matches(string actual)
{
return actual != null &
IsSubPath(Canonicalize(expected), Canonicalize(actual));
}
}
public abstract class PathConstraint : StringConstraint
{
protected string Canonicalize(string path)
{
if (Path.DirectorySeparatorChar !=
Path.AltDirectorySeparatorChar)
path = path.Replace(Path.AltDirectorySeparatorChar,
Path.DirectorySeparatorChar);
....
}
}

Навіть якщо метод Matches actual прийде значення null, то права частина оператора & все одно буде обчислена, а значить буде викликаний метод Canonicalize. Якщо подивитися його визначення, то видно, що в ньому значення параметра path вже не перевіряється на null, а відразу в нього зветься метод Replace, де та можливий потенційний NullReferenceException. Спробуємо відтворити проблему. Для цього я написав простий юніт-тест:
[Test]
public void Test1()
{
Assert.That(@"C:\Folder1\Folder2", Is.SubPathOf(null));
}

Запускаємо і дивимося результат:

NUnit NullReferenceException

Так і є: NUnit впав NullReferenceException. Навіть у такому добре протестованому продукті як NUnit статичний аналізатор PVS-Studio зміг знайти реальну помилку. Зазначу, що зробити це мені було не складніше, ніж написати юніт-тест — потрібно вибрати з меню перевірку проекту і проаналізувати грід з результатами.

Висновок
Юніт-тести і статичний аналіз — це не виключають, а доповнюють один одного методики розробки програмного забезпечення [1]. Завантажити статичний аналізатор PVS-Studio і подивіться не виявляться там помилки, які не були знайдені юніт тестами.

посилання
  1. Андрій Карпов. Як статичний аналіз доповнює TDD.
  2. Ілля Іванов. Про одну цікаву помилку Lucene.Net.



Якщо хочете поділитися цією статтею з англомовної аудиторією, то прошу використовувати посилання на переклад: Alexander Chibisov. Complementing Unit Testing with Static Analysis, with NUnit as an Example.

Прочитали статтю і є питання?Часто до наших статей задають одні і ті ж питання. Відповіді на них ми зібрали тут: Відповіді на питання читачів статей про PVS-Studio, версія 2015. Будь ласка, ознайомтеся зі списком.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.