SlideShare a Scribd company logo
Тестируем код с Visual
    Studio 2012
@dmytromindra
Содержит откровенный код и сцены модульного
тестирования.




                                   @dmytromindra
Test Driven Development




                   @dmytromindra
Эффективное модульное
 тестирование – одна из
важнейших составляющих
высококачественного кода.
Тестировать легаси код
 сложно, а в некоторых
  случаях невозможно.
Архитектура
Visual Studio                             TeamBuild
                      Command
  Unit Test                               Unit Test
                     Line Runner
  Explorer                                 Activity


          Visual Studio Unit Test Platform



MS-Test    MS-Test
                     NUnit   xUnit.net   QUnit   MORE!
Managed     Native
Chutzpah
В переводе тот, кто выходит зарамки дозволенного.
qunit.d.ts: https://github.com/Diullei/TypeScript-d/blob/master/d.ts/qunit-1.10.0.d.ts
jasmine.d.ts: https://gist.github.com/3887505
Approval Tests
http://approvaltests.sourceforge.net/
Легаси код
   @dmytromindra
Что такое плохо
Это хороший код?
 bool IsFileEmpty(string file) {
     var content = File.ReadAllText(file);
     return content.Length == 0;
 }


А это хороший тест ?
 void FileExistsTest() {
     File.Write("foo.txt", "");
     var result = IsFileEmpty("foo.txt")
     Assert.IsTrue(result);
 }

                                             @dmytromindra
Код, не поддающийся
           тестированию.
Где он водится?
«Лишь бы работало»
  –   Бизнес логика в code-behind
  –   Слишком много зависимостей
  –   Работа с БД перемешана с бизнес логикой.
  –   Свой вариант ... ;)
Там, где тестируемость не предусмотрена
Там, где тестируемость намеренно исключена
Монолитная архитектура




                                                 @dmytromindra
Код, не поддающийся
        тестированию.
Как его узнать?

 –   Сложные процедуры “setup” и “teardown”
 –   Зависимость от состояния среды
 –   Публичные статические методы
 –   Скрытое создание объектов.
 –   Использование замысловатых фреймворков.
 –   Полное отсутствие тестов!



                                   @dmytromindra
Любая система,
 где тестирование требует
  сложной предварительной
          подготовки
  или где тесты работают
           медленно,
считается не тестируемой.


                     @dmytromindra
Зависимость от среды
• Пусть имеется следующий код:

 public void ThrowIfEndOfTheWorld()
 {
   if (DateTime.Now == new DateTime(2012,12,21))
       throw new EndOfTheWorldException();
 }


 Как протестировать его
 надежность ?


                                     @dmytromindra
Зависимость от среды
• Может как-нибудть так?
 [DllImport("kernel32.dll")]
 extern static bool SetSystemTime(ref
 SystemTime time);

 [TestMethod]
 public void Y2KTest()
 {
     SetSystemTime(2012,12,21,0,0,0);
     Assert.Throws( () =>
 ThrowIfEndOfTheWorld() );
 }

                                        @dmytromindra
Изолируй

      Разделяй и властвуй
Есть два пути:
• Тестируемая архитектура
  – Уровни абстракции,
   интерфейсы,
   инъекция зависимости
• Не тестируемая архитектура
  – Отсутствие уровней абстракции, обилие
   публичных статических методов,
   запечатанные типы, и т.д.



                                    @dmytromindra
Модульное тестирование
• Стабы(Stubs) и Моки(Mocks)
   – Простые в использовании, конкретные
     реализации для тестирования
   – Очень похожи, но представляют собой
     разные подходы
http://martinfowler.com/articles/mocksArentStubs.html




                                                        @dmytromindra
VISUAL STUDIO 2012
STUBS
Visual Studio 2012 Stubs
 Генерируются на этапе
  компиляции (быстрые)
 Используют возможности языка
  C# (без дополнительных API)
 Совместимы по типу (is-a) с
  интерфейсом



                         @dmytromindra
VISUAL STUDIO 2012
SHIMS
Visual Studio 2012 Shims
 Во время выполнения
  перехватывают вызовы любых .NET
  методов
 Используют профайлер для
  перенаправления вызовов
 “Monkey patching” для .NET




                          @dmytromindra
Используйте Shims, если …
 Вы работаете с внешними
  компонентами, которые нельзя
  изменить
 Вы работаете с легаси кодом,
  обладающим нетестируемой
  архитектурой




                            @dmytromindra
ShimsContext
Не используйте общий контекст.
Создавайте контекст в каждом
тесте отдельно.




                          @dmytromindra
Почему стоит побысрее
  избавиться от Shims?
 Они медленные!
 Они полагаются на знание
  внутреннего устройства вашей
  системы!




                           @dmytromindra
Эффективное модульное
 тестирование – одна из
важнейших составляющих
высококачественного кода.
Тестировать легаси код
 сложно, но возможно.
Помните! Использование тестов
может улучшить архитектуру
Спасибо !



            @dmytromindra

More Related Content

What's hot

Unit Testing
Unit TestingUnit Testing
Unit Testing
Dima Denisenko
 
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QAFest
 
BDD
BDDBDD
Евгений Сафронов "Тестирование. точка зрения разработчика"
Евгений Сафронов "Тестирование. точка зрения разработчика"Евгений Сафронов "Тестирование. точка зрения разработчика"
Евгений Сафронов "Тестирование. точка зрения разработчика"
DataArt
 
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
Iosif Itkin
 
Составные части объектного подхода
Составные части объектного подходаСоставные части объектного подхода
Составные части объектного подхода
Ural Federal University named after First President of Russia B.N. Yeltsin
 
Методоллогии Agile
Методоллогии AgileМетодоллогии Agile
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
Iosif Itkin
 
Применение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПОПрименение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПО
Andrey Karpov
 
Разработка через тестирование (TDD и BDD)
Разработка через тестирование (TDD и BDD)Разработка через тестирование (TDD и BDD)
Разработка через тестирование (TDD и BDD)
Vyacheslav Lyalkin
 
Документация тестировщика - Александр Трибушный
Документация тестировщика - Александр ТрибушныйДокументация тестировщика - Александр Трибушный
Документация тестировщика - Александр Трибушный
DataArt
 
Как создать качественный статический анализатор
Как создать качественный статический анализаторКак создать качественный статический анализатор
Как создать качественный статический анализатор
Andrey Karpov
 
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
Alexei Lupan
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
TDD
TDDTDD
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
ScrumTrek
 
50 оттенков красного
50 оттенков красного50 оттенков красного
50 оттенков красного
Сергей Александрович
 
Доклад АКТО-2012 Душкин, Смирнова
Доклад АКТО-2012 Душкин, СмирноваДоклад АКТО-2012 Душкин, Смирнова
Доклад АКТО-2012 Душкин, Смирнова
Dmitry Dushkin
 
Sqa.days.2010.beskov.system.analyst.and.test.engineers.interaction
Sqa.days.2010.beskov.system.analyst.and.test.engineers.interactionSqa.days.2010.beskov.system.analyst.and.test.engineers.interaction
Sqa.days.2010.beskov.system.analyst.and.test.engineers.interactionAlexei Lupan
 

What's hot (19)

Unit Testing
Unit TestingUnit Testing
Unit Testing
 
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
 
BDD
BDDBDD
BDD
 
Евгений Сафронов "Тестирование. точка зрения разработчика"
Евгений Сафронов "Тестирование. точка зрения разработчика"Евгений Сафронов "Тестирование. точка зрения разработчика"
Евгений Сафронов "Тестирование. точка зрения разработчика"
 
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
 
Составные части объектного подхода
Составные части объектного подходаСоставные части объектного подхода
Составные части объектного подхода
 
Методоллогии Agile
Методоллогии AgileМетодоллогии Agile
Методоллогии Agile
 
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
 
Применение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПОПрименение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПО
 
Разработка через тестирование (TDD и BDD)
Разработка через тестирование (TDD и BDD)Разработка через тестирование (TDD и BDD)
Разработка через тестирование (TDD и BDD)
 
Документация тестировщика - Александр Трибушный
Документация тестировщика - Александр ТрибушныйДокументация тестировщика - Александр Трибушный
Документация тестировщика - Александр Трибушный
 
Как создать качественный статический анализатор
Как создать качественный статический анализаторКак создать качественный статический анализатор
Как создать качественный статический анализатор
 
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
TDD
TDDTDD
TDD
 
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
 
50 оттенков красного
50 оттенков красного50 оттенков красного
50 оттенков красного
 
Доклад АКТО-2012 Душкин, Смирнова
Доклад АКТО-2012 Душкин, СмирноваДоклад АКТО-2012 Душкин, Смирнова
Доклад АКТО-2012 Душкин, Смирнова
 
Sqa.days.2010.beskov.system.analyst.and.test.engineers.interaction
Sqa.days.2010.beskov.system.analyst.and.test.engineers.interactionSqa.days.2010.beskov.system.analyst.and.test.engineers.interaction
Sqa.days.2010.beskov.system.analyst.and.test.engineers.interaction
 

Similar to Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012

XP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architectureXP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architectureAnton Katkov
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsAnton Vidishchev
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDKrivoy Rog IT Community
 
XP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy codeXP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy code
Dmytro Mindra
 
Test driven development in net
Test driven development in netTest driven development in net
Test driven development in net
Alex Tumanoff
 
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
HappyDev
 
Повышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииПовышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документации
CEE-SEC(R)
 
Модульное тестирование и TDD в .NET
Модульное тестирование и TDD в .NETМодульное тестирование и TDD в .NET
Модульное тестирование и TDD в .NET
Alexander Byndyu
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
Alexander Gornik
 
Андрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеАндрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзе
Elias Fofanov
 
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)DataArt
 
Тестируем legacy c++
Тестируем legacy c++Тестируем legacy c++
Тестируем legacy c++
Maxim Shulga
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
Igor Shkulipa
 
Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
 Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва  Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
it-people
 
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QA Fest 2019. Андрей Солнцев. Десять причин моей ненавистиQA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QAFest
 
Do it yourself profiler
Do it yourself profilerDo it yourself profiler
Do it yourself profiler
Vladimir Sitnikov
 
DevOps guide for awesome quality assurance
DevOps guide for awesome quality assuranceDevOps guide for awesome quality assurance
DevOps guide for awesome quality assurance
Анастасия Асеева
 
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyЧитабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
Dmytro Zharii
 
JavaScript design patterns overview
JavaScript design patterns overview JavaScript design patterns overview
JavaScript design patterns overview
Kseniya Redunova
 
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Ontico
 

Similar to Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012 (20)

XP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architectureXP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architecture
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET Applications
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
 
XP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy codeXP Days Ukraine 2014 - Refactoring legacy code
XP Days Ukraine 2014 - Refactoring legacy code
 
Test driven development in net
Test driven development in netTest driven development in net
Test driven development in net
 
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
 
Повышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документацииПовышение качества тестов и автоматическая валидация REST API документации
Повышение качества тестов и автоматическая валидация REST API документации
 
Модульное тестирование и TDD в .NET
Модульное тестирование и TDD в .NETМодульное тестирование и TDD в .NET
Модульное тестирование и TDD в .NET
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Андрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеАндрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзе
 
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)
Майстер-клас "Автоматизоване тестування. З чого почати?" (частина 1)
 
Тестируем legacy c++
Тестируем legacy c++Тестируем legacy c++
Тестируем legacy c++
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
 Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва  Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
 
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QA Fest 2019. Андрей Солнцев. Десять причин моей ненавистиQA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
 
Do it yourself profiler
Do it yourself profilerDo it yourself profiler
Do it yourself profiler
 
DevOps guide for awesome quality assurance
DevOps guide for awesome quality assuranceDevOps guide for awesome quality assurance
DevOps guide for awesome quality assurance
 
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfyЧитабельные отчеты для автоматизации на C# / Gallio / BDDfy
Читабельные отчеты для автоматизации на C# / Gallio / BDDfy
 
JavaScript design patterns overview
JavaScript design patterns overview JavaScript design patterns overview
JavaScript design patterns overview
 
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
Как развивать библиотеку компонентов, не ломая ее / Артур Удалов (Mail.Ru Group)
 

More from Dmytro Mindra

Introduction to Value Planning for iHUB
Introduction to Value Planning for iHUBIntroduction to Value Planning for iHUB
Introduction to Value Planning for iHUB
Dmytro Mindra
 
Mastering public speaking skills
Mastering public speaking skillsMastering public speaking skills
Mastering public speaking skills
Dmytro Mindra
 
Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2
Dmytro Mindra
 
Building Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3dBuilding Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3dDmytro Mindra
 
IT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by ExampleIT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by ExampleDmytro Mindra
 
Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012Dmytro Mindra
 
Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012Dmytro Mindra
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript Dmytro Mindra
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptDmytro Mindra
 
Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012Dmytro Mindra
 
Lohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows AzureLohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows AzureDmytro Mindra
 
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Dmytro Mindra
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Dmytro Mindra
 
Lean Software Development
Lean Software DevelopmentLean Software Development
Lean Software DevelopmentDmytro Mindra
 
Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011Dmytro Mindra
 
Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation Dmytro Mindra
 
IT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about DesignIT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about Design
Dmytro Mindra
 
NetWork - 15.10.2011 - Applied code generation in .NET
NetWork - 15.10.2011 - Applied code generation in .NET NetWork - 15.10.2011 - Applied code generation in .NET
NetWork - 15.10.2011 - Applied code generation in .NET Dmytro Mindra
 

More from Dmytro Mindra (20)

Introduction to Value Planning for iHUB
Introduction to Value Planning for iHUBIntroduction to Value Planning for iHUB
Introduction to Value Planning for iHUB
 
Mastering public speaking skills
Mastering public speaking skillsMastering public speaking skills
Mastering public speaking skills
 
Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2Odessa .NET User Group - Kinect v2
Odessa .NET User Group - Kinect v2
 
Building Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3dBuilding Windows Phone 8 Games With Unity3d
Building Windows Phone 8 Games With Unity3d
 
IT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by ExampleIT Brunch - SpecFlow and Gherkin by Example
IT Brunch - SpecFlow and Gherkin by Example
 
Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012Odessa Pluralsight Study Group 28.11.2012
Odessa Pluralsight Study Group 28.11.2012
 
Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012Compilable Specifications - XPDays Ukraine 2012
Compilable Specifications - XPDays Ukraine 2012
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012Lean Lego Game for Agileee 2012
Lean Lego Game for Agileee 2012
 
Lohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows AzureLohika .Net Day - What's new in Windows Azure
Lohika .Net Day - What's new in Windows Azure
 
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012
 
Lean Software Development
Lean Software DevelopmentLean Software Development
Lean Software Development
 
Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011Craftsmanship - XP Days 2011
Craftsmanship - XP Days 2011
 
Agile architecture
Agile architectureAgile architecture
Agile architecture
 
DCI
DCIDCI
DCI
 
Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation Odessa .NET User Group - 10.11.2011 - Applied Code Generation
Odessa .NET User Group - 10.11.2011 - Applied Code Generation
 
IT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about DesignIT Brunch - 12.11.2011 - Myths about Design
IT Brunch - 12.11.2011 - Myths about Design
 
NetWork - 15.10.2011 - Applied code generation in .NET
NetWork - 15.10.2011 - Applied code generation in .NET NetWork - 15.10.2011 - Applied code generation in .NET
NetWork - 15.10.2011 - Applied code generation in .NET
 

Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012

  • 1. Тестируем код с Visual Studio 2012
  • 3. Содержит откровенный код и сцены модульного тестирования. @dmytromindra
  • 4. Test Driven Development @dmytromindra
  • 5. Эффективное модульное тестирование – одна из важнейших составляющих высококачественного кода.
  • 6. Тестировать легаси код сложно, а в некоторых случаях невозможно.
  • 7. Архитектура Visual Studio TeamBuild Command Unit Test Unit Test Line Runner Explorer Activity Visual Studio Unit Test Platform MS-Test MS-Test NUnit xUnit.net QUnit MORE! Managed Native
  • 8. Chutzpah В переводе тот, кто выходит зарамки дозволенного. qunit.d.ts: https://github.com/Diullei/TypeScript-d/blob/master/d.ts/qunit-1.10.0.d.ts jasmine.d.ts: https://gist.github.com/3887505
  • 10. Легаси код @dmytromindra
  • 11. Что такое плохо Это хороший код? bool IsFileEmpty(string file) { var content = File.ReadAllText(file); return content.Length == 0; } А это хороший тест ? void FileExistsTest() { File.Write("foo.txt", ""); var result = IsFileEmpty("foo.txt") Assert.IsTrue(result); } @dmytromindra
  • 12. Код, не поддающийся тестированию. Где он водится? «Лишь бы работало» – Бизнес логика в code-behind – Слишком много зависимостей – Работа с БД перемешана с бизнес логикой. – Свой вариант ... ;) Там, где тестируемость не предусмотрена Там, где тестируемость намеренно исключена Монолитная архитектура @dmytromindra
  • 13. Код, не поддающийся тестированию. Как его узнать? – Сложные процедуры “setup” и “teardown” – Зависимость от состояния среды – Публичные статические методы – Скрытое создание объектов. – Использование замысловатых фреймворков. – Полное отсутствие тестов! @dmytromindra
  • 14. Любая система, где тестирование требует сложной предварительной подготовки или где тесты работают медленно, считается не тестируемой. @dmytromindra
  • 15. Зависимость от среды • Пусть имеется следующий код: public void ThrowIfEndOfTheWorld() { if (DateTime.Now == new DateTime(2012,12,21)) throw new EndOfTheWorldException(); } Как протестировать его надежность ? @dmytromindra
  • 16. Зависимость от среды • Может как-нибудть так? [DllImport("kernel32.dll")] extern static bool SetSystemTime(ref SystemTime time); [TestMethod] public void Y2KTest() { SetSystemTime(2012,12,21,0,0,0); Assert.Throws( () => ThrowIfEndOfTheWorld() ); } @dmytromindra
  • 17. Изолируй Разделяй и властвуй Есть два пути: • Тестируемая архитектура – Уровни абстракции, интерфейсы, инъекция зависимости • Не тестируемая архитектура – Отсутствие уровней абстракции, обилие публичных статических методов, запечатанные типы, и т.д. @dmytromindra
  • 18. Модульное тестирование • Стабы(Stubs) и Моки(Mocks) – Простые в использовании, конкретные реализации для тестирования – Очень похожи, но представляют собой разные подходы http://martinfowler.com/articles/mocksArentStubs.html @dmytromindra
  • 20. Visual Studio 2012 Stubs  Генерируются на этапе компиляции (быстрые)  Используют возможности языка C# (без дополнительных API)  Совместимы по типу (is-a) с интерфейсом @dmytromindra
  • 22. Visual Studio 2012 Shims  Во время выполнения перехватывают вызовы любых .NET методов  Используют профайлер для перенаправления вызовов  “Monkey patching” для .NET @dmytromindra
  • 23. Используйте Shims, если …  Вы работаете с внешними компонентами, которые нельзя изменить  Вы работаете с легаси кодом, обладающим нетестируемой архитектурой @dmytromindra
  • 24. ShimsContext Не используйте общий контекст. Создавайте контекст в каждом тесте отдельно. @dmytromindra
  • 25. Почему стоит побысрее избавиться от Shims?  Они медленные!  Они полагаются на знание внутреннего устройства вашей системы! @dmytromindra
  • 26. Эффективное модульное тестирование – одна из важнейших составляющих высококачественного кода.
  • 27. Тестировать легаси код сложно, но возможно.
  • 29.
  • 30. Спасибо ! @dmytromindra