Unit testing iOS Applications

Andrey Volobuev
Andrey VolobueviOS Developer um SMS DV LLC
Unit тестирование iOS приложений
Андрей Волобуев
Что такое unit тесты
Для чего тестировать
Когда тестировать
Виды unit тестов
Двойники для тестов
Управление зависимостями
Лучшие практики
Тезисы
Что такое unit тесты ?
Модульное тестирование, или юнит-тестирование (англ.
unit testing) — процесс в программировании, позволяющий
проверить на корректность отдельные модули исходного
кода программы.
Википедия
Что такое unit тесты ?
Класс Тест класс
Метод 1
Метод 2
Тест метод 1.2
Тест метод 2.1
Тест метод 1.1
.
.
.
Для чего тестировать ?
Уверенность в корректности работы программы
Возможность рефакторинга
Исполняемая документация
Исполняемые требования
Работа с CI системами
Доказательство что баг исправлен
Когда тестировать ?
TDD - сначала пишется тест
Refactor
Red
Green
Когда тестировать ?
Обычное тестирование - тесты пишутся после кода
Когда тестировать
Вопрос в том насколько после
Виды unit тестов
Возвращаемый результат
Состояние
Поведение
Двойники для тестов
Клиент Официант Повар
Ресторан
Двойники для тестов
Клиент Официант Тест повар
Ресторан
Двойники для тестов
Stub - возвращают заранее предопределенный результат
Mock - содержат логику для проверки поведения
Управление зависимостями
Dependency injection
// Менеджер ресторана должен сказать нам какой стол свободен
struct Manager{
// Он обращается к сервису реализующему протокол
var tablesService: FreeTableProvider
func getFreeTable() -> Int{
let tableId = tablesService.getTable()
return tableId
}
// Constructor injection
init(tablesService: FreeTableProvider = ProductionTableProvider()){
self.tablesService = tablesService
}
}
// Протокол для сервиса
protocol FreeTableProvider{
func getTable() -> Int
}
struct ProductionTableProvider: FreeTableProvider{
func getTable() -> Int {
let tableId = makeLongRunningRequestAndReturnTable()
return tableId
}
private func makeLongRunningRequestAndReturnTable() -> Int { . . . }
}
class StubFreeTableProvider: FreeTableProvider{
func getTable() -> Int { return 42 }
}
class ManagerTests: XCTestCase {
override func setUp() {
super.setUp()
}
override func tearDown() {
super.tearDown()
}
func testManagerRetunsFreeTable(){
let stubFreeTableProvider = StubFreeTableProvider()
let manager = Manager(tablesService: stubFreeTableProvider)
let tableId = manager.getFreeTable()
XCTAssertEqual(tableId, 42, "Менеджер возвращает столик полученный от сервиса")
}
}
protocol OrderExecutor{
func executeOrder()
}
// Теперь мы тестируем внутреннее состояние официанта
struct Waiter{
// Столик с которым работает официант
var currentTableId: Int?
var cook: OrderExecutor
func excecuteOrder(){
cook.executeOrder()
}
// Функция позвать официанта к столику
mutating func call(toTable tableId: Int){
currentTableId = tableId
}
init(orderExecutor: OrderExecutor){
self.cook = orderExecutor
}
}
class WaiterUnitTests: XCTestCase {
override func setUp() {
super.setUp()
}
override func tearDown() {
super.tearDown()
}
func testWaiterServesTableAfterCalling(){
var waiter = Waiter()
let tableId = 42
waiter.call(toTable: tableId)
XCTAssertEqual(tableId, waiter.currentTableId, "Официанта приходит к столику")
}
}
// Тот кто реализует этот протокол может исполнять заказы
protocol OrderExecutor{
func executeOrder()
}
// Теперь поведение официанта
struct Waiter{
var currentTableId: Int?
// Тот кто реализует этот протокол может исполнять заказы
var cook: OrderExecutor
// Функция передать заказ повару
func excecuteOrder(){
cook.executeOrder()
}
mutating func call(toTable tableId: Int){
currentTableId = tableId
}
// Constructor injection
init(orderExecutor: OrderExecutor = ProductionOrderExecutor()){
self.cook = orderExecutor
}
}
class MockCook: OrderExecutor{
var isOrederExecuted = false
func executeOrder() {
isOrederExecuted = true
}
}
class WaiterUnitTests: XCTestCase {
func testWaiterGivesOrderToCook(){
let mockCook = MockCook()
let waiter = Waiter(orderExecutor: mockCook)
waiter.excecuteOrder()
XCTAssertTrue(mockCook.isOrederExecuted, "Официант отдал заказ повару”)
}
}
Лучшие практики
DRY
if, switch, for, while
Сложные setUp
Вычисляемые ожидаемые значения
Много assert на тест
Мало тестов
Много тестов
ВОПРОСЫ?
1 von 21

Recomendados

Victor Kuliamin.CSEDays von
Victor Kuliamin.CSEDaysVictor Kuliamin.CSEDays
Victor Kuliamin.CSEDaysLiloSEA
444 views69 Folien
Unit test быстрый старт von
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый стартAntonio
1.5K views23 Folien
Rambler.iOS #3: Test-Driven Development в iOS von
Rambler.iOS #3: Test-Driven Development в iOSRambler.iOS #3: Test-Driven Development в iOS
Rambler.iOS #3: Test-Driven Development в iOSRAMBLER&Co
2K views18 Folien
Unit тестирование von
Unit тестированиеUnit тестирование
Unit тестированиеMaxim Volchenko
469 views21 Folien
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов von
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовMskDotNet Community
124 views52 Folien
iPhone Unit Testing (Google tool Box) von
iPhone Unit Testing (Google tool Box)iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)Yandex
774 views27 Folien

Más contenido relacionado

Was ist angesagt?

автоматизация тестирования с помощью Selenium von
автоматизация тестирования с помощью Seleniumавтоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Seleniumvyacheslavmaslov
4.9K views36 Folien
XPath локаторы в Selenium WebDriver von
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverИлья Кожухов
43.1K views57 Folien
Автоматизация и Selenium IDE von
Автоматизация и Selenium IDEАвтоматизация и Selenium IDE
Автоматизация и Selenium IDEISsoft
7.6K views31 Folien
Dependency Injection на примере Unity и NInject von
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectakrakovetsky
4.2K views26 Folien
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg von
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgIT61
2K views19 Folien
Pycon Russia 2013 - Разработка через тестирование в Python и Django von
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoIlya Shalyapin
489 views53 Folien

Was ist angesagt?(18)

автоматизация тестирования с помощью Selenium von vyacheslavmaslov
автоматизация тестирования с помощью Seleniumавтоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Selenium
vyacheslavmaslov4.9K views
Автоматизация и Selenium IDE von ISsoft
Автоматизация и Selenium IDEАвтоматизация и Selenium IDE
Автоматизация и Selenium IDE
ISsoft7.6K views
Dependency Injection на примере Unity и NInject von akrakovetsky
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInject
akrakovetsky4.2K views
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg von IT61
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
IT612K views
Pycon Russia 2013 - Разработка через тестирование в Python и Django von Ilya Shalyapin
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Ilya Shalyapin489 views
Модульное тестирование iOS-приложений. von MageCloud
Модульное тестирование iOS-приложений.Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.
MageCloud1.4K views
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?" von QA Dnepropetrovsk Community (Ukraine)
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
автоматизация тестирования с помощью Selenium von vyacheslavmaslov
автоматизация тестирования с помощью Seleniumавтоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Selenium
vyacheslavmaslov855 views
Testing RIA with Selenium von Sergey Shvets
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with Selenium
Sergey Shvets1.4K views
Учим автотесты человеческому языку с помощью Allure и PyTest von Rina Uzhevko
Учим автотесты человеческому языку с помощью Allure и PyTestУчим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTest
Rina Uzhevko3.5K views
Автоматизация UI тестирования под Windows и Windows Phone von CodeFest
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
CodeFest6.5K views
JMeter и OutOfMemory. Исследовательский доклад von SQALab
JMeter и OutOfMemory. Исследовательский докладJMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский доклад
SQALab1.5K views
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь von Mail.ru Group
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья СтусьПолный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь
Mail.ru Group195 views
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си... von sqadays8
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
sqadays8437 views

Similar a Unit testing iOS Applications

Simonova sql server-enginetesting von
Simonova sql server-enginetestingSimonova sql server-enginetesting
Simonova sql server-enginetestingComputer Science Club
258 views35 Folien
Руководство по приготовлению бутербродов из Selenium von
Руководство по приготовлению бутербродов из SeleniumРуководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из SeleniumUladzimir Kryvenka
2.2K views36 Folien
Automation Functional Testing in Agile Projects von
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAndrey Rebrov
1K views41 Folien
Dependency injection на примере unity и n inject von
Dependency injection на примере unity и n injectDependency injection на примере unity и n inject
Dependency injection на примере unity и n injectRoman Kalita
869 views26 Folien
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко von
Solit 2012, Enterprise разработка PHP приложений, Иван ЗахарченкоSolit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченкоsolit
528 views13 Folien
Unit tests Python examples von
Unit tests Python examplesUnit tests Python examples
Unit tests Python examplesssuserd327fe1
12 views8 Folien

Similar a Unit testing iOS Applications(20)

Руководство по приготовлению бутербродов из Selenium von Uladzimir Kryvenka
Руководство по приготовлению бутербродов из SeleniumРуководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из Selenium
Uladzimir Kryvenka2.2K views
Automation Functional Testing in Agile Projects von Andrey Rebrov
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile Projects
Andrey Rebrov1K views
Dependency injection на примере unity и n inject von Roman Kalita
Dependency injection на примере unity и n injectDependency injection на примере unity и n inject
Dependency injection на примере unity и n inject
Roman Kalita869 views
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко von solit
Solit 2012, Enterprise разработка PHP приложений, Иван ЗахарченкоSolit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
solit528 views
Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье... von Tech Talks @NSU
Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...
Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...
Tech Talks @NSU210 views
Simonova sql server-enginetesting von LiloSEA
Simonova sql server-enginetestingSimonova sql server-enginetesting
Simonova sql server-enginetesting
LiloSEA254 views
Simonova CSEDays von LiloSEA
Simonova CSEDaysSimonova CSEDays
Simonova CSEDays
LiloSEA216 views
Katerina Simonova CSEDays von LiloSEA
Katerina Simonova CSEDaysKaterina Simonova CSEDays
Katerina Simonova CSEDays
LiloSEA278 views
Katerina Simonova CSEDays von LiloSEA
Katerina Simonova CSEDaysKaterina Simonova CSEDays
Katerina Simonova CSEDays
LiloSEA1 view
Статический анализ кода в DDD von Aleksei Alekseev
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDD
Aleksei Alekseev293 views
C# Desktop. Занятие 16. von Igor Shkulipa
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
Igor Shkulipa170 views
Маргарита Сафарова - Аудит процессов тестирования при смене проектной команды von SQALab
Маргарита Сафарова - Аудит процессов тестирования при смене проектной командыМаргарита Сафарова - Аудит процессов тестирования при смене проектной команды
Маргарита Сафарова - Аудит процессов тестирования при смене проектной команды
SQALab1.4K views
Тестирование производительности систем мониторинга на платформе Microsoft SCO... von SQALab
Тестирование производительности систем мониторинга на платформе Microsoft SCO...Тестирование производительности систем мониторинга на платформе Microsoft SCO...
Тестирование производительности систем мониторинга на платформе Microsoft SCO...
SQALab1.5K views
Лекция 11. Тестирование. von Roman Brovko
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
Roman Brovko27.2K views
Unit testing von ISsoft
Unit testingUnit testing
Unit testing
ISsoft593 views
Контроль качества с использованием продуктов Ibm rational von Alexander Novichkov
Контроль качества с использованием продуктов Ibm rationalКонтроль качества с использованием продуктов Ibm rational
Контроль качества с использованием продуктов Ibm rational

Más de Andrey Volobuev

Protocols and generics in Swift von
Protocols and generics in SwiftProtocols and generics in Swift
Protocols and generics in SwiftAndrey Volobuev
87 views14 Folien
State machines in iOS von
State machines in iOSState machines in iOS
State machines in iOSAndrey Volobuev
102 views13 Folien
ML von
MLML
MLAndrey Volobuev
142 views20 Folien
Mobile architectures von
Mobile architecturesMobile architectures
Mobile architecturesAndrey Volobuev
127 views16 Folien
Functional von
FunctionalFunctional
FunctionalAndrey Volobuev
140 views26 Folien
How React works von
How React works How React works
How React works Andrey Volobuev
231 views19 Folien

Más de Andrey Volobuev(8)

Unit testing iOS Applications

  • 1. Unit тестирование iOS приложений Андрей Волобуев
  • 2. Что такое unit тесты Для чего тестировать Когда тестировать Виды unit тестов Двойники для тестов Управление зависимостями Лучшие практики Тезисы
  • 3. Что такое unit тесты ? Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Википедия
  • 4. Что такое unit тесты ? Класс Тест класс Метод 1 Метод 2 Тест метод 1.2 Тест метод 2.1 Тест метод 1.1 . . .
  • 5. Для чего тестировать ? Уверенность в корректности работы программы Возможность рефакторинга Исполняемая документация Исполняемые требования Работа с CI системами Доказательство что баг исправлен
  • 6. Когда тестировать ? TDD - сначала пишется тест Refactor Red Green
  • 7. Когда тестировать ? Обычное тестирование - тесты пишутся после кода
  • 8. Когда тестировать Вопрос в том насколько после
  • 9. Виды unit тестов Возвращаемый результат Состояние Поведение
  • 10. Двойники для тестов Клиент Официант Повар Ресторан
  • 11. Двойники для тестов Клиент Официант Тест повар Ресторан
  • 12. Двойники для тестов Stub - возвращают заранее предопределенный результат Mock - содержат логику для проверки поведения
  • 14. // Менеджер ресторана должен сказать нам какой стол свободен struct Manager{ // Он обращается к сервису реализующему протокол var tablesService: FreeTableProvider func getFreeTable() -> Int{ let tableId = tablesService.getTable() return tableId } // Constructor injection init(tablesService: FreeTableProvider = ProductionTableProvider()){ self.tablesService = tablesService } } // Протокол для сервиса protocol FreeTableProvider{ func getTable() -> Int } struct ProductionTableProvider: FreeTableProvider{ func getTable() -> Int { let tableId = makeLongRunningRequestAndReturnTable() return tableId } private func makeLongRunningRequestAndReturnTable() -> Int { . . . } }
  • 15. class StubFreeTableProvider: FreeTableProvider{ func getTable() -> Int { return 42 } } class ManagerTests: XCTestCase { override func setUp() { super.setUp() } override func tearDown() { super.tearDown() } func testManagerRetunsFreeTable(){ let stubFreeTableProvider = StubFreeTableProvider() let manager = Manager(tablesService: stubFreeTableProvider) let tableId = manager.getFreeTable() XCTAssertEqual(tableId, 42, "Менеджер возвращает столик полученный от сервиса") } }
  • 16. protocol OrderExecutor{ func executeOrder() } // Теперь мы тестируем внутреннее состояние официанта struct Waiter{ // Столик с которым работает официант var currentTableId: Int? var cook: OrderExecutor func excecuteOrder(){ cook.executeOrder() } // Функция позвать официанта к столику mutating func call(toTable tableId: Int){ currentTableId = tableId } init(orderExecutor: OrderExecutor){ self.cook = orderExecutor } }
  • 17. class WaiterUnitTests: XCTestCase { override func setUp() { super.setUp() } override func tearDown() { super.tearDown() } func testWaiterServesTableAfterCalling(){ var waiter = Waiter() let tableId = 42 waiter.call(toTable: tableId) XCTAssertEqual(tableId, waiter.currentTableId, "Официанта приходит к столику") } }
  • 18. // Тот кто реализует этот протокол может исполнять заказы protocol OrderExecutor{ func executeOrder() } // Теперь поведение официанта struct Waiter{ var currentTableId: Int? // Тот кто реализует этот протокол может исполнять заказы var cook: OrderExecutor // Функция передать заказ повару func excecuteOrder(){ cook.executeOrder() } mutating func call(toTable tableId: Int){ currentTableId = tableId } // Constructor injection init(orderExecutor: OrderExecutor = ProductionOrderExecutor()){ self.cook = orderExecutor } }
  • 19. class MockCook: OrderExecutor{ var isOrederExecuted = false func executeOrder() { isOrederExecuted = true } } class WaiterUnitTests: XCTestCase { func testWaiterGivesOrderToCook(){ let mockCook = MockCook() let waiter = Waiter(orderExecutor: mockCook) waiter.excecuteOrder() XCTAssertTrue(mockCook.isOrederExecuted, "Официант отдал заказ повару”) } }
  • 20. Лучшие практики DRY if, switch, for, while Сложные setUp Вычисляемые ожидаемые значения Много assert на тест Мало тестов Много тестов