Про тестування
• Тестуванняне підвищує якість ПЗ,
• а сприяє розпізнаванню неправильної
поведінки,
• завдяки чому розробники можуть знайти
помилки і виправити їх
• Тестування не може довести відсутності
дефектів
– Лише їх наявність
• В будь-якій програмі є дефекти
3.
Тестування
• Починається разоміз розробкою
• Спосіб: запускаємо і дивимось чи працює
• Створюємо допоміжні засоби
– Консольні програми
– Допоміжний UI
4.
Unit test, визначення
• Код (зазвичай, метод)
• Який викликає інший код
• І після цього перевіряє правильність
• Деяких припущень
• Unit = модуль, компонент
• (функція, метод, клас, Unit of Work)
5.
Unit test framework
•Виконання тестів
– Одного, декількох, всіх
– Інтеграція з IDE
• API для написання тестів
• Автоматизація
• Перегляд результатів
6.
Unit test framework
•NUnit, MS Test, Xunit, MBUnit, DBUnit
• Test runners:
– Visual Studio, NUnit GUI/Console apps,
ReSharper, TestDriven.Net, Gallio
7.
Unit test
[TestFixture]
public classCalculatorTests
{
[Test]
public void Sum_ReturnsCorrectValue()
{
var math = new Calculator();
int result = math.Sum(1, 2);
Assert.AreEqual(3, result);
}
}
Що тестувати
• Код,що містить логіку
private DateTime _startDate;
// doesn’t need to be tested
public DateTime StartDate
{
get { return _startDate; }
set { _startDate = value; }
}
10.
Єдиний assert
• Юніт-тестповинен тестувати щось одне
• Назва тесту важлива
[Test]
public void Start_Test()
{
var survey = new Survey();
survey.Start();
Assert.AreEqual(SurveyState.InProgress, survey.State);
Assert.IsTrue(survey.FinishDate > survey.StartDate);
}
Залежності
• Survey залежить від EmailSender
• Не хочемо відсилати справжні листи
• Створюємо stub вручну
• Створюємо stub автоматично
• Все ще тестуємо стан!
Assert.AreEqual(SurveyState.InProgress,
survey.State);
14.
Interaction testing
• Потреба тестувати взаємодії
• Створюємо mock вручну
• Створюємо mock автоматично
• Один mock на тест
• Тестуємо не стан, а взаємодію!
mockEmailSender.Verify();
15.
Особливості тестів наповедінку
• Реалізують
діаграми послідовності
(sequence diagram)
• Дозволяють розробляти
“згори вниз”
• отримуючи API “нижчих” об’єктів
“автоматично”
16.
Stubs + mocks
•Один тест – один mock
• Декілька stubs
Fakes
Stubs Mocks
0..* 0..1
Юніт тести
• Тестують один модуль
• Виконуються виключно в пам’яті
• Не вимагають конфігурації
• Не вимагають DB, FS, AD, Net
• Завжди
– Повторювано проходять
– Або повторювано не проходять
– Тому що не залежать від змінних факторів
23.
Інтеграційні тести
• Тестуютьмодулі разом
• Можуть мати різну поведінку
• В залежності від
– Середовища (FS, DB, AD, OS, .config)
– Порядку виконання
– Кількості виконання
– Багатопоточності
– Повного місяця
Trustworthy
• Юніт-тести –ДОВІРА
– Проходять --> мабуть немає дефекту
– Не проходять --> точно є дефект
• Інтеграційні тести – (деколи) НЕДОВІРА
– Проходять --> немає дефекту
– Не проходять --> можливо дефект
Якщо в кодіпомилка, тести
повинні це показувати
• Спосіб перевірки – внести помилку і
перевірити, як тести про це сповіщають
29.
Логіка в юніт-тестах
•Asserts in if/switch/for/while
• Значно підвищується ймовірність появи
дефекта в тесті
• Погіршується readability & maintainability
Зміна тестів
• Створення:
– У більшості випадків
• Видалення:
– Коли тест більше не потрібний
• Редагування:
– Для maintainability/readability
– Для швидкості
– Коли тест повинен виконуватись по-іншому