SlideShare uma empresa Scribd logo
1 de 64
Baixar para ler offline
Unit Testing
UIView
Unit Testing vs UI Testing
Unit Testing vs UI Testing
UI
Tests
Service Tests
Unit Tests
more
integration
more
isolation
slower
faster
Example View
Example View
class ArticleTableViewCell: UITableViewCell {
@IBOutlet var dateLabel: UILabel!
@IBOutlet var titleLabel: UILabel!
@IBOutlet var sourceLabel: UILabel!
@IBOutlet var articleImageView: UIImageView!
}
Example View
struct ArticleViewModel {
let date: String
let title: String
let source: String
let image: UIImage?
}
Example View
extension ArticleTableViewCell {
func configure(with viewModel: ArticleViewModel) {
dateLabel.text = viewModel.date
titleLabel.text = viewModel.title
sourceLabel.text = viewModel.source
articleImageView.image = viewModel.image
}
}
Example View
Snapshot Testing
📸Snapshot
Snapshot Testing
📸Snapshot
Snapshot Testing
📸Snapshot
✅
Snapshot Testing
📸Snapshot
✅
Snapshot Testing
📸Snapshot
✅
❌
Snapshot Testing
📸Snapshot
Layout Testing
📐Layout
Layout Testing
📐Layout
Layout Testing
📐Layout
Layout Testing
📐Layout
Real Test
func testArticleTableViewCell() {
}
Real Test
func testArticleTableViewCell() {
!// Create input
let viewModel = ArticleViewModel(
date: "03/06/2019",
title: "2019 Worldwide Developers Conference",
source: "!!www.macrumors.com",
image: UIImage(named: "wwdc")
)
}
Real Test
func testArticleTableViewCell() {
!// Create input
let viewModel = ArticleViewModel(
date: "03/06/2019",
title: "2019 Worldwide Developers Conference",
source: "!!www.macrumors.com",
image: UIImage(named: "wwdc")
)
!// Create view
let view = ArticleTableViewCell()
view.backgroundColor = UIColor.white
view.frame = CGRect(x: 0, y: 0, width: 320, height: 300)
}
Real Test
func testArticleTableViewCell() {
!// Create input
let viewModel = ArticleViewModel(
date: "03/06/2019",
title: "2019 Worldwide Developers Conference",
source: "!!www.macrumors.com",
image: UIImage(named: "wwdc")
)
!// Create view
let view = ArticleTableViewCell()
view.backgroundColor = UIColor.white
view.frame = CGRect(x: 0, y: 0, width: 320, height: 300)
!// Pass input
view.configure(with: viewModel)
}
Real Test
func testArticleTableViewCell() {
!// Create input
let viewModel = ArticleViewModel(
date: "03/06/2019",
title: "2019 Worldwide Developers Conference",
source: "!!www.macrumors.com",
image: UIImage(named: "wwdc")
)
!// Create view
let view = ArticleTableViewCell()
view.backgroundColor = UIColor.white
view.frame = CGRect(x: 0, y: 0, width: 320, height: 300)
!// Pass input
view.configure(with: viewModel)
!// Layout view
view.setNeedsLayout()
view.layoutIfNeeded()
view.autoSize()
}
Real Test
func testArticleTableViewCell() {
!// Create input
let viewModel = ArticleViewModel(
date: "03/06/2019",
title: "2019 Worldwide Developers Conference",
source: "!!www.macrumors.com",
image: UIImage(named: "wwdc")
)
!// Create view
let view = ArticleTableViewCell()
view.backgroundColor = UIColor.white
view.frame = CGRect(x: 0, y: 0, width: 320, height: 300)
!// Pass input
view.configure(with: viewModel)
!// Layout view
view.setNeedsLayout()
view.layoutIfNeeded()
view.autoSize()
📸 / 📐
}
Real Test
func testArticleTableViewCell() {
!// Create input
let viewModel = ArticleViewModel(
date: "03/06/2019",
title: "2019 Worldwide Developers Conference",
source: "!!www.macrumors.com",
image: UIImage(named: "wwdc")
)
!// Create view
let view = ArticleTableViewCell()
view.backgroundColor = UIColor.white
view.frame = CGRect(x: 0, y: 0, width: 320, height: 300)
!// Pass input
view.configure(with: viewModel)
!// Layout view
view.setNeedsLayout()
view.layoutIfNeeded()
view.autoSize()
📸 / 📐
}
Correct View
Glitch Example
Glitch Example
All generated
inputs
Solution
Manual
input
Random
inputs
1 ∞ 100 ≠
All possible
inputs
Solution
Manual
input
Random
inputs
1 ∞ 100 ≠
All possible
inputs
Solution
Manual
input
Random
inputs
1 ∞ 100 ≠
Property based testing
Property Based Testing
!// Generate random inputs
for all (x, y, …)
!// Keep generating inputs while this is false
such that precondition(x, y, …)
!// Test the property
property(x, y, …) is true
Property Based Testing (Example)
!// Generate random inputs
for all (numbers: [Int])
!// Keep generating inputs while this is false
such that alwaysTrue(numbers)
!// Test the property
numbers.sort() is sorted
!!<=> numbers[n] !<= numbers[n + 1]
Back to UIView Testing
!// Generate random view models
for all (viewModel: ArticleViewModel)
view.configure(with: viewModel)
!// Test the property
view.snapshot is matching
!&& view.layout is valid
Real Test
func testArticleTableViewCell() {
!// Create input
let viewModel = ArticleViewModel(
date: "03/06/2019",
title: "2019 Worldwide Developers Conference",
source: "!!www.macrumors.com",
image: UIImage(named: "wwdc")
)
!// Create view
let view = ArticleTableViewCell()
view.backgroundColor = UIColor.white
view.frame = CGRect(x: 0, y: 0, width: 320, height: 300)
!// Pass input
view.configure(with: viewModel)
!// Layout view
view.setNeedsLayout()
view.layoutIfNeeded()
view.autoSize()
📸 / 📐
}
Real Test
func testArticleTableViewCell() {
!// Create input
let viewModel = ArticleViewModel(
date: "03/06/2019",
title: "2019 Worldwide Developers Conference",
source: "!!www.macrumors.com",
image: UIImage(named: "wwdc")
)
!// Create view
let view = ArticleTableViewCell()
view.backgroundColor = UIColor.white
view.frame = CGRect(x: 0, y: 0, width: 320, height: 300)
!// Pass input
view.configure(with: viewModel)
!// Layout view
view.setNeedsLayout()
view.layoutIfNeeded()
view.autoSize()
📸 / 📐
}
Real Test
func testArticleTableViewCell() {
let viewModel = ArticleViewModel(
date: "03/06/2019",
title: "2019 Worldwide Developers Conference",
source: "!!www.macrumors.com",
image: UIImage(named: "wwdc")
)
testArticleView(with: viewModel)
}
func testArticleTableViewCell() {
for viewModel in randomViewModels {
testArticleView(with: viewModel)
}
}
Real Test
func testArticleTableViewCell() {
for viewModel in randomViewModels {
testArticleView(with: viewModel)
}
}
Real Test
Random Generators
Random Generation
struct Gen<A> {
let unGen : (RNG) !-> A
}
Create Generators
let wordGen = …
Create Generators
let wordGen = Gen<Int>.chooseAny() !// Gen<Int>
Create Generators
let wordGen = Gen<Int>.chooseAny()
.suchThat { 97 !<= $0 !&& $0 !<= 122 } !// Gen<Int>
Create Generators
let wordGen = Gen<Int>.chooseAny()
.suchThat { 97 !<= $0 !&& $0 !<= 122 }
.map { Character(UnicodeScalar($0)!) } !// Gen<Character>
Create Generators
let wordGen = Gen<Int>.chooseAny()
.suchThat { 97 !<= $0 !&& $0 !<= 122 }
.map { Character(UnicodeScalar($0)!) }
.proliferate !// Gen<[Character]>
Create Generators
let wordGen = Gen<Int>.chooseAny()
.suchThat { 97 !<= $0 !&& $0 !<= 122 }
.map { Character(UnicodeScalar($0)!) }
.proliferate
.map { String.init($0) } !// Gen<String>
Compose Generators
let componentGen: Gen<CGFloat> = Gen<Int>
.choose((0, 255))
.map { CGFloat($0) / 255.0 }
Compose Generators
let componentGen: Gen<CGFloat> = Gen<Int>
.choose((0, 255))
.map { CGFloat($0) / 255.0 }
let colorGen = Gen<UIColor>.compose { c in
return UIColor(
red: c.generate(using: componentGen),
green: c.generate(using: componentGen),
blue: c.generate(using: componentGen),
alpha: 1.0
)
}
Compose Generators
let componentGen: Gen<CGFloat> = Gen<Int>
.choose((0, 255))
.map { CGFloat($0) / 255.0 }
let colorGen = Gen<UIColor>.compose { c in
return UIColor(
red: c.generate(using: componentGen),
green: c.generate(using: componentGen),
blue: c.generate(using: componentGen),
alpha: 1.0
)
}
Generate View Models
let words: Gen<String> = …
let sentences: Gen<String> = …
func image(min: Int, max: Int) !-> Gen<UIImage> { … }
Generate View Models
let words: Gen<String> = …
let sentences: Gen<String> = …
func image(min: Int, max: Int) !-> Gen<UIImage> { … }
let viewModelGen = Gen<ArticleViewModel>.compose { c in
return ArticleViewModel(
date: c.generate(using: .words),
title: c.generate(using: .sentences),
source: c.generate(using: .words),
image: c.generate(using: .image(min: 50, max: 100))
)
}
Generate View Models
let words: Gen<String> = …
let sentences: Gen<String> = …
func image(min: Int, max: Int) !-> Gen<UIImage> { … }
let viewModelGen = Gen<ArticleViewModel>.compose { c in
return ArticleViewModel(
date: c.generate(using: .words),
title: c.generate(using: .sentences),
source: c.generate(using: .words),
image: c.generate(using: .image(min: 50, max: 100))
)
}
Generated Views
Generated Views
Generated Views
Generated Views
Generated Views
Layout Error
Layout Error
In Practice
📸
📐
SnapshotTesting
iOSSnapshotTestCase
ADAssertLayout
⚙ ADLayoutTest
🎲 SwiftCheck
Resources
ADAssertLayout: https://github.com/applidium/ADAssertLayout
ADLayoutTest: https://github.com/applidium/ADLayoutTest
iOSSnapshotTestCase: https://github.com/uber/ios-snapshot-test-case
SnapshotTesting: https://github.com/pointfreeco/swift-snapshot-testing
SwiftCheck: https://github.com/typelift/SwiftCheck
Thank you
CONTACT
Pierre FELGINES
@PierreFelgines

Mais conteúdo relacionado

Mais procurados

Mocks, Spies, and Timers - Oh My!
Mocks, Spies, and Timers - Oh My!Mocks, Spies, and Timers - Oh My!
Mocks, Spies, and Timers - Oh My!Lisa Backer
 
AngularJS $Provide Service
AngularJS $Provide ServiceAngularJS $Provide Service
AngularJS $Provide ServiceEyal Vardi
 
Stack Overflow Austin - jQuery for Developers
Stack Overflow Austin - jQuery for DevelopersStack Overflow Austin - jQuery for Developers
Stack Overflow Austin - jQuery for DevelopersJonathan Sharp
 
Jquery In Rails
Jquery In RailsJquery In Rails
Jquery In Railsshen liu
 
JavaScript Objects and OOP Programming with JavaScript
JavaScript Objects and OOP Programming with JavaScriptJavaScript Objects and OOP Programming with JavaScript
JavaScript Objects and OOP Programming with JavaScriptLaurence Svekis ✔
 
jQuery: out with the old, in with the new
jQuery: out with the old, in with the newjQuery: out with the old, in with the new
jQuery: out with the old, in with the newRemy Sharp
 
Let jQuery Rock Your World
Let jQuery Rock Your WorldLet jQuery Rock Your World
Let jQuery Rock Your WorldMatt Gifford
 
Unbreakable: The Craft of Code
Unbreakable: The Craft of CodeUnbreakable: The Craft of Code
Unbreakable: The Craft of CodeJoe Morgan
 
AngularJS Compile Process
AngularJS Compile ProcessAngularJS Compile Process
AngularJS Compile ProcessEyal Vardi
 
Chris Holland "Leveraging Typed Exceptions for Cleaner Error Handling"
Chris Holland "Leveraging Typed Exceptions for Cleaner Error Handling"Chris Holland "Leveraging Typed Exceptions for Cleaner Error Handling"
Chris Holland "Leveraging Typed Exceptions for Cleaner Error Handling"Fwdays
 
Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Bongwon Lee
 
Advanced jQuery
Advanced jQueryAdvanced jQuery
Advanced jQuerysergioafp
 
ES6 patterns in the wild
ES6 patterns in the wildES6 patterns in the wild
ES6 patterns in the wildJoe Morgan
 
Aplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com BackboneAplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com BackboneRafael Felix da Silva
 
스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내Jung Kim
 
PHP cart
PHP cartPHP cart
PHP carttumetr1
 

Mais procurados (20)

Mocks, Spies, and Timers - Oh My!
Mocks, Spies, and Timers - Oh My!Mocks, Spies, and Timers - Oh My!
Mocks, Spies, and Timers - Oh My!
 
AngularJS $Provide Service
AngularJS $Provide ServiceAngularJS $Provide Service
AngularJS $Provide Service
 
jQuery quick tuts
jQuery quick tutsjQuery quick tuts
jQuery quick tuts
 
Stack Overflow Austin - jQuery for Developers
Stack Overflow Austin - jQuery for DevelopersStack Overflow Austin - jQuery for Developers
Stack Overflow Austin - jQuery for Developers
 
Jquery 3
Jquery 3Jquery 3
Jquery 3
 
Jquery In Rails
Jquery In RailsJquery In Rails
Jquery In Rails
 
JavaScript Objects and OOP Programming with JavaScript
JavaScript Objects and OOP Programming with JavaScriptJavaScript Objects and OOP Programming with JavaScript
JavaScript Objects and OOP Programming with JavaScript
 
jQuery: out with the old, in with the new
jQuery: out with the old, in with the newjQuery: out with the old, in with the new
jQuery: out with the old, in with the new
 
Let jQuery Rock Your World
Let jQuery Rock Your WorldLet jQuery Rock Your World
Let jQuery Rock Your World
 
Unbreakable: The Craft of Code
Unbreakable: The Craft of CodeUnbreakable: The Craft of Code
Unbreakable: The Craft of Code
 
AngularJS Compile Process
AngularJS Compile ProcessAngularJS Compile Process
AngularJS Compile Process
 
J Query Public
J Query PublicJ Query Public
J Query Public
 
Chris Holland "Leveraging Typed Exceptions for Cleaner Error Handling"
Chris Holland "Leveraging Typed Exceptions for Cleaner Error Handling"Chris Holland "Leveraging Typed Exceptions for Cleaner Error Handling"
Chris Holland "Leveraging Typed Exceptions for Cleaner Error Handling"
 
Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9
 
Advanced jQuery
Advanced jQueryAdvanced jQuery
Advanced jQuery
 
ES6 patterns in the wild
ES6 patterns in the wildES6 patterns in the wild
ES6 patterns in the wild
 
Handlebars.js
Handlebars.jsHandlebars.js
Handlebars.js
 
Aplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com BackboneAplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com Backbone
 
스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내
 
PHP cart
PHP cartPHP cart
PHP cart
 

Semelhante a Unit testing UIView

How to increase Performance of Web Application using JQuery
How to increase Performance of Web Application using JQueryHow to increase Performance of Web Application using JQuery
How to increase Performance of Web Application using JQuerykolkatageeks
 
MOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentMOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentanistar sung
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012ghnash
 
Architectures in the compose world
Architectures in the compose worldArchitectures in the compose world
Architectures in the compose worldFabio Collini
 
Jquery optimization-tips
Jquery optimization-tipsJquery optimization-tips
Jquery optimization-tipsanubavam-techkt
 
Kick start with j query
Kick start with j queryKick start with j query
Kick start with j queryMd. Ziaul Haq
 
Jquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript BasicsJquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript BasicsEPAM Systems
 
Roman iovlev. Test UI with JDI - Selenium camp
Roman iovlev. Test UI with JDI - Selenium campRoman iovlev. Test UI with JDI - Selenium camp
Roman iovlev. Test UI with JDI - Selenium campРоман Иовлев
 
RubyMotion
RubyMotionRubyMotion
RubyMotionMark
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterpriseDave Artz
 
Svcc Building Rich Applications with Groovy's SwingBuilder
Svcc Building Rich Applications with Groovy's SwingBuilderSvcc Building Rich Applications with Groovy's SwingBuilder
Svcc Building Rich Applications with Groovy's SwingBuilderAndres Almiray
 
Web UI test automation instruments
Web UI test automation instrumentsWeb UI test automation instruments
Web UI test automation instrumentsArtem Nagornyi
 
Typed? Dynamic? Both! Cross-platform DSLs in C#
Typed? Dynamic? Both! Cross-platform DSLs in C#Typed? Dynamic? Both! Cross-platform DSLs in C#
Typed? Dynamic? Both! Cross-platform DSLs in C#Vagif Abilov
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCpootsbook
 

Semelhante a Unit testing UIView (20)

How to increase Performance of Web Application using JQuery
How to increase Performance of Web Application using JQueryHow to increase Performance of Web Application using JQuery
How to increase Performance of Web Application using JQuery
 
MOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentMOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app development
 
Jquery
JqueryJquery
Jquery
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012
 
Architectures in the compose world
Architectures in the compose worldArchitectures in the compose world
Architectures in the compose world
 
Griffon @ Svwjug
Griffon @ SvwjugGriffon @ Svwjug
Griffon @ Svwjug
 
Jquery optimization-tips
Jquery optimization-tipsJquery optimization-tips
Jquery optimization-tips
 
Nativescript angular
Nativescript angularNativescript angular
Nativescript angular
 
Kick start with j query
Kick start with j queryKick start with j query
Kick start with j query
 
Jquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript BasicsJquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript Basics
 
Roman iovlev. Test UI with JDI - Selenium camp
Roman iovlev. Test UI with JDI - Selenium campRoman iovlev. Test UI with JDI - Selenium camp
Roman iovlev. Test UI with JDI - Selenium camp
 
How to React Native
How to React NativeHow to React Native
How to React Native
 
RubyMotion
RubyMotionRubyMotion
RubyMotion
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] Enterprise
 
jQuery Essentials
jQuery EssentialsjQuery Essentials
jQuery Essentials
 
Svcc Building Rich Applications with Groovy's SwingBuilder
Svcc Building Rich Applications with Groovy's SwingBuilderSvcc Building Rich Applications with Groovy's SwingBuilder
Svcc Building Rich Applications with Groovy's SwingBuilder
 
Web UI test automation instruments
Web UI test automation instrumentsWeb UI test automation instruments
Web UI test automation instruments
 
mobl
moblmobl
mobl
 
Typed? Dynamic? Both! Cross-platform DSLs in C#
Typed? Dynamic? Both! Cross-platform DSLs in C#Typed? Dynamic? Both! Cross-platform DSLs in C#
Typed? Dynamic? Both! Cross-platform DSLs in C#
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVC
 

Último

The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Clustering techniques data mining book ....
Clustering techniques data mining book ....Clustering techniques data mining book ....
Clustering techniques data mining book ....ShaimaaMohamedGalal
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 

Último (20)

The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Exploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the ProcessExploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the Process
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Clustering techniques data mining book ....
Clustering techniques data mining book ....Clustering techniques data mining book ....
Clustering techniques data mining book ....
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 

Unit testing UIView