Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Automated testing basics for
developers
Bohdan Pashkovskyi
Senior .NET Software Engineer at Perfectial
Agenda
Ivano Frankivsk 2018
Що таке тестування і яким воно буває?
Unit tests vs Integration tests
Dependency Injection
Inv...
Що таке тестування?
2 + 2 = ?
Ivano Frankivsk 2018
Тестування програмного забезпечення — процес перевірки на
відповідність...
Навіщо тестувати програми?
Тестування не може довести відсутності дефектів, лише їх
наявність
Ivano Frankivsk 2018
В будь-...
Яким буває тестування?
Ivano Frankivsk 2018
Нефункціональне
тестування
Тестування пов’язане зі змінамиФункціональне тестув...
Agenda
Ivano Frankivsk 2018
Що таке тестування і яким воно буває?
Unit tests vs Integration tests
Dependency Injection
Inv...
Unit test (модульний тест)
Це код (зазвичай, метод), який викликає інший код (production) і
після цього перевіряє правильн...
Unit тести
• Тестують один модуль
• Виконуються виключно в пам’яті
• Не вимагають конфігурації
• Не вимагають DB, FS, AD, ...
Інтеграційні тести
Тестують модулі разом
Можуть мати різну поведінку, в залежності від
• Середовища (FS, DB, AD, OS, .conf...
Ознаки інтеграційних тестів
• TearDown()
• DateTime.Now
• Thread
• Environment.MachineName
• Database.Save(…)
• File.Open(...
Приклад
модульного
тесту
Ivano Frankivsk 2018
[TestClass]
public class OrderTests
{
[TestMethod]
public void OrderApproval...
A A A
Ivano Frankivsk 2018
[TestClass]
public class OrderTests
{
[TestMethod]
public void OrderApproval_ShouldChangeOrderS...
Unit tests frameworks
• Виконання тестів
• Інтеграція з IDE
• API для написання тестів
• Автоматизація
• Перегляд результа...
Unit tests
frameworks
Ivano Frankivsk 2018
Agenda
Ivano Frankivsk 2018
Що таке тестування і яким воно буває?
Unit tests vs Integration tests
Dependency Injection
Inv...
Dependency
Ivano Frankivsk 2018
public class OrderManager
{
public void ApproveOrder(Order orderToApprove)
{
orderToApprov...
Dependency injection
DI – це процес надання зовнішньої залежності програмному
компоненту. Є специфічною формою «інверсії к...
DI крок 1
абстракція
Ivano Frankivsk 2018
public interface IMailSender
{
void Send(string address, string message);
}
publ...
Constructor
injection
Ivano Frankivsk 2018
class OrderManager
{
private readonly IMailSender _mailSender;
public OrderMana...
Constructor
injection
Ivano Frankivsk 2018
var mailSender = new MailSender();
var orderManager = new OrderManager(mailSend...
Setter
injection
Ivano Frankivsk 2018
class OrderManager
{
public IMailSender MailSender { get; set; }
public void Approve...
Setter
injection
Ivano Frankivsk 2018
class OrderManager
{
public IMailSender MailSender { get; set; }
public void Approve...
Setter
injection
Ivano Frankivsk 2018
var mailSender = new MailSender();
var orderManager = new OrderManager();
orderManag...
Agenda
Ivano Frankivsk 2018
Що таке тестування і яким воно буває?
Unit tests vs Integration tests
Dependency Injection
Inv...
Inversion of Control
• Модулі вищого рівня не повинні залежати від модулів нижчого
рівня. Обидва типи модулів повинні зале...
IoC Containers
• Unity Application Block 2.0
• Spring.NET
• Structuremap
• CastleProject
• Seasar
• Winter.NET
• Ninject
I...
IoC
Containers
Ivano Frankivsk 2018
public class IOCConfig
{
public static Container Container;
public static void Initial...
Agenda
Ivano Frankivsk 2018
Що таке тестування і яким воно буває?
Unit tests vs Integration tests
Dependency Injection
Inv...
Stubs (заглушка)
Стаби (заглушки) використовуються для того, щоб не
використовувати реальні залежності (файлову систему, Б...
Dependency
Ivano Frankivsk 2018
public class OrderManager
{
public void ApproveOrder(Order orderToApprove)
{
orderToApprov...
DI крок 1
абстракція
Ivano Frankivsk 2018
public interface IMailSender
{
void Send(string address, string message);
}
publ...
Stubs
Ivano Frankivsk 2018
public class StubMailSender : IMailSender
{
public void Send(string email, string message)
{
//...
Stubs
Ivano Frankivsk 2018
[TestMethod]
public void OrderApproveMethod_ShouldChangeOrderStatusToApproved()
{
// Arrange
va...
Isolation
frameworks
(Moq, RhinoMocks, etc)
Ivano Frankivsk 2018
[TestMethod]
public void OrderApproveMethod_ShouldChangeO...
Mocks
Mock використовуються для того, щоб протестувати взаємодію
залежностей.
Mock може бути лише один у тесті.
Один Asser...
Mocks
Ivano Frankivsk 2018
[TestMethod]
public void OrderApproveMethod_ShouldChangeOrderStatusToApproved()
{
// Arrange
va...
Stubs +
mocks
(Один тест – один mock, але декілька stubs)
Ivano Frankivsk 2018
Fakes
Stubs 0..* Mocks 0..1
Agenda
Ivano Frankivsk 2018
Що таке тестування і яким воно буває?
Unit tests vs Integration tests
Dependency Injection
Inv...
Що
тестувати
Ivano Frankivsk 2018
public class Order
{
private string _title;
public string Title
{
get { return _title; }...
Переваги модульних тестів
• Швидший цикл тестування коду
• Коротший фідбек про можливі дефекти
• Дефекти дешевші
• Кращий ...
Якості модульних тестів
• Readable
• Maintainable
• Trustworthy
Ivano Frankivsk 2018
Readable
• Що відбувається в тесті
• Який код тестується
• Які передумови
• Які припущення перевіряються
• Що тестує тест
...
Maintainable
• Тести легко реагують на зміни
• Не вимагають конфігурації
• Не залежать від інших тестів
• Простий код тест...
Trustworthy
• Релевантні до помилок
• Стабільно (не) проходять
• Немає конфліктуючих тестів
• Справді тестують
Ivano Frank...
Agenda
Ivano Frankivsk 2018
Що таке тестування і яким воно буває?
Unit tests vs Integration tests
Dependency Injection
Inv...
TDD
Ivano Frankivsk 2018
BDD
Ivano Frankivsk 2018
Speckflow
(Cucumber for .NET)
Ivano Frankivsk 2018
Speckflow
Feature example
Ivano Frankivsk 2018
Feature: Calculator_Add
In order to avoid silly mistakes
As a math idiot
I ...
Speckflow
Bindings
Ivano Frankivsk 2018[Binding]
public class Calculator_SharedSteps
{
[Given(@"I have a calculator")]
pub...
Speckflow
Web example
Ivano Frankivsk 2018
Feature: Login page should give ability to Login or Register for
Background:
Gi...
Code
coverage
Ivano Frankivsk 2018
Ivano Frankivsk 2018
Prochain SlideShare
Chargement dans…5
×

sur

CoreCamp "Automated testing basics for developers" Slide 1 CoreCamp "Automated testing basics for developers" Slide 2 CoreCamp "Automated testing basics for developers" Slide 3 CoreCamp "Automated testing basics for developers" Slide 4 CoreCamp "Automated testing basics for developers" Slide 5 CoreCamp "Automated testing basics for developers" Slide 6 CoreCamp "Automated testing basics for developers" Slide 7 CoreCamp "Automated testing basics for developers" Slide 8 CoreCamp "Automated testing basics for developers" Slide 9 CoreCamp "Automated testing basics for developers" Slide 10 CoreCamp "Automated testing basics for developers" Slide 11 CoreCamp "Automated testing basics for developers" Slide 12 CoreCamp "Automated testing basics for developers" Slide 13 CoreCamp "Automated testing basics for developers" Slide 14 CoreCamp "Automated testing basics for developers" Slide 15 CoreCamp "Automated testing basics for developers" Slide 16 CoreCamp "Automated testing basics for developers" Slide 17 CoreCamp "Automated testing basics for developers" Slide 18 CoreCamp "Automated testing basics for developers" Slide 19 CoreCamp "Automated testing basics for developers" Slide 20 CoreCamp "Automated testing basics for developers" Slide 21 CoreCamp "Automated testing basics for developers" Slide 22 CoreCamp "Automated testing basics for developers" Slide 23 CoreCamp "Automated testing basics for developers" Slide 24 CoreCamp "Automated testing basics for developers" Slide 25 CoreCamp "Automated testing basics for developers" Slide 26 CoreCamp "Automated testing basics for developers" Slide 27 CoreCamp "Automated testing basics for developers" Slide 28 CoreCamp "Automated testing basics for developers" Slide 29 CoreCamp "Automated testing basics for developers" Slide 30 CoreCamp "Automated testing basics for developers" Slide 31 CoreCamp "Automated testing basics for developers" Slide 32 CoreCamp "Automated testing basics for developers" Slide 33 CoreCamp "Automated testing basics for developers" Slide 34 CoreCamp "Automated testing basics for developers" Slide 35 CoreCamp "Automated testing basics for developers" Slide 36 CoreCamp "Automated testing basics for developers" Slide 37 CoreCamp "Automated testing basics for developers" Slide 38 CoreCamp "Automated testing basics for developers" Slide 39 CoreCamp "Automated testing basics for developers" Slide 40 CoreCamp "Automated testing basics for developers" Slide 41 CoreCamp "Automated testing basics for developers" Slide 42 CoreCamp "Automated testing basics for developers" Slide 43 CoreCamp "Automated testing basics for developers" Slide 44 CoreCamp "Automated testing basics for developers" Slide 45 CoreCamp "Automated testing basics for developers" Slide 46 CoreCamp "Automated testing basics for developers" Slide 47 CoreCamp "Automated testing basics for developers" Slide 48 CoreCamp "Automated testing basics for developers" Slide 49 CoreCamp "Automated testing basics for developers" Slide 50 CoreCamp "Automated testing basics for developers" Slide 51 CoreCamp "Automated testing basics for developers" Slide 52 CoreCamp "Automated testing basics for developers" Slide 53
Prochain SlideShare
What to Upload to SlideShare
Suivant
Télécharger pour lire hors ligne et voir en mode plein écran

0 j’aime

Partager

Télécharger pour lire hors ligne

CoreCamp "Automated testing basics for developers"

Télécharger pour lire hors ligne

Based on Oleksandr Pavlyshak speech
https://www.youtube.com/watch?v=NGITTe-8KHM

Livres associés

Gratuit avec un essai de 30 jours de Scribd

Tout voir
  • Soyez le premier à aimer ceci

CoreCamp "Automated testing basics for developers"

  1. 1. Automated testing basics for developers Bohdan Pashkovskyi Senior .NET Software Engineer at Perfectial
  2. 2. Agenda Ivano Frankivsk 2018 Що таке тестування і яким воно буває? Unit tests vs Integration tests Dependency Injection Inversion of Control Якості хороших unit тестів Fakes (stubs + mocks) TDD + BDD
  3. 3. Що таке тестування? 2 + 2 = ? Ivano Frankivsk 2018 Тестування програмного забезпечення — процес перевірки на відповідність між реальною та очікуваною поведінкою програми …
  4. 4. Навіщо тестувати програми? Тестування не може довести відсутності дефектів, лише їх наявність Ivano Frankivsk 2018 В будь-якій програмі є дефекти
  5. 5. Яким буває тестування? Ivano Frankivsk 2018 Нефункціональне тестування Тестування пов’язане зі змінамиФункціональне тестування Модульне Інтеграційне Системне Приймальне Тестування продуктивності Відмовостійкості Установки Зручності Регресійне На дим Санітарне
  6. 6. Agenda Ivano Frankivsk 2018 Що таке тестування і яким воно буває? Unit tests vs Integration tests Dependency Injection Inversion of Control Якості хороших unit тестів Fakes (stubs + mocks) TDD + BDD
  7. 7. Unit test (модульний тест) Це код (зазвичай, метод), який викликає інший код (production) і після цього перевіряє правильність деяких припущень Ivano Frankivsk 2018
  8. 8. Unit тести • Тестують один модуль • Виконуються виключно в пам’яті • Не вимагають конфігурації • Не вимагають DB, FS, AD, Net • Завжди Повторювано проходять Або повторювано не проходять Тому що не залежать від змінних факторів Ivano Frankivsk 2018
  9. 9. Інтеграційні тести Тестують модулі разом Можуть мати різну поведінку, в залежності від • Середовища (FS, DB, AD, OS, .config) • Порядку виконання • Кількості виконання • Багато поточності • Повного місяця Ivano Frankivsk 2018
  10. 10. Ознаки інтеграційних тестів • TearDown() • DateTime.Now • Thread • Environment.MachineName • Database.Save(…) • File.Open(…) Ivano Frankivsk 2018
  11. 11. Приклад модульного тесту Ivano Frankivsk 2018 [TestClass] public class OrderTests { [TestMethod] public void OrderApproval_ShouldChangeOrderStatusToApproved() { var order = new Order(); order.Approve(); Assert.AreEqual(OrderStatus.Approved, order.Status); } }
  12. 12. A A A Ivano Frankivsk 2018 [TestClass] public class OrderTests { [TestMethod] public void OrderApproval_ShouldChangeOrderStatusToApproved() { // Arrange var order = new Order(); // Act order.Approve(); // Assert Assert.AreEqual(OrderStatus.Approved, order.Status); } }
  13. 13. Unit tests frameworks • Виконання тестів • Інтеграція з IDE • API для написання тестів • Автоматизація • Перегляд результатів NUnit, MS Test, Xunit, MBUnit, DBUnit Test runners: Visual Studio, NUnit GUI/Console apps, ReSharper Ivano Frankivsk 2018
  14. 14. Unit tests frameworks Ivano Frankivsk 2018
  15. 15. Agenda Ivano Frankivsk 2018 Що таке тестування і яким воно буває? Unit tests vs Integration tests Dependency Injection Inversion of Control Якості хороших unit тестів Fakes (stubs + mocks) TDD + BDD
  16. 16. Dependency Ivano Frankivsk 2018 public class OrderManager { public void ApproveOrder(Order orderToApprove) { orderToApprove.Approve(); // dependency var mailSender = new MailSender(); mailSender.Send("admin@example.com", "Order was approved"); } }
  17. 17. Dependency injection DI – це процес надання зовнішньої залежності програмному компоненту. Є специфічною формою «інверсії керування» (Inversion of Control, IoC) Розрізняють дві основні форми DI (взагалі-то три ) - ін’єкція у конструктор (constructor injection) - ін’єкція у властивість (setter/property injection) Ivano Frankivsk 2018
  18. 18. DI крок 1 абстракція Ivano Frankivsk 2018 public interface IMailSender { void Send(string address, string message); } public class MailSender : IMailSender { public void Send(string email, string message) { ... } }
  19. 19. Constructor injection Ivano Frankivsk 2018 class OrderManager { private readonly IMailSender _mailSender; public OrderManager(IMailSender mailSender) { _mailSender = mailSender; } public void ApproveOrder(Order orderToApprove) { orderToApprove.Approve(); _mailSender.Send("admin@saasap.net", "Order was approved"); } }
  20. 20. Constructor injection Ivano Frankivsk 2018 var mailSender = new MailSender(); var orderManager = new OrderManager(mailSender); orderManager.ApproveOrder(orderToApprove);
  21. 21. Setter injection Ivano Frankivsk 2018 class OrderManager { public IMailSender MailSender { get; set; } public void ApproveOrder(Order orderToApprove) { orderToApprove.Approve(); MailSender.Send("admin@saasap.net", "Order was approved"); } }
  22. 22. Setter injection Ivano Frankivsk 2018 class OrderManager { public IMailSender MailSender { get; set; } public void ApproveOrder(Order orderToApprove) { orderToApprove.Approve(); MailSender.Send("admin@saasap.net", "Order was approved"); } }
  23. 23. Setter injection Ivano Frankivsk 2018 var mailSender = new MailSender(); var orderManager = new OrderManager(); orderManager.MailSender = mailSender; orderManager.ApproveOrder(orderToApprove);
  24. 24. Agenda Ivano Frankivsk 2018 Що таке тестування і яким воно буває? Unit tests vs Integration tests Dependency Injection Inversion of Control Якості хороших unit тестів Fakes (stubs + mocks) TDD + BDD
  25. 25. Inversion of Control • Модулі вищого рівня не повинні залежати від модулів нижчого рівня. Обидва типи модулів повинні залежати від абстракцій. • Абстракції не повинні залежати від деталей реалізації. Деталі реалізації повинні залежати від абстракцій. Ivano Frankivsk 2018
  26. 26. IoC Containers • Unity Application Block 2.0 • Spring.NET • Structuremap • CastleProject • Seasar • Winter.NET • Ninject Ivano Frankivsk 2018
  27. 27. IoC Containers Ivano Frankivsk 2018 public class IOCConfig { public static Container Container; public static void Initialize() { Container = new Container(x => { // constructor x.For<IMailSender>().Use<MailSender>(); // setter x.Policies.FillAllPropertiesOfType<IMailSender>().Use<MailSender>(); }); } } public class Test { public IMailSender MailSender = IOCConfig.Container.GetInstance<IMailSender>(); }
  28. 28. Agenda Ivano Frankivsk 2018 Що таке тестування і яким воно буває? Unit tests vs Integration tests Dependency Injection Inversion of Control Якості хороших unit тестів Fakes (stubs + mocks) TDD + BDD
  29. 29. Stubs (заглушка) Стаби (заглушки) використовуються для того, щоб не використовувати реальні залежності (файлову систему, БД, поштові серери, тощо). Це дозволяє тестувати тільки необхідний компонент Стабів у тесті може бути багато. Ivano Frankivsk 2018
  30. 30. Dependency Ivano Frankivsk 2018 public class OrderManager { public void ApproveOrder(Order orderToApprove) { orderToApprove.Approve(); // dependency var mailSender = new MailSender(); mailSender.Send("admin@example.com", "Order was approved"); } }
  31. 31. DI крок 1 абстракція Ivano Frankivsk 2018 public interface IMailSender { void Send(string address, string message); } public class MailSender : IMailSender { public void Send(string email, string message) { ... } }
  32. 32. Stubs Ivano Frankivsk 2018 public class StubMailSender : IMailSender { public void Send(string email, string message) { // do nothing } }
  33. 33. Stubs Ivano Frankivsk 2018 [TestMethod] public void OrderApproveMethod_ShouldChangeOrderStatusToApproved() { // Arrange var order = new Order(); var orderManager = new OrderManager(new StubMailSender()); // Act orderManager.ApproveOrder(order); // Assert Assert.AreEqual(OrderStatus.Approved, order.Status); }
  34. 34. Isolation frameworks (Moq, RhinoMocks, etc) Ivano Frankivsk 2018 [TestMethod] public void OrderApproveMethod_ShouldChangeOrderStatusToApproved() { // Arrange var order = new Order(); var stubMailSender = new Mock<IMailSender>(); var orderManager = new OrderManager(stubMailSender.Object); // Act orderManager.ApproveOrder(order); // Assert, все ще тестуємо стан Assert.AreEqual(OrderStatus.Approved, order.Status); }
  35. 35. Mocks Mock використовуються для того, щоб протестувати взаємодію залежностей. Mock може бути лише один у тесті. Один Assert = Один Verify Ivano Frankivsk 2018
  36. 36. Mocks Ivano Frankivsk 2018 [TestMethod] public void OrderApproveMethod_ShouldChangeOrderStatusToApproved() { // Arrange var order = new Order(); var mockMailSender = new Mock<IMailSender>(); mockMailSender.Setup(ms => ms.Send( "admin@example.com", It.IsAny<string>())) .Verifiable(); var orderManager = new OrderManager(mockMailSender.Object); // Act orderManager.ApproveOrder(order); // Assert mockMailSender.Verify(); }
  37. 37. Stubs + mocks (Один тест – один mock, але декілька stubs) Ivano Frankivsk 2018 Fakes Stubs 0..* Mocks 0..1
  38. 38. Agenda Ivano Frankivsk 2018 Що таке тестування і яким воно буває? Unit tests vs Integration tests Dependency Injection Inversion of Control Якості хороших unit тестів Fakes (stubs + mocks) TDD + BDD
  39. 39. Що тестувати Ivano Frankivsk 2018 public class Order { private string _title; public string Title { get { return _title; } set { _title = value; } } }
  40. 40. Переваги модульних тестів • Швидший цикл тестування коду • Коротший фідбек про можливі дефекти • Дефекти дешевші • Кращий код • Стабільніша нова функціональність • Більше впевненості у змінах • Менше регресій • Коротші цикли релізів Ivano Frankivsk 2018
  41. 41. Якості модульних тестів • Readable • Maintainable • Trustworthy Ivano Frankivsk 2018
  42. 42. Readable • Що відбувається в тесті • Який код тестується • Які передумови • Які припущення перевіряються • Що тестує тест • Простий код тесту Ivano Frankivsk 2018
  43. 43. Maintainable • Тести легко реагують на зміни • Не вимагають конфігурації • Не залежать від інших тестів • Простий код тесту Ivano Frankivsk 2018
  44. 44. Trustworthy • Релевантні до помилок • Стабільно (не) проходять • Немає конфліктуючих тестів • Справді тестують Ivano Frankivsk 2018
  45. 45. Agenda Ivano Frankivsk 2018 Що таке тестування і яким воно буває? Unit tests vs Integration tests Dependency Injection Inversion of Control Якості хороших unit тестів Fakes (stubs + mocks) TDD + BDD
  46. 46. TDD Ivano Frankivsk 2018
  47. 47. BDD Ivano Frankivsk 2018
  48. 48. Speckflow (Cucumber for .NET) Ivano Frankivsk 2018
  49. 49. Speckflow Feature example Ivano Frankivsk 2018 Feature: Calculator_Add In order to avoid silly mistakes As a math idiot I want to be told the sum of two numbers Background: Given I have a calculator Scenario: Add two numbers Given I enter 50 into the calculator And I press plus And I enter 70 into the calculator When I press enter Then the result should be 120 be displayed
  50. 50. Speckflow Bindings Ivano Frankivsk 2018[Binding] public class Calculator_SharedSteps { [Given(@"I have a calculator")] public void GivenIHaveACalculator() { ScenarioContext.Current.Set<Calculator>(new Calculator()); } [Given(@"I enter (.*) into the calculator")] public void GivenIEnterIntoTheCalculator(int p0) { ScenarioContext.Current.Get<Calculator>().Number(p0); } [When(@"I press enter")] public void WhenIPressEnter() { ScenarioContext.Current.Get<Calculator>().Enter(); } [Then(@"the result should be (.*) be displayed")] public void ThenTheResultShouldBeBeDisplayed(int p0) { Assert.AreEqual(Convert.ToString(p0), ScenarioContext.Current.Get<Calculator>().Display); } }
  51. 51. Speckflow Web example Ivano Frankivsk 2018 Feature: Login page should give ability to Login or Register for Background: Given I am not logged in And I am on "/account/login" page Scenario: When I enter empty pass in Login form, I should see error message When I have filled out the form as follows | Id | Value | | Login_Password | | And I press input type "submit" with value „Login" Then I should see error „Required" for Login_Password Scenario: If I am logged In a am redirected to account details When I log in as user And I go to "/account/login" page Then I should be on page "/account/details"
  52. 52. Code coverage Ivano Frankivsk 2018
  53. 53. Ivano Frankivsk 2018

Based on Oleksandr Pavlyshak speech https://www.youtube.com/watch?v=NGITTe-8KHM

Vues

Nombre de vues

81

Sur Slideshare

0

À partir des intégrations

0

Nombre d'intégrations

1

Actions

Téléchargements

0

Partages

0

Commentaires

0

Mentions J'aime

0

×