Тестирование бизнес-логики в .NET

Содержание

Слайд 2

Тестирование бизнес-логики в .NET Швец Сергей, директор по ИТ, ManageBand

Тестирование бизнес-логики в .NET

Швец Сергей,
директор по ИТ,
ManageBand

Слайд 3

О себе 9 лет в профессиональной разработке: PHP, Python, Ruby Любимый

О себе

9 лет в профессиональной разработке:
PHP, Python, Ruby
Любимый и основной

язык C#
Немного занимался машинным обучением
Текущие интересы: архитектура ПО, маркетинг, продажи, бережливый стартап
Слайд 4

Зачем нужны тесты? Выявление регрессий Новый функционал Рефакторинг Документация TDD (Test

Зачем нужны тесты?

Выявление регрессий
Новый функционал
Рефакторинг
Документация
TDD (Test Driven Development)

1

2

3

4

5

Слайд 5

Препятствия Большие инвестиции времени и сил Нужно подстраивать код под тесты

Препятствия

Большие инвестиции времени и сил
Нужно подстраивать код под тесты
Тесты нужно поддерживать
Сроки
Лень

1

2

3

4

5

Слайд 6

Case1. Задача: Обработка телеметрии от оборудования Windows-сервис (автономность) Трудно понять, что

Case1.

Задача:

Обработка телеметрии от оборудования
Windows-сервис (автономность) Трудно понять, что произошла ошибка Высокая ответственность
SqlServer, Postgresql C#,

Linq2Db

Особенности:

Инструменты:

Слайд 7

Работа с БД через ORM Невозможно протестировать логику

Работа с БД через ORM
Невозможно протестировать логику

Слайд 8

Абстракция вместо реальной базы Business Logic База данных > IDataSource RealDataSource TestDataSource

Абстракция вместо реальной базы

Business Logic

База данных

<>
IDataSource

RealDataSource

TestDataSource

Слайд 9

Источник данных стал абстрактным (его можно подменить в тестах) Полностью протестирован

Источник данных стал абстрактным (его можно подменить в тестах)
Полностью протестирован MessageProcessor

(15-20 зеленых тестов)
Можно выкладывать в production
Слайд 10

1. Изменилась схема данных Ошибка:

1. Изменилась схема данных

Ошибка:

Слайд 11

1. Изменилась схема данных Ошибка: 2. Ошибка при построении конфигурации (NRE)

1. Изменилась схема данных

Ошибка:

2. Ошибка при построении конфигурации (NRE)

Слайд 12

1. Изменилась схема данных Ошибка: 2. Ошибка при построении конфигурации (NRE)

1. Изменилась схема данных

Ошибка:

2. Ошибка при построении конфигурации (NRE)

3. Ошибка при

вставке данных (внешний ключ)
Слайд 13

1. Изменилась схема данных Ошибка: 2. Ошибка при построении конфигурации (NRE)

1. Изменилась схема данных

Ошибка:

2. Ошибка при построении конфигурации (NRE)

3. Ошибка при

вставке данных (внешний ключ)

4. Ошибка при вставке данных (ограничение столбца)

Слайд 14

+ Чисто и красиво Быстро работают Минусы Плюсы + Не протестирован

+

Чисто и красиво
Быстро работают

Минусы

Плюсы

+

Не протестирован DataSource
Нужно подстраивать код под тесты
Не протестировать

SQL запросы
Не проверить особенности БД (ключи, ограничения, триггеры)
Трудоемко реализовывать TestDataSource

-

-

-

-

-

Слайд 15

Опрос. Есть ли тесты в бизнес-логике? Нет Нет Да (но нет

Опрос. Есть ли тесты в бизнес-логике?

Нет
Нет
Да (но нет БД)

*

выборка не репрезентативна

C#

Да
Да

PHP

Да

Python

Слайд 16

Опрос. Есть ли тесты в бизнес-логике? Нет Нет Да (но нет

Опрос. Есть ли тесты в бизнес-логике?

Нет
Нет
Да (но нет БД)

*

выборка не репрезентативна

C#

Да
Да

PHP

Да

Python

Слайд 17

Тестовая база Business Logic База данных ТЕСТОВАЯ База данных Настоящие таблицы,

Тестовая база

Business Logic

База данных

ТЕСТОВАЯ
База данных

Настоящие таблицы, триггеры, ограничения
Очищается перед каждым

тестом
Загружаются общие данные (фикстуры)
В базе формируется сценарий
В базе проверяется результат
Слайд 18

Case2. Задача: Офлайн расчет остатков товара на планшете Очень много не

Case2.

Задача:

Офлайн расчет остатков товара на планшете
Очень много не очевидной логики Рефакторинг (уже

запущено и работает) Работает в офлайн (сложно поймать ошибку и доставить обновление)
SQLite C#, Xamarin.IOS, очень простая ORM

Особенности:

Инструменты:

Слайд 19

Решение 0. DbTest 1. Фикстуры 2. TestBuilder Актуализирует структуру БД Очищает

Решение

0. DbTest

1. Фикстуры

2. TestBuilder

Актуализирует структуру БД Очищает перед каждым тестом Заливает фикстуры

Данные, которые

не влияют на тесты, но без них не собрать тестовый сценарий

Помогает собрать тестовый сценарий в базе данных

nuget

Слайд 20

Фикстуры

Фикстуры

Слайд 21

Фикстуры

Фикстуры

Слайд 22

Тесты

Тесты

Слайд 23

Тесты ARRANGE Поступление Отгрузка

Тесты

ARRANGE Поступление Отгрузка

Слайд 24

Тесты ACT Тестируемый метод

Тесты

ACT Тестируемый метод

Слайд 25

Тесты ASSERT Проверка результатов

Тесты

ASSERT Проверка результатов

Слайд 26

+ Малые трудозатраты на тесты Тестирование настоящей базы (SQL запросы, тригеры,

+

Малые трудозатраты на тесты
Тестирование настоящей базы (SQL запросы, тригеры, ограничения)
Можно тестировать

legacy-код без его модификации
Универсальность подхода – любая база, любая ORM

Минусы

Плюсы

+

Работает медленнее (300ms vs 3ms на один тест)

-

+

+

Слайд 27

@justserega https://github.com/justserega/DbTest Install-Package DbTest Install-Package DbTest.EF6 Install-Package DbTest.EFCore Ссылки

@justserega
https://github.com/justserega/DbTest
Install-Package DbTest Install-Package DbTest.EF6 Install-Package DbTest.EFCore

Ссылки

Слайд 28

goo.gl/LRwjPo

 goo.gl/LRwjPo