automated testing

34
Automated Testing

Upload: victor-matyushevskyy

Post on 23-Jun-2015

835 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Automated testing

Automated Testing

Page 2: Automated testing

Про тестування• Тестування не підвищує якість ПЗ,• а сприяє розпізнаванню

неправильної поведінки,• завдяки чому розробники можуть

знайти помилки і виправити їх• Тестування не може довести

відсутності дефектів– Лише їх наявність

• В будь-якій програмі є дефекти

Page 3: Automated testing

Тестування

• Починається разом із розробкою• Спосіб: запускаємо і дивимось чи

працює• Створюємо допоміжні засоби– Консольні програми– Допоміжний UI

Page 4: Automated testing

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

правильність• Деяких припущень

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

Page 5: Automated testing

Unit test framework

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

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

Page 6: Automated testing

Unit test framework

• NUnit, MS Test, Xunit, MBUnit, DBUnit• Test runners: – Visual Studio, NUnit GUI/Console apps,

ReSharper, TestDriven.Net, Gallio

Page 7: Automated testing

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 8: Automated testing

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 9: Automated testing

Що тестувати

• Код, що містить логіку

private DateTime _startDate;

// doesn’t need to be testedpublic DateTime StartDate{ get { return _startDate; } set { _startDate = value; }}

Page 10: Automated testing

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

одне• Назва тесту важлива[Test]public void Start_Test(){ var survey = new Survey();

survey.Start();

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

Page 11: Automated testing

Залежності

Page 12: Automated testing

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

survey.Start();

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

Page 13: Automated testing

Залежності

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

листи• Створюємо stub вручну• Створюємо stub автоматично• Все ще тестуємо стан!

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

Page 14: Automated testing

Interaction testing

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

mockEmailSender.Verify();

Page 15: Automated testing

Особливості тестів на поведінку

• Реалізують діаграми послідовності (sequence diagram)

• Дозволяють розробляти “згори вниз”

• отримуючи API “нижчих” об’єктів “автоматично”

Page 16: Automated testing

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

Fakes

Stubs 0..*

Mocks 0..1

Page 17: Automated testing

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

Page 18: Automated testing

How unit testing helps

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

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

Page 19: Automated testing

Плюси тестів

• Кращий код• Стабільніша нова

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

Page 20: Automated testing

Різновиди

Page 21: Automated testing

Види тестів

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

Page 22: Automated testing

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

факторів

Page 23: Automated testing

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

Page 24: Automated testing

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

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

Page 25: Automated testing

Структура проекту

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

Page 26: Automated testing

Trustworthy

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

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

Page 27: Automated testing

Практики

Page 28: Automated testing

Якщо в коді помилка, тести повинні це показувати

• Спосіб перевірки – внести помилку і перевірити, як тести про це сповіщають

Page 29: Automated testing

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

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

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

maintainability

Page 30: Automated testing

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

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

Page 31: Automated testing

Magic numbers

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

Page 32: Automated testing

Зміна тестів

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

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

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

іншому

Page 33: Automated testing

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

• Пишемо новий тест• Дефект не повинен бути

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

Page 34: Automated testing

Questions