SlideShare uma empresa Scribd logo
1 de 73
Baixar para ler offline
Tests
Antipatterns
by Maciej Przewoźnik
Agenda
Slow Test
Overuse of mocks
Obscure Test
Agenda (2)
Manual Test
Fragile Test
Erratic Test
Eager Test
Agenda (3)
Verbose Test
Mystery Guest
Test Code Duplication
High Test Maintenance Cost
Slow Test
Slow Test
Stabilizing a very slow test
Individual slow tests
Executing all tests is too long
Slow Test
Stabilizing a very slow test
Individual slow tests
Executing all tests is too long
- -
Slow Test - stabilizing a very slow
test
Don't steer a rover on Mars from Earth
Execute a test ...
8 minutes later: failure
Fix & rerun
10 minutes later: failure
Fix & rerun
10 minutes later: failure
Slow Test - stabilizing a very slow
test
What to do in the meantime?
GTD: don't multitask
CPU cache vs "brain cache"
Context switch cost
Slow Test - stabilizing a very slow
test
What to do in the meantime?
Solution: use the fastest machine
Have the machine in the company
Other tests on slower machines
Slow Test - stabilizing a very slow
test
What to do in the meantime?
For performance or stress tests with big
amount of data
Solution: use smaller data sets for
stabilization first
Then run with bigger datasets
Slow Test - stabilizing a very slow
test
Solution: use REPL environment to
stabilize it faster
Real-eval-print loop
A failure shouldn't invalidate previous results!
Slow Test - stabilizing a very slow
test
Solution: stabilize parts separately
Given a test:
Generate a big file.
Consume it.
Don't remove the file if failure occurs in (2).
(to be continued)
Slow Test
Stabilizing a very slow test
Individual slow tests
Executing all tests is too long
Slow Test - individual tests are
slow
What is a slow test?
a developer gets irritated or bored waiting for
finish
is tempted to get a break, surf the Internet,
chat, or walk around
Slow Test - individual tests are
slow
What is a slow test?
Sometimes more than a second, sometimes a
millisecond
Not long individually, but all tests execution is
too long
Or a group of tests is too long
Slow Test - individual tests are
slow
Impact:
Developers stop running them after every code
change
Developers wait for a coffee break, lunch or a
meeting to run them
Delayed feedback, loss of "flow"
Decreases productivity and job satisfaction
Slow Test - individual tests are
slow
Cause: Slow dependent component (1)
Solution: Fast Fake Objects
Real DB → Fake DB (e. g. In Memory DB)
Real Cloud → In memory cloud
Filesystems: HDD, SSD → RAM disk:
mount ­t tmpfs ­o size=200m tmpfs /mnt/tmp
Slow Test - individual tests are
slow
Cause: Slow dependent component (2)
Example: Backup applications
Solution: Recorded test
Record operations done by backup
applications
Warning: Recorded test may be a Fragile Test
Slow Test - individual tests are
slow
Cause: Slow environment or layer
Solution: Separate tested logic from
environment:
Hardware/GUI/HTTP layer
Threads, processes
Clouds, etc.
Kernel code
Slow Test - individual tests are
slow
Cause: Over-engineered fixture
Long setup of many complicated objects
Even if most of them are not needed
Or using full product in tests
Solution: General Fixture → Minimal
Fixture
Slow Test - individual tests are
slow
Cause: Manual tests
Slow by definition
Even slower if repeated
"Please check that the system just works"
before a release
Automated tests may get written anyway later
Slow Test - individual tests are
slow
Cause: Manual tests
Often under pressure or under "give-it-to-me-
now driven-development"
No future returns
May be worthless after just a single commit
Lack of tests automation will slow test
development later
Slow Test - individual tests are
slow
"Just Say No to More End-to-End Tests"
Testing pyramid
Manual tests
End-to-end tests
Integration tests
Component tests
Fast Unit Tests
Slow Test
Stabilizing a very slow test
Individual slow tests
Executing all tests is too long
Slow Tests - executing all tests is
too long
In some big IT companies:
build time: one minute
release to production: 8 minutes
not just a release – a release to production!
What problems may it address?
Slow Tests - executing all tests is
too long
Impact: Developers context-switching,
worse productivity
tests start ...
15 min: a test fails
fix & rerun
20 min: a test fails
Slow Tests - executing all tests is
too long
Impact: Integrating code slower
Bigger release queue
Slower features delivery, missing deadlines
Slow Tests - executing all tests is
too long
Impact: Production big fixes are
delayed
A customer requires a fix, we need to test it
Release a quick fix or a well tested fix?
Slow Tests - executing all tests is
too long
Cause: Too much overlap between
tests
Test1: [ DATA LOADING ][doSth][check]
Test2: [ DATA LOADING ][doSth][check]
Test3: [ DATA LOADING ][doSth][check]
Slow Tests - executing all tests is
too long
Cause: Too much overlap between
tests
Use Shared Fixture?
Shared setup for many tests
Warning: may get closer to Erratic Tests,
High Test Maintenance Cost
Slow Tests - executing all tests is
too long
Cause: Too Many Tests
Too many tests run too frequently
Solution: subsets of tests can be run at
the time
All tests within larger period of time
Prerelease tests: all with fast fakes
Postrelease tests: with real objects
Slow Tests - executing all tests is
too long
Cause: Too Many Tests
The system is too large
Solution: break it into independent
subsystems
Slow Tests - executing all tests is
too long
Cause: Slow Machines
Only one integration server
Too slow integration servers
Insufficient parallelization: look at "top",
"vmstat"
Overuse of (strict)
mocks
Overuse of mocks
Impact:Tests can be harder to
understand
The extra code detracts from the tester authors
intent
Overuse of mocks
Impact: Tests are harder to maintain
Focus: implementation vs public interface
Focus: implementation vs behavior
Extra code for mock behavior needed
Over-specified software
Fragile
Overuse of mocks
Impact: Less assurance that the code
is working properly
It's hard to guarantee that the mocks behave as
real implementations
Especially over time
Overuse of mocks
When the real object cannot be used:
They are too slow
Their setup is too complex
They charge money, etc.
Overuse of mocks
Alternatives:
Fake objects
Hermetic local servers (for cash transactions,
etc.)
Consider the
following bad code ...
class TeaHouse(object):
    def __init__(self, cash_service, tax_service):
        self.cash_service = cash_service
        self.tax_service = tax_service
        self.money_total = 0
    def order_cup(self, credit_card):
        cup = Tea()
        self.cash_service.begin_transaction()
        result = self.cash_service.charge(
            credit_card, cup.price)
        if result:
            self.money_total += cup.price
            self.cash_service.commit_transaction()
            self.tax_service.register_transaction(
                cup.price
            )
        else:
            self.cash_service.cancel_transaction()
def should_compute_doubled_price_for_two_cups():
    cs = mock(CashService)
    cs.expect_call("begin_transaction").times(2)
    cs.expect_call("charge").times(2).repeatedly(
        Return(Cup())
    )
    cs.expect_call("end_transaction").times(2)
    ts.mock(TaxService)
    ts.expect_call("register_transaction").times(2)
    t = TeaHouse(cs, ts)
    c = CreditCard(money=usd(30))
    t.set_tea_price(usd(10))
    t.order_cup(c)
    t.order_cup(c)
    assert t.money_total == usd(20)
Overuse of mocks
We actually don't care for interaction with cash
service and tax service here
Overuse of mocks
Alternative: use a fake
def should_compute_doubled_price_for_two_cups():
    t = TeaHouse(
        FakeInMemoryCashService(), FakeTaxService()
    )
    c = CreditCard(money=usd(30))
    t.set_tea_price(usd(10))
    t.order_cup(c)
    t.order_cup(c)
    assert t.money_total == usd(20)
Overuse of mocks
Alternative: use a stub or a non-strict
mock:
def should_compute_doubled_price_for_two_cups():
    t = TeaHouse(
        StubCashService(always_ok=True), StubTaxService()
    )
    c = CreditCard(money=usd(30))
    t.set_tea_price(usd(10))
    t.order_cup(c)
    t.order_cup(c)
    assert t.money_total == usd(20)
But in this particular
situation, even better
is ...
One function, one
responsibility
Overuse of mocks
class TeaHouseOrders:
    def __init__(self):
        # no cash_service and no tax service!
        self.orders = []
    def order_cup(credit_card):
        self.orders.append(TeaOrder())
        return 
    def total_price():
        return sum([o.price() for o in self.orders])
Overuse of mocks
class TeaHouseCash:
    def charge(price):
        self.cash_service.begin_transaction()
        result = self.cash_service.charge(cc, price)
        if result:
            self.cash_service.commit_transaction()
        else:
            self.cancel_transaction()
        return self.cups
Overuse of mocks
def should_compute_doubled_price_for_two_cups():
    t = TeaHouseOrders()
    t.set_tea_price(usd(10))
    t.order_cup()
    t.order_cup()
    assert t.total_price() == usd(20)
Neither mocks nor fakes needed!
Important concept: separate description
from execution
Obscure Test
Obscure Test
Impact:
Harder to understand
Harder to maintain
Developers will not read them as
documentation
May lead to Can result in a Buggy Test, and
then Production Bugs
Obscure Test
Good Tests:
Tests should act as documentation
And also a self-verifying executable
specification
Obscure Test
Is it a good test?
def should_have_the_same_permissions_after_copy():
    fs = FileSystem("r­w")
    f = File("a.txt", "rwxrwxrwx")
    fso = FileSystemOps(fs)
    fso.copy(f, "b.txt")
    assert(fso.fileperm("a.txt") == fso.fileperm("b.txt"))
Obscure Test
Is it a good test?
def should_have_the_same_permissions_after_copy():
    fs = FileSystem("r­w", "no­auto", 620, false, 
        true, true, 8096, 10*1024*1024*1024, 1000000)
    f = File("a.txt", "rwxrwxrwx", 64, "xyzxyz", 
        "2016­12­12", "2016­12­12", "2016­12­12")
    fso = FileSystemOps(fs, true, false, 1024, 11)
    fso.copy(f, "b.txt")
    assert(fso.fileperm("a.txt") == fso.fileperm("b.txt"))
Obscure Test
Cause: Irrelevant information
which values affect the outcome?
There can be a hundred constants in a test
code
Obscure Test
Cause: Too much information
Solution: introduce higher-level test
language
def file_copy_permissions_should_be_as_original():
    given_a_filesystem()
    given_a_file_with_permissions("rwxrwxrwx")
    when_a_file_is_copied()
    then_the_new_file_has_permissions("rwxrwxrwx")
Obscure Test
Cause: Too much information, Eager
Test
The test verifies too much functionality in a
single
Test Method and therefore is hard to
understand
Obscure Test
Cause: Too much information, Eager
Test
def test_my_filesystem():
    fs = FileSystem("r­w", "no­auto", 620, false, true,
         true, 8096, 10*1024*1024*1024, 1000000)
    assert(fs.isReadOnly() == false)
    f = File("a.txt", "rwxrwxrwx", 64, "xyzxyz", 
        "2016­12­12", "2016­12­12", "2016­12­12")
    assert(f.getPermissions() == "rwxrwxrwx")
    assert(f.getCreationDate() == "2016­12­12")
    fso = FileSystemOps(fs, true, false, 1024, 11)
    fso.copy(f, "b.txt")
    assert(fso.fileperm("a.txt") == fso.fileperm("b.txt"))
    assert(fso.size("a.txt") == fso.size("b.txt")
Obscure Test
Cause: Too much information, Eager
Test
Often a Fragile Test
And a High-Maintenance Test
Obscure Test
Cause: Too much information
Not caring about clean code
No refactoring
"These are only tests"
"just do it in-line" mentality
Obscure Test
Cause: Too little information – Mystery
Guest
Cause and effect not clear
Something is hidden from the Test Method
Obscure Test
Cause: Too little information – Mystery
Guest
Doesn't exist because is copied to root?
def test123():
    fs = createFileSystem()
    f = new File("a.txt", "rwxrwxrwx", 64*MB, "xyzxyz", 
        "2016­12­12", "2016­12­12", "2016­12­12"
    )
    fso = new FileSystemOps(fs, true, false, 1024, 11)
    fso.copy(f, "/b.txt")
    assert(fso.exists("b.txt") == false)
Obscure Test
Cause: Too little information – Mystery
Guest
No, because createFileSystem creates read-only
filesystem:
def createFileSystem():
    return new FileSystem(
        "r­o", "no­auto", 620, false, true, true, 
        8096, 10*1024*1024*1024, 1000000
    )
)
Obscure Test
Cause: Setup-action-verify phases not
clear
def test123():
    fs = createFilesystem()
    f = createFile("a.txt")
    fso = createFso()
    f2 = fso.copy(f, "b.txt")
    s1 = fso.size("a.txt")
    s2 = fso.size("b.txt")
    assert(s1 == s2)
Do we test "size" here or "copy"?
Solution: Given-when-then
Obscure Test
Cause: Setup-action-verify phases not
clear
Solution: Given-when-then:
    given_filesystem()
    given_file()
    given_file_system_operations()
    when_the_file_is_copied()
    then_the_new_file_size_is_as_original()
Obscure Test
Cause: Overcomplicated Fixture
class TestFSFixture:
    def createRealOnlyFS():
    def createRWFS():
    def createJournalingFS():
    def createTransactionalFS():
    def createNFS():
    def createHDFS():
    def createNoAcFs():
    def createTwoFilesystems():
    def createPerfOptFS():
    def createBuggyFS():
    def createSlowFS():
Obscure Test
Cause: Overcomplicated Fixture
The fixture is too big and too complex
To understand the test, reading the fixture may
be necessary
Solutions:
Divide a General Fixture into smaller Fixtures
Use Minimal Fixture
Use Facades
Obscure Test
Cause: Indirect Testing
Testing one component through other
components
Example: Execute a product in debug mode to
see if log rotation works
Root Cause: software not designed for
testability
Sources
Gerard Meszaros - xUnit Test Patterns
testing.googleblog.com
Paul Chiusano and Rúnar Bjarnason - Functional
Programming in Scala
THE END

Mais conteúdo relacionado

Mais procurados

Attack-driven defense
Attack-driven defenseAttack-driven defense
Attack-driven defense
Zane Lackey
 
Need forbuildspeed agile2012
Need forbuildspeed agile2012Need forbuildspeed agile2012
Need forbuildspeed agile2012
drewz lin
 
Effective approaches to web application security
Effective approaches to web application security Effective approaches to web application security
Effective approaches to web application security
Zane Lackey
 

Mais procurados (20)

Attack-driven defense
Attack-driven defenseAttack-driven defense
Attack-driven defense
 
Why Software Test Performance Matters
Why Software Test Performance MattersWhy Software Test Performance Matters
Why Software Test Performance Matters
 
Test Dependencies and the Future of Build Acceleration
Test Dependencies and the Future of Build AccelerationTest Dependencies and the Future of Build Acceleration
Test Dependencies and the Future of Build Acceleration
 
MongoDB World 2018: Tutorial - MongoDB Meets Chaos Monkey
MongoDB World 2018: Tutorial - MongoDB Meets Chaos MonkeyMongoDB World 2018: Tutorial - MongoDB Meets Chaos Monkey
MongoDB World 2018: Tutorial - MongoDB Meets Chaos Monkey
 
Functional Load Testing with Gatling
Functional Load Testing with GatlingFunctional Load Testing with Gatling
Functional Load Testing with Gatling
 
2017 03-10 - vu amsterdam - testing safety critical systems
2017 03-10 - vu amsterdam - testing safety critical systems2017 03-10 - vu amsterdam - testing safety critical systems
2017 03-10 - vu amsterdam - testing safety critical systems
 
2016-04-28 - VU Amsterdam - testing safety critical systems
2016-04-28 - VU Amsterdam - testing safety critical systems2016-04-28 - VU Amsterdam - testing safety critical systems
2016-04-28 - VU Amsterdam - testing safety critical systems
 
2015 05-07 - vu amsterdam - testing safety critical systems
2015 05-07 - vu amsterdam - testing safety critical systems2015 05-07 - vu amsterdam - testing safety critical systems
2015 05-07 - vu amsterdam - testing safety critical systems
 
First adventure within a shell - Andrea Telatin at Quadram Institute
First adventure within a shell - Andrea Telatin at Quadram InstituteFirst adventure within a shell - Andrea Telatin at Quadram Institute
First adventure within a shell - Andrea Telatin at Quadram Institute
 
Testing Safety Critical Systems (10-02-2014, VU amsterdam)
Testing Safety Critical Systems (10-02-2014, VU amsterdam)Testing Safety Critical Systems (10-02-2014, VU amsterdam)
Testing Safety Critical Systems (10-02-2014, VU amsterdam)
 
Give A Great Tech Talk 2013
Give A Great Tech Talk 2013Give A Great Tech Talk 2013
Give A Great Tech Talk 2013
 
Need forbuildspeed agile2012
Need forbuildspeed agile2012Need forbuildspeed agile2012
Need forbuildspeed agile2012
 
Automate Everything! (No stress development/Tallinn)
Automate Everything! (No stress development/Tallinn)Automate Everything! (No stress development/Tallinn)
Automate Everything! (No stress development/Tallinn)
 
Escaping Automated Test Hell - One Year Later
Escaping Automated Test Hell - One Year LaterEscaping Automated Test Hell - One Year Later
Escaping Automated Test Hell - One Year Later
 
Effective approaches to web application security
Effective approaches to web application security Effective approaches to web application security
Effective approaches to web application security
 
Fault-tolerance on the Cheap: Making Systems That (Probably) Won't Fall Over
Fault-tolerance on the Cheap: Making Systems That (Probably) Won't Fall Over Fault-tolerance on the Cheap: Making Systems That (Probably) Won't Fall Over
Fault-tolerance on the Cheap: Making Systems That (Probably) Won't Fall Over
 
X page developer
X page developerX page developer
X page developer
 
4 colin walls - self-testing in embedded systems
4   colin walls - self-testing in embedded systems4   colin walls - self-testing in embedded systems
4 colin walls - self-testing in embedded systems
 
North east user group tour
North east user group tourNorth east user group tour
North east user group tour
 
Malware analysis as a hobby (Owasp Göteborg)
Malware analysis as a hobby (Owasp Göteborg)Malware analysis as a hobby (Owasp Göteborg)
Malware analysis as a hobby (Owasp Göteborg)
 

Destaque

2-2-16-PC-s5-PRICE-SHOW-Animated
2-2-16-PC-s5-PRICE-SHOW-Animated2-2-16-PC-s5-PRICE-SHOW-Animated
2-2-16-PC-s5-PRICE-SHOW-Animated
Sydney Hatch King
 
Hms seminar2 prez_krivosija_lisica
Hms seminar2 prez_krivosija_lisicaHms seminar2 prez_krivosija_lisica
Hms seminar2 prez_krivosija_lisica
Nina Krivošija
 

Destaque (13)

Actividad de aprendizaje 08 - Vanessa Florián Serrano
Actividad de aprendizaje 08 - Vanessa Florián SerranoActividad de aprendizaje 08 - Vanessa Florián Serrano
Actividad de aprendizaje 08 - Vanessa Florián Serrano
 
Belive
BeliveBelive
Belive
 
Origami (1)
Origami (1)Origami (1)
Origami (1)
 
Safe alliance powerpoint pdf
Safe alliance powerpoint pdfSafe alliance powerpoint pdf
Safe alliance powerpoint pdf
 
2-2-16-PC-s5-PRICE-SHOW-Animated
2-2-16-PC-s5-PRICE-SHOW-Animated2-2-16-PC-s5-PRICE-SHOW-Animated
2-2-16-PC-s5-PRICE-SHOW-Animated
 
Hms seminar2 prez_krivosija_lisica
Hms seminar2 prez_krivosija_lisicaHms seminar2 prez_krivosija_lisica
Hms seminar2 prez_krivosija_lisica
 
Self Directed Project in Kinesiology
Self Directed Project in KinesiologySelf Directed Project in Kinesiology
Self Directed Project in Kinesiology
 
Nord Pas-de-Calais
Nord Pas-de-CalaisNord Pas-de-Calais
Nord Pas-de-Calais
 
Sinestezi pra100
Sinestezi pra100Sinestezi pra100
Sinestezi pra100
 
Why Millennials Hate Your Mobile Ads
Why Millennials Hate Your Mobile AdsWhy Millennials Hate Your Mobile Ads
Why Millennials Hate Your Mobile Ads
 
Play for a Living - Sneak Preview
Play for a Living - Sneak PreviewPlay for a Living - Sneak Preview
Play for a Living - Sneak Preview
 
Presentación1 tic sobre el diseño instruccional
Presentación1 tic sobre el diseño instruccionalPresentación1 tic sobre el diseño instruccional
Presentación1 tic sobre el diseño instruccional
 
Web Training Aula 04: Introduction to Git
Web Training Aula 04: Introduction to GitWeb Training Aula 04: Introduction to Git
Web Training Aula 04: Introduction to Git
 

Semelhante a Tests antipatterns

Testing and TDD - KoJUG
Testing and TDD - KoJUGTesting and TDD - KoJUG
Testing and TDD - KoJUG
lburdz
 

Semelhante a Tests antipatterns (20)

Open source bridge testing antipatterns presentation
Open source bridge testing antipatterns presentationOpen source bridge testing antipatterns presentation
Open source bridge testing antipatterns presentation
 
PAC 2019 virtual Stephen Townshend
PAC 2019 virtual Stephen TownshendPAC 2019 virtual Stephen Townshend
PAC 2019 virtual Stephen Townshend
 
NYC MeetUp 10.9
NYC MeetUp 10.9NYC MeetUp 10.9
NYC MeetUp 10.9
 
Testing and TDD - KoJUG
Testing and TDD - KoJUGTesting and TDD - KoJUG
Testing and TDD - KoJUG
 
An introduction to unit testing
An introduction to unit testingAn introduction to unit testing
An introduction to unit testing
 
Testing As A Bottleneck - How Testing Slows Down Modern Development Processes...
Testing As A Bottleneck - How Testing Slows Down Modern Development Processes...Testing As A Bottleneck - How Testing Slows Down Modern Development Processes...
Testing As A Bottleneck - How Testing Slows Down Modern Development Processes...
 
Boston MeetUp 10.10
Boston MeetUp 10.10Boston MeetUp 10.10
Boston MeetUp 10.10
 
Software Testing 5/5
Software Testing 5/5Software Testing 5/5
Software Testing 5/5
 
Google test training
Google test trainingGoogle test training
Google test training
 
Creating testing tools to support development
Creating testing tools to support developmentCreating testing tools to support development
Creating testing tools to support development
 
Testing - How Vital and How Easy to use
Testing - How Vital and How Easy to useTesting - How Vital and How Easy to use
Testing - How Vital and How Easy to use
 
Agile Engineering Best Practices by Richard Cheng
Agile Engineering Best Practices by Richard ChengAgile Engineering Best Practices by Richard Cheng
Agile Engineering Best Practices by Richard Cheng
 
Need To Automate Test And Integration Beyond Current Limits?
Need To Automate Test And Integration Beyond Current Limits?Need To Automate Test And Integration Beyond Current Limits?
Need To Automate Test And Integration Beyond Current Limits?
 
Performant Django - Ara Anjargolian
Performant Django - Ara AnjargolianPerformant Django - Ara Anjargolian
Performant Django - Ara Anjargolian
 
Agile Engineering Sparker GLASScon 2015
Agile Engineering Sparker GLASScon 2015Agile Engineering Sparker GLASScon 2015
Agile Engineering Sparker GLASScon 2015
 
Whats In Your QA Tool Belt?
Whats In Your QA Tool Belt?Whats In Your QA Tool Belt?
Whats In Your QA Tool Belt?
 
Unit Tests are Overrated (NDCOslo 2013)
Unit Tests are Overrated (NDCOslo 2013)Unit Tests are Overrated (NDCOslo 2013)
Unit Tests are Overrated (NDCOslo 2013)
 
Production debugging web applications
Production debugging web applicationsProduction debugging web applications
Production debugging web applications
 
Next Generation Debugging
Next Generation DebuggingNext Generation Debugging
Next Generation Debugging
 
DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...
DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...
DX@Scale: Optimizing Salesforce Development and Deployment for large scale pr...
 

Último

Último (20)

GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 

Tests antipatterns