30
Тестируем код с Visual Studio 2012

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

Embed Size (px)

DESCRIPTION

 

Citation preview

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

Тестируем код с Visual Studio 2012

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

@dmytromindra

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

@dmytromindra

Содержит откровенный код и сцены модульного тестирования.

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

@dmytromindra

Test Driven Development

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

Эффективное модульное тестирование – одна из

важнейших составляющих высококачественного кода.

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

Тестировать легаси код сложно, а в некоторых случаях невозможно.

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

Архитектура

Visual Studio Unit Test Explorer

Command Line Runner

TeamBuild Unit Test Activity

Visual Studio Unit Test Platform

MS-Test Managed

MS-Test Native NUnit xUnit.net QUnit MORE!

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

Approval Tests

http://approvaltests.sourceforge.net/

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

@dmytromindra

Легаси код

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

@dmytromindra

void FileExistsTest() { File.Write("foo.txt", ""); var result = IsFileEmpty("foo.txt") Assert.IsTrue(result); }

bool IsFileEmpty(string file) { var content = File.ReadAllText(file); return content.Length == 0; }

А это хороший тест ?

Это хороший код?

Что такое плохо

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

@dmytromindra

Код, не поддающийся тестированию.

Где он водится?

«Лишь бы работало» – Бизнес логика в code-behind – Слишком много зависимостей – Работа с БД перемешана с бизнес логикой. – Свой вариант ... ;)

Там, где тестируемость не предусмотрена Там, где тестируемость намеренно исключена Монолитная архитектура

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

@dmytromindra

Код, не поддающийся тестированию.

Как его узнать?

– Сложные процедуры “setup” и “teardown”

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

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

@dmytromindra

Любая система, где тестирование требует сложной предварительной

подготовки или где тесты работают

медленно, считается не тестируемой.

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

@dmytromindra

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

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

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

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

@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() ); }

• Может как-нибудть так?

Зависимость от среды

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

@dmytromindra

Разделяй и властвуй

Есть два пути: • Тестируемая архитектура

– Уровни абстракции, интерфейсы, инъекция зависимости

• Не тестируемая архитектура – Отсутствие уровней абстракции, обилие

публичных статических методов, запечатанные типы, и т.д.

Изолируй

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

@dmytromindra

Модульное тестирование

• Стабы(Stubs) и Моки(Mocks) – Простые в использовании, конкретные

реализации для тестирования – Очень похожи, но представляют собой

разные подходы http://martinfowler.com/articles/mocksArentStubs.html

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

VISUAL STUDIO 2012 STUBS

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

@dmytromindra

Visual Studio 2012 Stubs

Генерируются на этапе компиляции (быстрые)

Используют возможности языка C# (без дополнительных API)

Совместимы по типу (is-a) с интерфейсом

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

VISUAL STUDIO 2012 SHIMS

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

@dmytromindra

Visual Studio 2012 Shims

Во время выполнения перехватывают вызовы любых .NET методов

Используют профайлер для перенаправления вызовов

“Monkey patching” для .NET

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

@dmytromindra

Используйте Shims, если …

Вы работаете с внешними компонентами, которые нельзя изменить

Вы работаете с легаси кодом, обладающим нетестируемой архитектурой

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

@dmytromindra

ShimsContext

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

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

@dmytromindra

Почему стоит побысрее избавиться от Shims?

Они медленные!

Они полагаются на знание внутреннего устройства вашей системы!

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

Эффективное модульное тестирование – одна из

важнейших составляющих высококачественного кода.

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

Тестировать легаси код сложно, но возможно.

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

Помните! Использование тестов может улучшить архитектуру

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

@dmytromindra

Спасибо !