SlideShare a Scribd company logo
1 of 41
Unit testing best
practices

Oleksandr Masalov
Agenda

• зачем нужны юниттесты?
• unit of coverage/work
• требования к юниттестам и как
не нужно писать тесты
• повторное использование
кода(initialization, asserts)
Зачем нужны юниттесты?
поиск багов? (интеграционные тесты)
регрессионное тестирование?
(интеграционные тесты)
улучшение качества кода(дизайна
компонентов)
поиск багов в случае рефакторинга!
(изменение поведения компонента)
источник спецификации системы
Unit of coverage/work
Return value/exception
Example: Return value/exception
State change
Example: State change
3rd party call
Example: 3rd party call
Требования к юниттестам
Надежные (Trustworthy)

• должны легко запускаться
• failed test == поведение модуля
•

изменилось
тесты независимы друг от друга
Readable

•
•
•
•
•
•

Структура
Именование тестов (self-desciptive)
Именование переменных (self-desciptive)
No IFs, SWITCHs (split test)
1-15 lines
Don't Repeat Yourself & Descriptive And
Meaningful Phrases
Структура
Именование тест методов
Pattern:
UnitOfWork_Input_ExpectedOutput
UnitOfWork_LogicalAction_ExpectedChangeInBehavior
UnitOfWork_ActionOrInput_ExpectedCallToThirdParty
Examples:
Addition_PositiveNumbers_ReturnsSum()
Addition_WhenCalled_ResetsTheNextSum()
Addition_NegativeNumbers_CallsLogger()
Именование тест методов - 2
Поддерживаемые (Maintainable)

• Тестируйте только public интерфейс
• Не используйте объекты, которые
•
•
•

непостоянны(DateTime.Now, Thread,
Random etc)
Не дублируйте продакшин логику
Не тестируйте всё в одном тесте
Многократно используйте код для
тестов(initialize, assert etc)
Не используйте объекты, которые
непостоянны
DateTime.Now, Thread, Random etc
Не дублируйте продакшин логику
Не тестируйте всё в одном тесте
сложно именовать
тест не отображает полной картины

•
•
Структурируйте тесты!

• Arrange, Act, Assert
• Four-Phase Test
• Given/When/Then
Arrange, Act, Assert - format
if(test.lines <= 3)
{
без форматирования
}else if (test.lines > 3 && !test.hasSubSections)
{
blank line разделитель
}
else{
code comment(Arrange, Act, Assert)
}
Four-Phase Test
Given/When/Then
Code reuse - Initialization problem
Test data initialization:
Object Mother pattern
Test Data builder pattern

•
•

SUT initialization:
SUT Mother pattern
SUT Builder pattern
Auto-Mocking container

•
•
•
Object Mother Pattern
var basket = CreateWithDiscount();
var basket = CreateWithSmallDiscount();
var basket = CreateWithLargeDiscount();
var basket =
CreateWithLargeDiscountButWithSpecialOffer();
…
Fluent Builder Pattern
var basket = new BasketBuilder().Build();
var basket = new
BasketBuilder().WithSmallDiscount().Build();
var basket = new BasketBuilder()
.WithLargeDiscount()
.WithSpecialOffer()
.Build();
…
Example: Test Data Builder
SUT Mother
SUT Builder
Auto-Mocking container pattern
Code reuse - Asserts problem
Object types

• Entities - Identity(long lived Id)
 Customers
 Products

• Value Objects - Identity(Value)
 Money(currency

+ amount)

• Services - Identity(by default reference)
Value Objects (Override Equals + GetHashCode)
Test-specific equality

• Comparer
 concrete

IEqualityComparer
• Resemblance(for non-sealed classes)
• Likeness(SemanticComparison)
Comparer
Resemblance (partially comparison)
Order присваевает id продукту
Example: Resemblance
Likeness (convension based
comparison)
Q&A

More Related Content

What's hot

3 лекция. презентация
3 лекция. презентация3 лекция. презентация
3 лекция. презентацияvyacheslavmaslov
 
QA и тестирование игр
QA и тестирование игрQA и тестирование игр
QA и тестирование игрViktoria Odnokoz
 
2.1 Тестирование: основные определения
2.1 Тестирование: основные определения2.1 Тестирование: основные определения
2.1 Тестирование: основные определенияNatalia Odegova
 
Тестирование Требований
Тестирование ТребованийТестирование Требований
Тестирование ТребованийIT Mine
 
Управление конфигурациями и артефакты тестирования
Управление конфигурациями и артефакты тестированияУправление конфигурациями и артефакты тестирования
Управление конфигурациями и артефакты тестированияSQALab
 
Тестирование ПО
Тестирование ПОТестирование ПО
Тестирование ПОseleznev_stas
 
Reporting error
Reporting errorReporting error
Reporting errorQA Guards
 
Тестирование требований
Тестирование требованийТестирование требований
Тестирование требованийNickola14
 
[JAM 1.1] Testing not for Fun (Evgeny Kaziak)
[JAM 1.1] Testing not for Fun (Evgeny Kaziak)[JAM 1.1] Testing not for Fun (Evgeny Kaziak)
[JAM 1.1] Testing not for Fun (Evgeny Kaziak)Evgeny Kaziak
 
Software testing foundations_ilya_pluzhnikov
Software testing foundations_ilya_pluzhnikovSoftware testing foundations_ilya_pluzhnikov
Software testing foundations_ilya_pluzhnikovElya Pluzhnikov
 
Fundamental test process
Fundamental test processFundamental test process
Fundamental test processQA Guards
 
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
 
Александр Александров -- Надёжный тест-дизайн (мастер-класс)
Александр Александров -- Надёжный тест-дизайн (мастер-класс)Александр Александров -- Надёжный тест-дизайн (мастер-класс)
Александр Александров -- Надёжный тест-дизайн (мастер-класс)sqadays8
 

What's hot (20)

лекция3 QA
лекция3 QAлекция3 QA
лекция3 QA
 
QA Лекция2
QA Лекция2QA Лекция2
QA Лекция2
 
3 лекция. презентация
3 лекция. презентация3 лекция. презентация
3 лекция. презентация
 
QA и тестирование игр
QA и тестирование игрQA и тестирование игр
QA и тестирование игр
 
2.1 Тестирование: основные определения
2.1 Тестирование: основные определения2.1 Тестирование: основные определения
2.1 Тестирование: основные определения
 
Test types
Test typesTest types
Test types
 
Test levels
Test levelsTest levels
Test levels
 
Тестирование Требований
Тестирование ТребованийТестирование Требований
Тестирование Требований
 
Управление конфигурациями и артефакты тестирования
Управление конфигурациями и артефакты тестированияУправление конфигурациями и артефакты тестирования
Управление конфигурациями и артефакты тестирования
 
Тестирование ПО
Тестирование ПОТестирование ПО
Тестирование ПО
 
Reporting error
Reporting errorReporting error
Reporting error
 
Тестирование требований
Тестирование требованийТестирование требований
Тестирование требований
 
[JAM 1.1] Testing not for Fun (Evgeny Kaziak)
[JAM 1.1] Testing not for Fun (Evgeny Kaziak)[JAM 1.1] Testing not for Fun (Evgeny Kaziak)
[JAM 1.1] Testing not for Fun (Evgeny Kaziak)
 
05ka-nov
05ka-nov05ka-nov
05ka-nov
 
02ka-nov
02ka-nov02ka-nov
02ka-nov
 
Software testing foundations_ilya_pluzhnikov
Software testing foundations_ilya_pluzhnikovSoftware testing foundations_ilya_pluzhnikov
Software testing foundations_ilya_pluzhnikov
 
План тестирования
План тестированияПлан тестирования
План тестирования
 
Fundamental test process
Fundamental test processFundamental test process
Fundamental test process
 
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
 
Александр Александров -- Надёжный тест-дизайн (мастер-класс)
Александр Александров -- Надёжный тест-дизайн (мастер-класс)Александр Александров -- Надёжный тест-дизайн (мастер-класс)
Александр Александров -- Надёжный тест-дизайн (мастер-класс)
 

Viewers also liked

London Atlassian User Group - February 2014
London Atlassian User Group - February 2014London Atlassian User Group - February 2014
London Atlassian User Group - February 2014Steve Smith
 
Understanding git: Voxxed Vienna 2016
Understanding git: Voxxed Vienna 2016Understanding git: Voxxed Vienna 2016
Understanding git: Voxxed Vienna 2016Steve Smith
 
Continuous talk, AnsibleFest London 2016
Continuous talk, AnsibleFest London 2016Continuous talk, AnsibleFest London 2016
Continuous talk, AnsibleFest London 2016Steve Smith
 
AtlasCamp 2015 Docker continuous integration training
AtlasCamp 2015 Docker continuous integration trainingAtlasCamp 2015 Docker continuous integration training
AtlasCamp 2015 Docker continuous integration trainingSteve Smith
 
Continuous integration using atlassian bamboo
Continuous integration using atlassian bambooContinuous integration using atlassian bamboo
Continuous integration using atlassian bambooAlexander Masalov
 
Using CI for continuous delivery Part 1
Using CI for continuous delivery Part 1Using CI for continuous delivery Part 1
Using CI for continuous delivery Part 1Vishal Biyani
 
Dockercon2015 bamboo
Dockercon2015 bambooDockercon2015 bamboo
Dockercon2015 bambooSteve Smith
 
Bamboo - an introduction
Bamboo - an introductionBamboo - an introduction
Bamboo - an introductionSven Peters
 
Game of Codes: the Battle for CI
Game of Codes: the Battle for CIGame of Codes: the Battle for CI
Game of Codes: the Battle for CIAtlassian
 

Viewers also liked (9)

London Atlassian User Group - February 2014
London Atlassian User Group - February 2014London Atlassian User Group - February 2014
London Atlassian User Group - February 2014
 
Understanding git: Voxxed Vienna 2016
Understanding git: Voxxed Vienna 2016Understanding git: Voxxed Vienna 2016
Understanding git: Voxxed Vienna 2016
 
Continuous talk, AnsibleFest London 2016
Continuous talk, AnsibleFest London 2016Continuous talk, AnsibleFest London 2016
Continuous talk, AnsibleFest London 2016
 
AtlasCamp 2015 Docker continuous integration training
AtlasCamp 2015 Docker continuous integration trainingAtlasCamp 2015 Docker continuous integration training
AtlasCamp 2015 Docker continuous integration training
 
Continuous integration using atlassian bamboo
Continuous integration using atlassian bambooContinuous integration using atlassian bamboo
Continuous integration using atlassian bamboo
 
Using CI for continuous delivery Part 1
Using CI for continuous delivery Part 1Using CI for continuous delivery Part 1
Using CI for continuous delivery Part 1
 
Dockercon2015 bamboo
Dockercon2015 bambooDockercon2015 bamboo
Dockercon2015 bamboo
 
Bamboo - an introduction
Bamboo - an introductionBamboo - an introduction
Bamboo - an introduction
 
Game of Codes: the Battle for CI
Game of Codes: the Battle for CIGame of Codes: the Battle for CI
Game of Codes: the Battle for CI
 

Similar to Unit testing best practices

Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестированииМетод No-Tests-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестированииDeutsche Post
 
JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1sgdread
 
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестированииМетод No-Test-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестированииSQALab
 
Андрей Сильчук: "Автоматическое тестирование".
Андрей Сильчук: "Автоматическое тестирование".Андрей Сильчук: "Автоматическое тестирование".
Андрей Сильчук: "Автоматическое тестирование".Hub-IT-School
 
Автоматическое тестирование и с чем его едят
Автоматическое тестирование и с чем его едятАвтоматическое тестирование и с чем его едят
Автоматическое тестирование и с чем его едятMarina Peregud
 
2.3 Тестирование: процесс, роли, артефакты
2.3 Тестирование: процесс, роли, артефакты2.3 Тестирование: процесс, роли, артефакты
2.3 Тестирование: процесс, роли, артефактыNatalia Odegova
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgIT61
 
Автотесты и образ мышления
Автотесты и образ мышленияАвтотесты и образ мышления
Автотесты и образ мышленияAndrei Zubov
 
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOSРоман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOSProvectus
 
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...Mail.ru Group
 
доклад на SQADays 2011 в Казани
доклад на SQADays  2011 в Казанидоклад на SQADays  2011 в Казани
доклад на SQADays 2011 в Казаниmargo-qa
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsAnton Vidishchev
 
Тестирование осень 2013 лекция 4
Тестирование осень 2013 лекция 4Тестирование осень 2013 лекция 4
Тестирование осень 2013 лекция 4Technopark
 
лившиц владимир - независимое тестирование миф
лившиц владимир - независимое тестирование мифлившиц владимир - независимое тестирование миф
лившиц владимир - независимое тестирование мифMagneta AI
 
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...SQALab
 
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Maksim Grinevich
 

Similar to Unit testing best practices (20)

Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестированииМетод No-Tests-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Tests-Cases: избавьтесь от тест-кейсов в тестировании
 
JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1
 
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестированииМетод No-Test-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестировании
 
Андрей Сильчук: "Автоматическое тестирование".
Андрей Сильчук: "Автоматическое тестирование".Андрей Сильчук: "Автоматическое тестирование".
Андрей Сильчук: "Автоматическое тестирование".
 
Автоматическое тестирование и с чем его едят
Автоматическое тестирование и с чем его едятАвтоматическое тестирование и с чем его едят
Автоматическое тестирование и с чем его едят
 
Unit tests
Unit testsUnit tests
Unit tests
 
2.3 Тестирование: процесс, роли, артефакты
2.3 Тестирование: процесс, роли, артефакты2.3 Тестирование: процесс, роли, артефакты
2.3 Тестирование: процесс, роли, артефакты
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
 
Unit тесты java
Unit тесты javaUnit тесты java
Unit тесты java
 
Автотесты и образ мышления
Автотесты и образ мышленияАвтотесты и образ мышления
Автотесты и образ мышления
 
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOSРоман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
 
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
 
Testing
TestingTesting
Testing
 
доклад на SQADays 2011 в Казани
доклад на SQADays  2011 в Казанидоклад на SQADays  2011 в Казани
доклад на SQADays 2011 в Казани
 
Test Driven Development in .NET Applications
Test Driven Development in .NET ApplicationsTest Driven Development in .NET Applications
Test Driven Development in .NET Applications
 
Тестирование осень 2013 лекция 4
Тестирование осень 2013 лекция 4Тестирование осень 2013 лекция 4
Тестирование осень 2013 лекция 4
 
Test design print
Test design printTest design print
Test design print
 
лившиц владимир - независимое тестирование миф
лившиц владимир - независимое тестирование мифлившиц владимир - независимое тестирование миф
лившиц владимир - независимое тестирование миф
 
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
 
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
Промышленный подход к автоматизации тестирования или Keyword-driven testing в...
 

Unit testing best practices

Editor's Notes

  1. - Make each test orthogonal (i.e., independent) to all the others - Don’t make unnecessary assertions - Mock out all external services and state - Avoid unnecessary preconditions - Don’t unit-test configuration settings - Name your unit tests clearly and consistently Trust worthy - Make it easy to run - Avoid test logic - Don&apos;t repeat production logic - Dont&apos;t use things that keeps changing Maintanable - Test only publics! Avoid testing private/protected memebers (makes your tests more brittle) - Re-use test code: - Create objects using common methods - Enforce test isolation - No dependency between tests - Don&apos;t run a test from another test - - Test one thing - Avoid multiple asserts on diffrerent objects - Create multiple tests - Hard to name - - one mock per test Readable tests: - project structure - No magic values - Naming a unit tests - Naming variables - separate assert from action - test structure - Use test cases
  2. Describes a collection of methods that can create test data objects according to different scenarios