Code driven testing (UA)

42
Code-driven testing Аудиторія: розробники Олександр Павлишак, 2011 [email protected]

Transcript of Code driven testing (UA)

Page 1: Code driven testing (UA)

Code-driven testing

Аудиторія: розробники

Олександр Павлишак, 2011

[email protected]

Page 2: Code driven testing (UA)

Agenda

• Поняття Unit test

• Підміна залежностей, stubs

• Тестування взаємодій, mocks

• Якості хороших тестів

• Unit vs integration testing

• Практики

• Метрики

Page 3: Code driven testing (UA)

Тестування

• Починається разом із розробкою

• Запускаємо і дивимось

• Створюємо допоміжні засоби

– Консольні програми

– Допоміжний UI

Page 4: Code driven testing (UA)

Unit test, визначення

• Код (зазвичай, метод)

• Який викликає інший код

• І після цього перевіряє правильність

• Деяких припущень

• Unit = модуль, компонент

• (функція, метод, клас, Unit of Work)

Page 5: Code driven testing (UA)

Unit test[TestFixture]public class CalculatorTests{

[Test]public void Sum_ReturnsCorrectValue(){

var math = new Calculator();

int result = math.Sum(1, 2);

Assert.AreEqual(3, result);}

}

Page 6: Code driven testing (UA)

Arrange/Act/Assert[TestFixture]public class CalculatorTests{

[Test]public void Sum_ReturnsCorrectValue(){

var math = new Calculator(); // Arrange

int result = math.Sum(1, 2); // Act

Assert.AreEqual(3, result); // Assert}

}

Page 7: Code driven testing (UA)

Єдиний assert/єдиний verify

• Юніт-тест повинен тестувати щось одне

• Назва тесту важлива

[Test]public void Start_Test(){

var survey = new Survey();

survey.Start();

Assert.AreEqual(SurveyState.InProgress, survey.State);Assert.IsTrue(survey.FinishDate > survey.StartDate);

}

Page 8: Code driven testing (UA)

Unit test framework

• Виконання тестів

– Одного, декількох, всіх

– Інтеграція з IDE

• API для написання тестів

• Автоматизація

• Перегляд результатів

Page 9: Code driven testing (UA)

Unit test framework

• NUnit, MS Test, MBUnit, DBUnit

• JUnit, JWalk, TestNG, DBUnit

• C++test, CppUnit, Google C++ Testing Fx

• PyUnit

Page 10: Code driven testing (UA)

Continuous integration

Page 11: Code driven testing (UA)

Continuous integration

Page 12: Code driven testing (UA)

Залежності

Page 13: Code driven testing (UA)

DEMO

[Test]public void Start_ChangesStateToInProgress(){

var survey = new Survey();

survey.Start();

Assert.AreEqual(SurveyState.InProgress,survey.State);

}

Page 14: Code driven testing (UA)

Залежності

• Survey залежить від EmailSender

• Не хочемо відсилати справжні листи

• Створюємо stub вручну

• Створюємо stub автоматично

• Все ще тестуємо стан!

Assert.AreEqual(SurveyState.InProgress, survey.State);

Page 15: Code driven testing (UA)

Interaction testing

• Потреба тестувати взаємодії

• Створюємо mock вручну

• Створюємо mock автоматично

• Один mock на тест

• Тестуємо не стан, а взаємодію!

mockEmailSender.Verify();

Page 16: Code driven testing (UA)

Stubs + mocks

• Один тест – один mock

• Декілька stubs

Fakes

Stubs 0..*

Mocks 0..1

Page 17: Code driven testing (UA)

Короткий підсумок

Page 18: Code driven testing (UA)

How unit testing helps

• Швидший цикл тестування коду

• Коротший фідбек про можливі дефекти

• Дефекти дешевші

Page 19: Code driven testing (UA)

Плюси тестів

• Кращий код

• Стабільніша нова функціональність

• Більше впевненості у змінах

• Менше регресій

• Коротші цикли релізів

Page 20: Code driven testing (UA)

Якості

Page 21: Code driven testing (UA)

Якості юніт тестів

• Readable

• Maintainable

• Trustworthy

Page 22: Code driven testing (UA)

Readable

• Легко зрозуміти, що відбувається в тесті

• Який код тестується

• Які передумови

• Які припущення перевіряються

• Що тестує тест

• Простий код тесту

Page 23: Code driven testing (UA)

Trustworthy

• Релевантні до помилок

• Стабільно (не) проходять

• Немає конфліктуючих тестів

• Справді тестують

Page 24: Code driven testing (UA)
Page 25: Code driven testing (UA)

Maintainable

• Тести легко реагують на зміни

• Не вимагають конфігурації

• Не залежать від інших тестів

• Простий код тесту

Page 26: Code driven testing (UA)

Різновиди

Page 27: Code driven testing (UA)

Види тестів

• Юніт

• Інтеграційні

• Інші

Page 28: Code driven testing (UA)

Юніт тести

• Тестують один модуль

• Виконуються виключно в пам’яті

• Не вимагають конфігурації

• Не вимагають DB, FS, AD, Net

• Завжди

– Повторювано проходять

– Або повторювано не проходять

– Тому що не залежать від змінних факторів

Page 29: Code driven testing (UA)

Інтеграційні тести

• Тестують модулі разом

• Можуть мати різну поведінку

• В залежності від

– Середовища (FS, DB, AD, OS, .config)

– Порядку виконання

– Кількості виконання

– Багатопоточності

– Повного місяця

Page 30: Code driven testing (UA)

Інтеграційні тести -- Ознаки

• TearDown()

• DateTime.Now

• Thread

• Environment.MachineName

• Database.Save(…)

• File.Open(…)

Page 31: Code driven testing (UA)

Mixing

• Чітке розділення UT та IT

Page 32: Code driven testing (UA)

Trustworthy

• Юніт-тести – ДОВІРА

– Проходять --> мабуть немає дефекту

– Не проходять --> точно є дефект

• Інтеграційні тести – (деколи) НЕДОВІРА

– Проходять --> немає дефекту

– Не проходять --> можливо дефект

Page 33: Code driven testing (UA)

Практики

Page 34: Code driven testing (UA)

Логіка в юніт-тестах

• Asserts in if/switch/for/while

• Значно підвищується ймовірність появи дефекта в тесті

• Погіршується readability & maintainability

Page 35: Code driven testing (UA)

Дублювання логіки production коду

• Приклад

• Tests last

• Тест не тестує

• Expected hardcoded values

Page 36: Code driven testing (UA)

Magic numbers

• Приклад

• Найпростіші можливі значення

• Оголошення і перевірка в тесті

Page 37: Code driven testing (UA)

Зміна тестів

• Створення:

– У більшості випадків

• Видалення:

– Коли тест більше не потрібний

• Редагування:

– Для maintainability/readability

– Для швидкості

– Коли тест повинен виконуватись по-іншому

Page 38: Code driven testing (UA)

Тестувальник знаходить дефект

• Новий тест

• Не повинен бути знайдений тестувальниками знову

Page 39: Code driven testing (UA)

Що міряти

• Кількість регресій

• Час виправлення дефектів

• Метрики якості коду

• People feedback

• Покриття (coverage)

Page 40: Code driven testing (UA)

Обирайте усвідомлено

• Тестування не безкоштовне

• Надмірність тестів

• Надмірність тестів взаємодій

• 100% покриття не завжди потрібне

Page 41: Code driven testing (UA)

На що дивитись далі

• Unit testing patterns

• Mocks/stubs/fakes, isolation frameworks

• TDD, Test Driven Development

• Contracts, Contract Driven Development

Page 42: Code driven testing (UA)

Q&A

Code-driven testingОлександр Павлишак, 2011

[email protected]