code driven testing -- oleksandr pavlyshak

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

Upload: igor-bronovskyy

Post on 28-Nov-2014

714 views

Category:

Education


0 download

DESCRIPTION

IT Event 2011 Spring

TRANSCRIPT

Page 1: Code driven testing -- oleksandr pavlyshak

Code-driven testing

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

Олександр Павлишак, [email protected]

Page 2: Code driven testing -- oleksandr pavlyshak

Agenda

• Поняття Unit test• Підміна залежностей, stubs• Тестування взаємодій, mocks• Якості хороших тестів• Unit vs integration testing• Практики• Метрики

Page 3: Code driven testing -- oleksandr pavlyshak

Тестування

• Починається разом із розробкою• Запускаємо і дивимось• Створюємо допоміжні засоби– Консольні програми– Допоміжний UI

Page 4: Code driven testing -- oleksandr pavlyshak

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

• Код (зазвичай, метод)• Який викликає інший код• І після цього перевіряє правильність• Деяких припущень

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

Page 5: Code driven testing -- oleksandr pavlyshak

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 -- oleksandr pavlyshak

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 -- oleksandr pavlyshak

Єдиний 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 -- oleksandr pavlyshak

Unit test framework

• Виконання тестів– Одного, декількох, всіх– Інтеграція з IDE

• API для написання тестів• Автоматизація• Перегляд результатів

Page 9: Code driven testing -- oleksandr pavlyshak

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 -- oleksandr pavlyshak

Continuous integration

Page 11: Code driven testing -- oleksandr pavlyshak

Continuous integration

Page 12: Code driven testing -- oleksandr pavlyshak

Залежності

Page 13: Code driven testing -- oleksandr pavlyshak

DEMO[Test]public void Start_ChangesStateToInProgress(){ var survey = new Survey();

survey.Start();

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

Page 14: Code driven testing -- oleksandr pavlyshak

Залежності

• Survey залежить від EmailSender• Не хочемо відсилати справжні листи• Створюємо stub вручну• Створюємо stub автоматично• Все ще тестуємо стан!

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

Page 15: Code driven testing -- oleksandr pavlyshak

Interaction testing

• Потреба тестувати взаємодії• Створюємо mock вручну• Створюємо mock автоматично• Один mock на тест• Тестуємо не стан, а взаємодію!

mockEmailSender.Verify();

Page 16: Code driven testing -- oleksandr pavlyshak

Stubs + mocks

• Один тест – один mock• Декілька stubs

Fakes

Stubs 0..*

Mocks 0..1

Page 17: Code driven testing -- oleksandr pavlyshak

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

Page 18: Code driven testing -- oleksandr pavlyshak

How unit testing helps

• Швидший цикл тестування коду• Коротший фідбек про можливі дефекти• Дефекти дешевші

Page 19: Code driven testing -- oleksandr pavlyshak

Плюси тестів

• Кращий код• Стабільніша нова функціональність• Більше впевненості у змінах• Менше регресій• Коротші цикли релізів

Page 20: Code driven testing -- oleksandr pavlyshak

Якості

Page 21: Code driven testing -- oleksandr pavlyshak

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

• Readable• Maintainable• Trustworthy

Page 22: Code driven testing -- oleksandr pavlyshak

Readable

• Легко зрозуміти, що відбувається в тесті• Який код тестується• Які передумови• Які припущення перевіряються• Що тестує тест• Простий код тесту

Page 23: Code driven testing -- oleksandr pavlyshak

Trustworthy

• Релевантні до помилок• Стабільно (не) проходять• Немає конфліктуючих тестів• Справді тестують

Page 24: Code driven testing -- oleksandr pavlyshak
Page 25: Code driven testing -- oleksandr pavlyshak

Maintainable

• Тести легко реагують на зміни• Не вимагають конфігурації• Не залежать від інших тестів• Простий код тесту

Page 26: Code driven testing -- oleksandr pavlyshak

Різновиди

Page 27: Code driven testing -- oleksandr pavlyshak

Види тестів

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

Page 28: Code driven testing -- oleksandr pavlyshak

Юніт тести

• Тестують один модуль• Виконуються виключно в пам’яті• Не вимагають конфігурації• Не вимагають DB, FS, AD, Net• Завжди– Повторювано проходять– Або повторювано не проходять– Тому що не залежать від змінних факторів

Page 29: Code driven testing -- oleksandr pavlyshak

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

• Тестують модулі разом• Можуть мати різну поведінку• В залежності від– Середовища (FS, DB, AD, OS, .config)– Порядку виконання– Кількості виконання– Багатопоточності– Повного місяця

Page 30: Code driven testing -- oleksandr pavlyshak

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

• TearDown() • DateTime.Now• Thread• Environment.MachineName• Database.Save(…)• File.Open(…)

Page 31: Code driven testing -- oleksandr pavlyshak

Mixing

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

Page 32: Code driven testing -- oleksandr pavlyshak

Trustworthy

• Юніт-тести – ДОВІРА– Проходять --> мабуть немає дефекту– Не проходять --> точно є дефект

• Інтеграційні тести – (деколи) НЕДОВІРА– Проходять --> немає дефекту– Не проходять --> можливо дефект

Page 33: Code driven testing -- oleksandr pavlyshak

Практики

Page 34: Code driven testing -- oleksandr pavlyshak

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

• Asserts in if/switch/for/while• Значно підвищується ймовірність появи

дефекта в тесті• Погіршується readability & maintainability

Page 35: Code driven testing -- oleksandr pavlyshak

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

• Приклад• Tests last• Тест не тестує• Expected hardcoded values

Page 36: Code driven testing -- oleksandr pavlyshak

Magic numbers

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

Page 37: Code driven testing -- oleksandr pavlyshak

Зміна тестів

• Створення:– У більшості випадків

• Видалення:– Коли тест більше не потрібний

• Редагування:– Для maintainability/readability– Для швидкості– Коли тест повинен виконуватись по-іншому

Page 38: Code driven testing -- oleksandr pavlyshak

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

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

тестувальниками знову

Page 39: Code driven testing -- oleksandr pavlyshak

Що міряти

• Кількість регресій• Час виправлення дефектів• Метрики якості коду• People feedback• Покриття (coverage)

Page 40: Code driven testing -- oleksandr pavlyshak

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

• Тестування не безкоштовне• Надмірність тестів• Надмірність тестів взаємодій• 100% покриття не завжди потрібне

Page 41: Code driven testing -- oleksandr pavlyshak

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

• Unit testing patterns• Mocks/stubs/fakes, isolation frameworks• TDD, Test Driven Development• Contracts, Contract Driven Development

Page 42: Code driven testing -- oleksandr pavlyshak

Q&A

Code-driven testingОлександр Павлишак, [email protected]