Автоматическое тестирование via C# и JS

Содержание

Слайд 2

Зачем писать автоматические тесты? Удостовериться, что код работает А также, что

Зачем писать автоматические тесты?

Удостовериться, что код работает
А также, что он продолжает

работать после очередных изменений
При ручном тестировании тестировщик может забыть проверить один или несколько тест кейсов
Тесты - всегда актуальная документация на код для разработчиков
Удобный подход для знакомства с новой библиотекой
Слайд 3

Первый тест C# NUnit JS Mocha

Первый тест

C# NUnit

JS Mocha

Слайд 4

Результаты теста

Результаты теста

Слайд 5

Результаты теста

Результаты теста

Слайд 6

Результаты теста

Результаты теста

Слайд 7

Тесты как спецификация Что тестируем (SUT System Under Tests) Что ожидаем

Тесты как спецификация

Что тестируем (SUT System Under Tests)
Что ожидаем (expectation)
(Опционально) При

каких условиях (test conditions)
Слайд 8

Тесты как спецификация Что тестируем (SUT System Under Tests) Что ожидаем

Тесты как спецификация

Что тестируем (SUT System Under Tests)
Что ожидаем (expectation)
(Опционально) При

каких условиях (test conditions)
Как достичь?
Правильное именование тестов
Группировка тестов
Слайд 9

Тесты как спецификация Calculator Specification Add Should add given number to

Тесты как спецификация

Calculator Specification
Add
Should add given number to accumulated value
Should fail

if accumulated value overflow
Sum
Should return 0 by default

System under test
Expectation
Conditions

Слайд 10

Тесты как спецификация Calculator Specification Add Should add given number to

Тесты как спецификация

Calculator Specification
Add
Should add given number to accumulated value
Should fail

if accumulated value overflow
Sum
Should return 0 by default

System under test
Expectation
Conditions

Слайд 11

C# реализация

C# реализация

Слайд 12

JS реализация

JS реализация

Слайд 13

Результаты тестов

Результаты тестов

Слайд 14

Результаты тестов

Результаты тестов

Слайд 15

Структура теста. AAA Подготовка (Arrange) Действие (Act) Проверка (Assert)

Структура теста. AAA

Подготовка (Arrange)
Действие (Act)
Проверка (Assert)

Слайд 16

Возможные ошибки

Возможные ошибки

Слайд 17

Возможные ошибки

Возможные ошибки

Слайд 18

Возможные ошибки Тест работает только на машине разработчика System.IO.DirectoryNotFoundException : Не

Возможные ошибки

Тест работает только на машине разработчика
System.IO.DirectoryNotFoundException : Не удалось найти

часть пути "c:\my\local\path\file.txt".

???

Слайд 19

Возможные ошибки

Возможные ошибки

Слайд 20

Возможные ошибки Тест ничего не проверяет. Перманентно зеленый. Даже если изменится

Возможные ошибки

Тест ничего не проверяет. Перманентно зеленый. Даже если изменится значимое

содержимое файла, тест будет проходить

???

Слайд 21

Возможные ошибки

Возможные ошибки

Слайд 22

Тест проверяет слишком много Expected: True But was: False ??? Тест

Тест проверяет слишком много

Expected: True
But was: False

???

Тест проверяет слишком много. Нет

единой точки отказа
Слайд 23

Устраняем дублирование Параметризованные тесты (Data Driven Tests) Выделение общей фазы Arrange,

Устраняем дублирование

Параметризованные тесты (Data Driven Tests)
Выделение общей фазы Arrange, а также

фазы сборки ресурсов после теста
Слайд 24

Data Driven Tests C#

Data Driven Tests C#

Слайд 25

Data Driven Tests C#

Data Driven Tests C#

Слайд 26

Data Driven Tests C#

Data Driven Tests C#

Слайд 27

Data Driven Tests C#

Data Driven Tests C#

Слайд 28

Data Driven Tests JS

Data Driven Tests JS

Слайд 29

Data Driven Tests JS

Data Driven Tests JS

Слайд 30

Настройка окружения Выполнить что либо перед запуском всех тестов SUT Выполнить

Настройка окружения

Выполнить что либо перед запуском всех тестов SUT
Выполнить что либо

перед запуском каждого теста SUT
Выполнить что либо после запуска каждого теста в SUT
Выполнить что либо после запуска всех тестов в SUT
Слайд 31

Настройка окружения C#

Настройка окружения C#

Слайд 32

Настройка окружения C# OneTimeSetUp SetUp test1 TearDown SetUp test2 TearDown OneTimeTearDown

Настройка окружения C#

OneTimeSetUp
SetUp
test1
TearDown
SetUp
test2
TearDown
OneTimeTearDown

Слайд 33

Настройка окружения JS

Настройка окружения JS

Слайд 34

Настройка окружения JS before beforeEach test1 afterEach beforeEach test2 afterEach after

Настройка окружения JS

before
beforeEach
test1
afterEach
beforeEach
test2
afterEach
after

Слайд 35

Делаем тесты читабельнее C# FluentAssertions http://fluentassertions.com (2 + 2).Should().Be(4); array.Should().HaveCount(3); complexObject.ShouldBeEquivalentTo(anotherObject);

Делаем тесты читабельнее

C# FluentAssertions http://fluentassertions.com
(2 + 2).Should().Be(4);
array.Should().HaveCount(3);
complexObject.ShouldBeEquivalentTo(anotherObject);
JS Chai http://chaijs.com
(2+2).should.be.equal(2);
[1,2,3].should.to.have.lengthOf(3)
complexObject.should.be.to.deep.equal(anotherObject);

Слайд 36

Test Driven Development Не всегда после написания кода его легко протестировать.

Test Driven Development

Не всегда после написания кода его легко протестировать.
Не всегда

после написания кода, при тестировании, учитывают все юзкейсы
Не всегда после написания кода вспоминают написать тесты.
Слайд 37

Test Driven Development Не всегда после написания кода его легко протестировать.

Test Driven Development

Не всегда после написания кода его легко протестировать.
Не всегда

после написания кода, при тестировании, учитывают все юзкейсы
Не всегда после написания кода вспоминают написать тесты.
Решение: Писать тесты параллельно с кодом
Тест (кода нет, тест красный)
Минимальный код, чтобы тест стал зеленым
Рефакторинг
Goto 1
Слайд 38

Test Driven Development Не всегда после написания кода его легко протестировать.

Test Driven Development

Не всегда после написания кода его легко протестировать.
Не всегда

после написания кода, при тестировании, учитывают все юзкейсы
Не всегда после написания кода вспоминают написать тесты.
Решение: Писать тесты параллельно с кодом
Тест (кода нет, тест красный)
Минимальный код, чтобы тест стал зеленым
Рефакторинг
Goto 1
Опасность: Написать тест, который реализовать нетривиально (больше 2-5 минут). Реализация должна быть очевидной. Начинать нужно с простейших тестов и двигаться от простого к сложному
Слайд 39

Test Driven Development Плюсы: Код делает только то, что нужно и

Test Driven Development

Плюсы:
Код делает только то, что нужно и делает это

правильно
~100% покрытие тестами
Упрощает решение сложных задач
Минусы:
Увеличивает время разработки
Далеко не всегда удается соблюдать все формальности
Мешает полету мысли
Слайд 40

Test Driven Development Наилучшие Use Cases: Сложная задача Исправление бага (сначала

Test Driven Development

Наилучшие Use Cases:
Сложная задача
Исправление бага (сначала нужно показать, что

баг был(тест красный), а потом, что он исправлен (тест зеленый))
Парная разработка
Слайд 41

Практика. Игра жизнь Правила: Дано клеточное поле размера N на M

Практика. Игра жизнь

Правила:
Дано клеточное поле размера N на M с заданной

конфигурацией клеток. Каждая клетка может быть живой или мертвой. Поле замкнуто (зациклено).
Производится серия ходов.
На каждом ходе клетка меняет свое состояние в соответствии со следующими правилами:
Клетка живая:
если клетка имеет 2 или 3 живых соседа, то клетка остается жить,
иначе умирает
Клетка мертвая:
если клетка имеет ровно три живых соседа, она оживает
иначе остается мертвой

Обязательные требования:
На каждое правило игры должен быть тест
Тесты должны быть читабельные и правильно именованные
Необязательные требования:
Попрактиковаться в TDD. Сначала тест, потом реализация
PingPong. Один человек пишет тест, второй заставляет его проходить и пишет следующий тест. И так до конца
Постараться избавиться от дублирования в тестах

https://github.com/Panya911/testing-via-cs-and-js

Слайд 42

Итоги Тесты - хорошо Доверие к работоспособности Легкость изменения (быстрая обратная

Итоги

Тесты - хорошо
Доверие к работоспособности
Легкость изменения (быстрая обратная связь о

том, что что-то сломалось)
Сокращает время разработки в перспективе (смотри пункт выше)
Читаемые тесты - еще лучше
Доверие к тестам
Тесты как спецификация
TDD - прекрасно
Упрощает разработку сложных задач
Система делает то, что заявлено, и только это
~ 100% покрытие тестами