Testing Blog

Fixing a Test Hourglass

Monday, November 09, 2020
Share on Twitter Share on Facebook
Google
Labels: Alan Myrvold

4 comments :

  1. brabenetzNovember 9, 2020 at 11:23:00 PM PST

    Sorry,
    but I stopped reading after the first paragraph!
    If your end-to-end tests, are often slow, unreliable, and difficult to debug, then just fix the f****g Problem (Hint: it's most likely not the e2e tests).

    OK, split it up:

    - slow: There could be two reason for that: Either the test-code is slow, or the production code is slow. In either way it's a bug: Just fix it.
    Also parallelize the test gets a big performance boost, but for that, your application needs a correlationId (or something similar like orderId, requestId etc..).
    Parallelizing the tests has also the benefit that the tests points directly to mutli-threading bugs (Sure it's annoying if tests shows you that your code crap).

    - unreliable: And again: Just fix it, because you don't know if it is a real problem of the production-code or 'only' the test-code (It is easy to say: the "test" is unreliable ).

    - difficult to debug: How will you analyze Production-Bugs? You (normally) cannot "debug" the Production system.
    End to end tests prepares you for the real world and you have the change to prepare the code for this problems!

    On the other hand there are benefits:

    - black-box testing: As long as your application-API and DB doesn't change, you can refactor the code without touching the tests.
    This is not the case for Unit-Tests. For Unit-Test, even moving a function from one class to another, often means that you can throw away your test and write new one.
    Too much Unit-Tests is often the death of an application, because it prevents important refactorings.

    - Testing the "orchestration" BETWEEN all libraries, frameworks, (micro-)Services, infrastructure Many end-user-application doesn't need many custom code where unit-test would make sense.

    - Documentation: Yes, tests can be written that also NON-Developers understand the Scenarios. Look into Cucumber-Tests and Serenity-Reports.

    Important: End-2-End tests can have different scopes: eg. testing a singe (Micro-)service or a whole system composed by many services.
    This must be defined per project and communicated to the developers (less well defined Scopes is more).

    Do not understand me wrong, Unit-Testing is important in many situations. Especially for Libraries and Frameworks.
    But out in the real world there are also End-User Applications.
    On this Applications also the "orchestration" BETWEEN all libraries, frameworks, (micro-)Services, infrastructure must be tested.
    Such application has not much code where Unit-Tests makes even sense.
    Conclusion: An upside down "Test-Pyramide" makes more sense in that cases.

    At the end you must first master all variants of tests (unit, integration, e2e). Only after that you can decide which test serves you the most.

    ReplyDelete
    Replies
      Reply
  2. minhhoangNovember 10, 2020 at 5:14:00 PM PST

    I have read the article and I have a little concern. As far as I know about Cypress, it allows users to return the stub a response request by intercepting in the browser requests. So can I know the reasons you don't use that features instead of implement the fake backends.

    ReplyDelete
    Replies
      Reply
  3. UnknownDecember 1, 2020 at 7:39:00 AM PST

    I think you missed the point of this post.
    "End-to-end tests, however, are often slow, unreliable, and difficult to debug."
    This is well known and well documented. E2E tests are the last automated tests that get ran in a typical CI/CD pipeline. They are high dependency tests (no this is not a f****g problem, this is the nature of these tests) as they require the test environment to be setup with the latest version under test.
    You: "slow: There could be two reason for that: Either the test-code is slow, or the production code is slow. In either way it's a bug: Just fix it."
    Wrong - E2E tests are the slowest for feeding back issues to the development team. Not because of problems with the test or production code. Because in order to run an E2E test a feature/fix has to first of all have been: Developed > Unit tested > Code reviewed > Merged > Built > Test environment teared down > Deployed > Environment setup > Run E2E tests.
    Simplified steps, but they summarise the typical stages in getting a feature/fix into an environment that is ready for your E2E tests to run.
    E2E tests simulate the paths a user take through a system, logging in, navigation, CRUD actions etc...
    We need confidence that the critical paths through a system work, so we automate them, but because we are now simulating a users actions, we can't take programmatic shortcuts and need to strictly model the behaviour of the user, this is another reason the tests take longer to run.
    Another example - you just finish deploying a change to run your E2E tests and the developer realises their last commit never went it. In order to run the tests you now need the latest change and have to go through all the stages in your pipeline again to run the E2E tests.... slooooowww.
    You: "unreliable: And again: Just fix it, because you don't know if it is a real problem of the production-code or 'only' the test-code (It is easy to say: the "test" is unreliable )"
    E2E are heavily dependant on the many things, and therefore have multiple potential points of failure. The deployment server may not have started properly, somebody else may have been testing something on the environment when your tests were running, the deployment script may have been setup wrong. All of these could cause E2E tests to fail whereby the failure was due to neither a problem with the test or production code. UI automated tests are notoriously flaky, your test script tries to click a button and the page hadn't loaded in time...... unreliable!
    You: "difficult to debug: How will you analyze Production-Bugs? You (normally) cannot "debug" the Production system"
    Not sure if you disagree of agree here. E2E tests are difficult to debug - your system is a black box to your E2E test code, so all test failures have to be investigated and determined if the reason for the failure was due to dependency issues, problems in test code, problems in production code, flaky tests.
    You: "End to end tests prepares you for the real world and you have the change to prepare the code for this problems!"
    Agree! E2E are extremely valuable and provide a great confidence measure that the latest code changes aren't going to break anything. But the point of this post is to discuss how you can reduce an over reliance on E2E tests, not get rid of them completely. E2E tests ARE slow, unreliable, difficult to debug etc....
    Give me 10 E2E tests over a 1000 E2E tests any day of the week!
    If you don't have any unit or integration tests, then your regression checks responsibility sits with either E2E tests or manual testing. Necessary if you don't have any unit/integration tests, but not a position you really want to be in - aka upside down pyramid or ice cream cone.
    I would suggest reading the entire blog post (if you actually did stop at the first paragraph) it’s an excellent piece on how a team has approached migrating some of their tests further down the pyramid into the integration test layer.

    ReplyDelete
    Replies
      Reply
  4. oleksandr.podoliakoFebruary 8, 2021 at 1:18:00 PM PST

    Thank you for an interesting article. Faking backend is a great idea. I am sure that someday it will be a common approach in automation testing.

    Can you give more technical details? Did you have a separate environment where fake backend was deployed? How switching from real to fake backend was implemented? With different branches or was set up with build parameters?

    ReplyDelete
    Replies
      Reply
Add comment
Load more...

New comments are not allowed.

  

Labels


  • TotT 104
  • GTAC 61
  • James Whittaker 42
  • Misko Hevery 32
  • Code Health 31
  • Anthony Vallone 27
  • Patrick Copeland 23
  • Jobs 18
  • Andrew Trenk 13
  • C++ 11
  • Patrik Höglund 8
  • JavaScript 7
  • Allen Hutchison 6
  • George Pirocanac 6
  • Zhanyong Wan 6
  • Harry Robinson 5
  • Java 5
  • Julian Harty 5
  • Adam Bender 4
  • Alberto Savoia 4
  • Ben Yu 4
  • Erik Kuefler 4
  • Philip Zembrod 4
  • Shyam Seshadri 4
  • Chrome 3
  • Dillon Bly 3
  • John Thomas 3
  • Lesley Katzen 3
  • Marc Kaplan 3
  • Markus Clermont 3
  • Max Kanat-Alexander 3
  • Sonal Shah 3
  • APIs 2
  • Abhishek Arya 2
  • Alan Myrvold 2
  • Alek Icev 2
  • Android 2
  • April Fools 2
  • Chaitali Narla 2
  • Chris Lewis 2
  • Chrome OS 2
  • Diego Salas 2
  • Dori Reuveni 2
  • Jason Arbon 2
  • Jochen Wuttke 2
  • Kostya Serebryany 2
  • Marc Eaddy 2
  • Marko Ivanković 2
  • Mobile 2
  • Oliver Chang 2
  • Simon Stewart 2
  • Stefan Kennedy 2
  • Test Flakiness 2
  • Titus Winters 2
  • Tony Voellm 2
  • WebRTC 2
  • Yiming Sun 2
  • Yvette Nameth 2
  • Zuri Kemp 2
  • Aaron Jacobs 1
  • Adam Porter 1
  • Adam Raider 1
  • Adel Saoud 1
  • Alan Faulkner 1
  • Alex Eagle 1
  • Amy Fu 1
  • Anantha Keesara 1
  • Antoine Picard 1
  • App Engine 1
  • Ari Shamash 1
  • Arif Sukoco 1
  • Benjamin Pick 1
  • Bob Nystrom 1
  • Bruce Leban 1
  • Carlos Arguelles 1
  • Carlos Israel Ortiz García 1
  • Cathal Weakliam 1
  • Christopher Semturs 1
  • Clay Murphy 1
  • Dagang Wei 1
  • Dan Maksimovich 1
  • Dan Shi 1
  • Dan Willemsen 1
  • Dave Chen 1
  • Dave Gladfelter 1
  • David Bendory 1
  • David Mandelberg 1
  • Derek Snyder 1
  • Diego Cavalcanti 1
  • Dmitry Vyukov 1
  • Eduardo Bravo Ortiz 1
  • Ekaterina Kamenskaya 1
  • Elliott Karpilovsky 1
  • Elliotte Rusty Harold 1
  • Espresso 1
  • Felipe Sodré 1
  • Francois Aube 1
  • Gene Volovich 1
  • Google+ 1
  • Goran Petrovic 1
  • Goranka Bjedov 1
  • Hank Duan 1
  • Havard Rast Blok 1
  • Hongfei Ding 1
  • Jason Elbaum 1
  • Jason Huggins 1
  • Jay Han 1
  • Jeff Hoy 1
  • Jeff Listfield 1
  • Jessica Tomechak 1
  • Jim Reardon 1
  • Joe Allan Muharsky 1
  • Joel Hynoski 1
  • John Micco 1
  • John Penix 1
  • Jonathan Rockway 1
  • Jonathan Velasquez 1
  • Josh Armour 1
  • Julie Ralph 1
  • Kai Kent 1
  • Kanu Tewary 1
  • Karin Lundberg 1
  • Kaue Silveira 1
  • Kevin Bourrillion 1
  • Kevin Graney 1
  • Kirkland 1
  • Kurt Alfred Kluever 1
  • Manjusha Parvathaneni 1
  • Marek Kiszkis 1
  • Marius Latinis 1
  • Mark Ivey 1
  • Mark Manley 1
  • Mark Striebeck 1
  • Matt Lowrie 1
  • Meredith Whittaker 1
  • Michael Bachman 1
  • Michael Klepikov 1
  • Mike Aizatsky 1
  • Mike Wacker 1
  • Mona El Mahdy 1
  • Noel Yap 1
  • Palak Bansal 1
  • Patricia Legaspi 1
  • Per Jacobsson 1
  • Peter Arrenbrecht 1
  • Peter Spragins 1
  • Phil Norman 1
  • Phil Rollet 1
  • Pooja Gupta 1
  • Project Showcase 1
  • Radoslav Vasilev 1
  • Rajat Dewan 1
  • Rajat Jain 1
  • Rich Martin 1
  • Richard Bustamante 1
  • Roshan Sembacuttiaratchy 1
  • Ruslan Khamitov 1
  • Sam Lee 1
  • Sean Jordan 1
  • Sebastian Dörner 1
  • Sharon Zhou 1
  • Shiva Garg 1
  • Siddartha Janga 1
  • Simran Basi 1
  • Stan Chan 1
  • Stephen Ng 1
  • Tejas Shah 1
  • Test Analytics 1
  • Test Engineer 1
  • Tim Lyakhovetskiy 1
  • Tom O'Neill 1
  • Vojta Jína 1
  • automation 1
  • dead code 1
  • iOS 1
  • mutation testing 1


Archive


  • ►  2025 (1)
    • ►  Jan (1)
  • ►  2024 (13)
    • ►  Dec (1)
    • ►  Oct (1)
    • ►  Sep (1)
    • ►  Aug (1)
    • ►  Jul (1)
    • ►  May (3)
    • ►  Apr (3)
    • ►  Mar (1)
    • ►  Feb (1)
  • ►  2023 (14)
    • ►  Dec (2)
    • ►  Nov (2)
    • ►  Oct (5)
    • ►  Sep (3)
    • ►  Aug (1)
    • ►  Apr (1)
  • ►  2022 (2)
    • ►  Feb (2)
  • ►  2021 (3)
    • ►  Jun (1)
    • ►  Apr (1)
    • ►  Mar (1)
  • ▼  2020 (8)
    • ►  Dec (2)
    • ▼  Nov (1)
      • Fixing a Test Hourglass
    • ►  Oct (1)
    • ►  Aug (2)
    • ►  Jul (1)
    • ►  May (1)
  • ►  2019 (4)
    • ►  Dec (1)
    • ►  Nov (1)
    • ►  Jul (1)
    • ►  Jan (1)
  • ►  2018 (7)
    • ►  Nov (1)
    • ►  Sep (1)
    • ►  Jul (1)
    • ►  Jun (2)
    • ►  May (1)
    • ►  Feb (1)
  • ►  2017 (17)
    • ►  Dec (1)
    • ►  Nov (1)
    • ►  Oct (1)
    • ►  Sep (1)
    • ►  Aug (1)
    • ►  Jul (2)
    • ►  Jun (2)
    • ►  May (3)
    • ►  Apr (2)
    • ►  Feb (1)
    • ►  Jan (2)
  • ►  2016 (15)
    • ►  Dec (1)
    • ►  Nov (2)
    • ►  Oct (1)
    • ►  Sep (2)
    • ►  Aug (1)
    • ►  Jun (2)
    • ►  May (3)
    • ►  Apr (1)
    • ►  Mar (1)
    • ►  Feb (1)
  • ►  2015 (14)
    • ►  Dec (1)
    • ►  Nov (1)
    • ►  Oct (2)
    • ►  Aug (1)
    • ►  Jun (1)
    • ►  May (2)
    • ►  Apr (2)
    • ►  Mar (1)
    • ►  Feb (1)
    • ►  Jan (2)
  • ►  2014 (24)
    • ►  Dec (2)
    • ►  Nov (1)
    • ►  Oct (2)
    • ►  Sep (2)
    • ►  Aug (2)
    • ►  Jul (3)
    • ►  Jun (3)
    • ►  May (2)
    • ►  Apr (2)
    • ►  Mar (2)
    • ►  Feb (1)
    • ►  Jan (2)
  • ►  2013 (16)
    • ►  Dec (1)
    • ►  Nov (1)
    • ►  Oct (1)
    • ►  Aug (2)
    • ►  Jul (1)
    • ►  Jun (2)
    • ►  May (2)
    • ►  Apr (2)
    • ►  Mar (2)
    • ►  Jan (2)
  • ►  2012 (11)
    • ►  Dec (1)
    • ►  Nov (2)
    • ►  Oct (3)
    • ►  Sep (1)
    • ►  Aug (4)
  • ►  2011 (39)
    • ►  Nov (2)
    • ►  Oct (5)
    • ►  Sep (2)
    • ►  Aug (4)
    • ►  Jul (2)
    • ►  Jun (5)
    • ►  May (4)
    • ►  Apr (3)
    • ►  Mar (4)
    • ►  Feb (5)
    • ►  Jan (3)
  • ►  2010 (37)
    • ►  Dec (3)
    • ►  Nov (3)
    • ►  Oct (4)
    • ►  Sep (8)
    • ►  Aug (3)
    • ►  Jul (3)
    • ►  Jun (2)
    • ►  May (2)
    • ►  Apr (3)
    • ►  Mar (3)
    • ►  Feb (2)
    • ►  Jan (1)
  • ►  2009 (54)
    • ►  Dec (3)
    • ►  Nov (2)
    • ►  Oct (3)
    • ►  Sep (5)
    • ►  Aug (4)
    • ►  Jul (15)
    • ►  Jun (8)
    • ►  May (3)
    • ►  Apr (2)
    • ►  Feb (5)
    • ►  Jan (4)
  • ►  2008 (75)
    • ►  Dec (6)
    • ►  Nov (8)
    • ►  Oct (9)
    • ►  Sep (8)
    • ►  Aug (9)
    • ►  Jul (9)
    • ►  Jun (6)
    • ►  May (6)
    • ►  Apr (4)
    • ►  Mar (4)
    • ►  Feb (4)
    • ►  Jan (2)
  • ►  2007 (41)
    • ►  Oct (6)
    • ►  Sep (5)
    • ►  Aug (3)
    • ►  Jul (2)
    • ►  Jun (2)
    • ►  May (2)
    • ►  Apr (7)
    • ►  Mar (5)
    • ►  Feb (5)
    • ►  Jan (4)

Feed

  • Google
  • Privacy
  • Terms