From 7bc9431193da6890fe90a5c444fa882379695cdf Mon Sep 17 00:00:00 2001 From: Harry Date: Mon, 24 Feb 2025 04:32:09 +0000 Subject: [PATCH 1/7] start, better intro, delete some stuff, a bit of work on 'whats good about unit tests' bit --- chapter_27_hot_lava.asciidoc | 204 +++++++++++++---------------------- 1 file changed, 77 insertions(+), 127 deletions(-) diff --git a/chapter_27_hot_lava.asciidoc b/chapter_27_hot_lava.asciidoc index 43ce4ea6..f44663af 100644 --- a/chapter_27_hot_lava.asciidoc +++ b/chapter_27_hot_lava.asciidoc @@ -11,95 +11,35 @@ ______________________________________________________________ ((("unit tests", "vs. integration tests", secondary-sortas="integration tests"))) Unless you've been through <>, almost all of the "unit" tests in the book -should perhaps have been called _integration_ tests, -because they either rely on the database or use the Django Test Client, -which does too much magic with the middleware layers that sit between requests, +should arguably have been called _integration_ tests, +because they rely on the database. +Some people would also worry about the Django Test Client, +which does a lot of "magic" with the middleware layers that sit between requests, responses, and view functions. -There is an argument that a true unit test should always be isolated, -because it's meant to test a single unit of software. +In a more purist conception, a unit test should test a "unit" of code, +in isolation from any other systems or dependencies, +and the database is almost always categorised as a dependency. If it touches the database, it can't be a unit test. -The database is hot lava! -Some TDD veterans say you should strive to write "pure", isolated unit tests -wherever possible, instead of writing integrated tests. It's one of the -ongoing (occasionally heated) debates in the testing community. +The database is hot lava! As Casey Kinsey put it in a memorable DjangoCon talk. +Once an application starts to grow beyond a certain size, +involving the database in every single test starts to carry an unacceptable cost, +in terms of the speed of execution of nothing else; +Casey's company was struggling with test suites that took several hours. +At Kraken, the full test suite does only take about 45 minutes, +but that's only thanks to a quite frankly ridiculous level of parallelisation +and associated expenditure on CI. -Being merely a young whippersnapper myself, -I'm only partway towards all the subtleties of the argument. -But in this chapter, I'd like to talk about why people feel strongly about it, -and try to give you some idea of when you can get away with muddling through -with integrated tests (which I confess I do a lot of!), -and when it's worth striving for more "pure" unit tests. +In this chapter, we'll discuss some of the pros & cons and trade-offs +of different types of tests for different sizes of applications, +and explain what the "Test Pyramid" is. -NOTE: I revisited some of these issues in my - https://www.cosmicpython.com[second book on architecture patterns], which - outlines some strategies for getting the right balance between different - types of test. +=== -.Terminology: Different Types of Test -****************************************************************************** - -Isolated tests ("pure" unit tests) vs. integrated tests:: - The primary purpose of a unit test should be to verify the correctness - of the logic of your application. - An 'isolated' test is one that tests exactly one chunk of code, and whose - success or failure does not depend on any other external code. This is what - I call a "pure" unit test: a test for a single function, for example, - written in such a way that only that function can make it fail. If the - function depends on another system, and breaking that system breaks our - test, we have an 'integrated' test. That system could be an external - system, like a database, but it could also be another function which we - don't control. In either case, if breaking the system makes our test fail, - our test is not properly isolated; it is not a "pure" unit test. That's - not necessarily a bad thing, but it may mean the test is doing two jobs at - once. - - -Integration tests:: - An integration test checks that the code you control is integrated - correctly with some external system which you don't control. - 'Integration' tests are typically also 'integrated' tests. - - -System tests:: - If an integration test checks the integration with one external system, - a system test checks the integration of multiple systems in your - application--for example, checking that we've wired up our database, - static files, and server config together in such a way that they all work. - ((("system tests"))) - - -Functional tests and acceptance tests:: - An acceptance test is meant to test that our system works from the point - of view of the user ("would the user accept this behaviour?"). It's - hard to write an acceptance test that's not a full-stack, end-to-end test. - We've been using our functional tests to play the role of both acceptance - tests and system tests. - ((("functional tests (FTs)", "vs. acceptance and system tests", secondary-sortas="acceptance and system tests"))) - - - -****************************************************************************** - - -If you'll forgive the pretentious philosophical terminology, I'd like to -structure our discussion of these issues like a Hegelian dialectic: - -* The Thesis: the case for "pure", fast unit tests. - -* The Antithesis: some of the risks associated with a (naive) pure unit testing - approach. - -* The Synthesis: a discussion of best practices like "Ports and Adapters" - or "Functional Core, Imperative Shell", and of just what it is that we want - from our tests, anyway. - - -=== Thesis: Unit Tests Are Superfast and Good Besides That - +// instagram still runs on django ((("unit tests", "benefits of “pure”", id="UTbenefit26"))) One of the things you often hear about unit tests is that they're much faster. @@ -112,71 +52,80 @@ but it's worth exploring the theme of speed. Other things being equal, the faster your unit tests run, the better. To a lesser extent, the faster _all_ your tests run, the better. -I've outlined the TDD test/code cycle in this book. You've started to get a -feel for the TDD workflow, the way you flick between writing tiny amounts of -code and running your tests. You end up running your unit tests several times -a minute, and your functional tests several times a day. +I've outlined the TDD test/code cycle in this book. +You've started to get a feel for the TDD workflow, +the way you flick between writing tiny amounts of code and running your tests. +You end up running your unit tests several times a minute, +and your functional tests several times a day. -So, on a very basic level, the longer they take, the more time you spend -waiting for your tests, and that will slow down your development. But -there's more to it than that. +So, on a very basic level, the longer they take, the more time you spend waiting +for your tests, and that will slow down your development. +But there's more to it than that. ==== The Holy Flow State -Thinking sociology for a moment, we programmers have our own culture, and our -own tribal religion in a way. It has many congregations within it, such as the -cult of TDD to which you are now initiated. There are the followers of vi and -the heretics of emacs. But one thing we all agree on, one particular spiritual -practice, our own transcendental meditation, is the holy flow state. That -feeling of pure focus, of concentration, where hours pass like no time at all, -where code flows naturally from our fingers, where problems are just tricky -enough to be interesting but not so hard that they defeat us... - -There is absolutely no hope of achieving flow if you spend your time waiting -for a slow test suite to run. Anything longer than a few seconds and you're -going to let your attention wander, you context-switch, and the flow state is -gone. And the flow state is a fragile dream. Once it's gone, it takes at -least 15 minutes to live again. +Thinking sociology for a moment, we programmers have our own culture, +and our own tribal religion in a way. +It has many congregations within it +such as the cult of TDD to which you are now initiated. +There are the followers of vi and the heretics of emacs. +But one thing we all agree on, one particular spiritual practice, +our own transcendental meditation, is the holy flow state. +That feeling of pure focus, of concentration, +where hours pass like no time at all, +where code flows naturally from our fingers, +where problems are just tricky enough to be interesting +but not so hard that they defeat us... + +There is absolutely no hope of achieving flow +if you spend your time waiting for a slow test suite to run. +Anything longer than a few seconds and you're going to let your attention wander, +you context-switch, and the flow state is gone. +And the flow state is a fragile dream. +Once it's gone, it takes at least 15 minutes to live again. ==== Slow Tests Don't Get Run as Often, Which Causes Bad Code -If your test suite is slow and ruins your concentration, the danger is that -you'll start to avoid running your tests, which may lead to bugs getting -through. Or, it may lead to our being shy of refactoring the code, -since we know that any refactor will mean having to wait ages while all the -tests run. In either case, bad code can be the result. +If your test suite is slow and ruins your concentration, +the danger is that you'll start to avoid running your tests, +which may lead to bugs getting through. +Or, it may lead to our being shy of refactoring the code, +since we know that any refactor will mean having to wait for ages while all the tests run. +In either case, bad code can be the result. -==== We're Fine Now, but Integrated Tests Get Slower Over Time +==== We're Fine Now, but Integration Tests Get Slower Over Time -You might be thinking, OK, but our test suite has lots of integrated +You might be thinking, OK, but our test suite has lots of integration tests in it--over 50 of them, and it only takes 0.2 seconds to run. -But remember, we've got a very simple app. Once it starts to get more -complex, as your database grows more and more tables and columns, integrated -tests will get slower and slower. Having Django reset the database between -each test will take longer and longer. +But remember, we've got a very simple app. +Once it starts to get more complex, +as your database grows more and more tables and columns, +integration tests will get slower and slower. +Having Django reset the database between each test will take longer and longer. // TODO mention Kraken tests ==== Don't Take It from Me - Gary Bernhardt, a man with far more experience of testing than me, put these points eloquently in a talk called -https://www.youtube.com/watch?v=RAxiiRPHS9k[Fast Test, Slow Test]. I encourage -you to watch it. +https://www.youtube.com/watch?v=RAxiiRPHS9k[Fast Test, Slow Test]. +I encourage you to watch it. ==== And Unit Tests Drive Good Design -But perhaps more importantly than any of this, remember the lesson from -<>. Going through the process of writing good, isolated -unit tests can help us drive out better designs for our code, by forcing us -to identify dependencies, and encouraging us towards a decoupled architecture +But perhaps more importantly than any of this, +remember the lesson from <>. +Going through the process of writing good, isolated unit tests +can help us drive out better designs for our code, +by forcing us to identify dependencies, +and encouraging us towards a decoupled architecture, in a way that integrated tests don't. ((("", startref="UTbenefit26"))) @@ -185,18 +134,19 @@ in a way that integrated tests don't. === The Problems with "Pure" Unit Tests ((("unit tests", "drawbacks of “pure”"))) -All of this comes with a huge "but". Writing isolated united tests comes with -its own hazards, particularly if, like you or me, we are not yet advanced -TDD'ers. +All of this comes with a huge "but". +Writing isolated unit tests comes with its own pitfalls, +and avoiding them is a skill that takes time to develop. -==== Isolated Tests Can Be Harder to Read and Write +==== Mocky Tests Can Be Harder to Read and Write Cast your mind back to the first isolated unit test we wrote. Wasn't it ugly? -Admittedly, things improved when we refactored things out into the forms, but -imagine if we hadn't followed through? We'd have been left with a rather -unreadable test in our codebase. And even the final version of the tests we -ended up with contain some pretty mind-bending bits. +Admittedly, things improved when we refactored things out into the forms, +but imagine if we hadn't followed through? +We'd have been left with a rather unreadable test in our codebase. +And even the final version of the tests we ended up with +contain some pretty mind-bending bits. ==== Isolated Tests Don't Automatically Test Integration From 1d3329f9d8c913031f1f440f82e39774403a2dc2 Mon Sep 17 00:00:00 2001 From: Harry Date: Mon, 24 Feb 2025 04:37:40 +0000 Subject: [PATCH 2/7] reformat the pros+cons table --- chapter_27_hot_lava.asciidoc | 64 ++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/chapter_27_hot_lava.asciidoc b/chapter_27_hot_lava.asciidoc index f44663af..3972f3e0 100644 --- a/chapter_27_hot_lava.asciidoc +++ b/chapter_27_hot_lava.asciidoc @@ -36,7 +36,7 @@ of different types of tests for different sizes of applications, and explain what the "Test Pyramid" is. -=== +=== Something // instagram still runs on django @@ -223,24 +223,27 @@ tell us our application is correct. ==== Clean, Maintainable Code -We want our code to obey rules like YAGNI and DRY. We want code that -clearly expresses its intentions, which is broken up into sensible components -that have well-defined responsibilities and are easily understood. We expect -our tests to give us the confidence to refactor our application constantly, -so that we're never scared to try to improve its design, and we would also -like it if they would actively help us to find the right design. +We want our code to obey rules like YAGNI and DRY. +We want code that clearly expresses its intentions, +which is broken up into sensible components +that have well-defined responsibilities and are easily understood. +We want to keep complexity at bay, and cognitive load to a minimum. +We expect our tests to give us the confidence to refactor our application constantly, +so that we're never scared to try to improve its design, +and we would also like it if they would actively help us to find the right design. ==== Productive Workflow Finally, we want our tests to help enable a fast and productive workflow. -We want them to help take some of the stress out of development, and we want -them to protect us from stupid mistakes. We want them to help keep us -in the "flow" state not just because we enjoy it, but because it's highly -productive. We want our tests to give us feedback about our work as quickly -as possible, so that we can try out new ideas and evolve them quickly. And -we don't want to feel like our tests are more of a hindrance than a help when -it comes to evolving our codebase. +We want them to help take some of the stress out of development, +and we want them to protect us from stupid mistakes. +We want them to help keep us in the "flow" state not just because we enjoy it, +but because it's highly productive. +We want our tests to give us feedback about our work as quickly as possible, +so that we can try out new ideas and evolve them quickly. +And we don't want to feel like our tests are more of a hindrance than a help +when it comes to evolving our codebase. ==== Evaluate Your Tests Against the Benefits You Want from Them @@ -258,23 +261,34 @@ you can make some [keep-together]#decisions#. |================ |Objective|Some considerations -|'Correctness' +|_Correctness_ a| -* Do I have enough functional tests to reassure myself that my application 'really' works, from the point of view of the user? -* Am I testing all the edge cases thoroughly? This feels like a job for low-level, isolated tests. -* Do I have tests that check whether all my components fit together properly? Could some integrated tests do this, or are functional tests enough? - -|'Clean, maintainable code' +* Do I have enough functional tests to reassure myself that my application _really_ works, + from the point of view of the user? +* Am I testing all the edge cases thoroughly? + This feels like a job for low-level, isolated tests. +* Do I have tests that check whether all my components fit together properly? + Could some integrations tests do this, or are functional tests enough? + +|_Clean, maintainable code_ a| * Are my tests giving me the confidence to refactor my code, fearlessly and frequently? -* Are my tests helping me to drive out a good design? If I have a lot of integrated tests and few isolated tests, are there any parts of my application where putting in the effort to write more isolated tests would give me better feedback about my design? +* Are my tests helping me to drive out a good design? + If I have a lot of integration tests and few isolated tests, + are there any parts of my application where putting in the effort + to write more isolated tests would give me better feedback about my design? -|'Productive workflow' +|_Productive workflow_ a| -* Are my feedback cycles as fast as I would like them? When do I get warned about bugs, and is there any practical way to make that happen sooner? -* If I have a lot of high-level, functional tests that take a long time to run, and I have to wait overnight to get feedback about accidental regressions, is there some way I could write some faster tests, integrated tests perhaps, that would get me feedback quicker? +* Are my feedback cycles as fast as I would like them? + When do I get warned about bugs, + and is there any practical way to make that happen sooner? +* If I have a lot of high-level, functional tests that take a long time to run, + and I have to wait overnight to get feedback about accidental regressions, + is there some way I could write some faster tests that would get me feedback quicker? * Can I run a subset of the full test suite when I need to? -* Am I spending too much time waiting for tests to run, and thus less time in a productive flow state? +* Am I spending too much time waiting for tests to run, + and thus less time in a productive flow state? |================ From b5c001554bf117858fc869781c45d4df4d886324 Mon Sep 17 00:00:00 2001 From: Harry Date: Mon, 24 Feb 2025 05:04:13 +0000 Subject: [PATCH 3/7] notalot --- chapter_27_hot_lava.asciidoc | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/chapter_27_hot_lava.asciidoc b/chapter_27_hot_lava.asciidoc index 3972f3e0..bce8d884 100644 --- a/chapter_27_hot_lava.asciidoc +++ b/chapter_27_hot_lava.asciidoc @@ -25,7 +25,7 @@ If it touches the database, it can't be a unit test. The database is hot lava! As Casey Kinsey put it in a memorable DjangoCon talk. Once an application starts to grow beyond a certain size, involving the database in every single test starts to carry an unacceptable cost, -in terms of the speed of execution of nothing else; +in terms of the speed of execution if nothing else; Casey's company was struggling with test suites that took several hours. At Kraken, the full test suite does only take about 45 minutes, but that's only thanks to a quite frankly ridiculous level of parallelisation @@ -35,16 +35,25 @@ In this chapter, we'll discuss some of the pros & cons and trade-offs of different types of tests for different sizes of applications, and explain what the "Test Pyramid" is. +//// +PLAN: +- unit tests vs integration tests +- the problem with django +- slow tests + hot lava +- the test pyramid +- do an analysis of our app +- talk about the django sweet spot +- what do we want from tests +- pros and cons table +- advertise my book +//// -=== Something +=== On the Benefits of a Fast Test Suite // instagram still runs on django -((("unit tests", "benefits of “pure”", id="UTbenefit26"))) -One of the things you often hear about unit tests is that they're much faster. -I don't think that's actually the primary benefit of unit tests, -but it's worth exploring the theme of speed. +Let's talk for a minute about the benefits of fast tests. ==== Faster Tests Mean Faster Development @@ -109,11 +118,10 @@ Having Django reset the database between each test will take longer and longer. // TODO mention Kraken tests - ==== Don't Take It from Me -Gary Bernhardt, a man with far more experience of testing than me, put these -points eloquently in a talk called +Gary Bernhardt, who has been in the testing game much longer that I have, +put these points eloquently in a talk called https://www.youtube.com/watch?v=RAxiiRPHS9k[Fast Test, Slow Test]. I encourage you to watch it. From dcee128bc2ed24dfc752982d744e3263ddf5aa9c Mon Sep 17 00:00:00 2001 From: Harry Date: Wed, 26 Feb 2025 17:18:04 +0000 Subject: [PATCH 4/7] a bit in 27 --- chapter_27_hot_lava.asciidoc | 92 +++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 38 deletions(-) diff --git a/chapter_27_hot_lava.asciidoc b/chapter_27_hot_lava.asciidoc index bce8d884..8166128a 100644 --- a/chapter_27_hot_lava.asciidoc +++ b/chapter_27_hot_lava.asciidoc @@ -13,27 +13,25 @@ Unless you've been through <>, almost all of the "unit" tests in the book should arguably have been called _integration_ tests, because they rely on the database. -Some people would also worry about the Django Test Client, -which does a lot of "magic" with the middleware layers that sit between requests, -responses, and view functions. +A "real" unit test should only engage with the unit of code under test, +and not with any external systems like databases. -In a more purist conception, a unit test should test a "unit" of code, -in isolation from any other systems or dependencies, -and the database is almost always categorised as a dependency. -If it touches the database, it can't be a unit test. +If you start reading around in the world of testing and TDD, +you'll soon come across people talking about the need to have more unit tests, +and fewer integration tests and functional tests. -The database is hot lava! As Casey Kinsey put it in a memorable DjangoCon talk. -Once an application starts to grow beyond a certain size, -involving the database in every single test starts to carry an unacceptable cost, -in terms of the speed of execution if nothing else; -Casey's company was struggling with test suites that took several hours. -At Kraken, the full test suite does only take about 45 minutes, -but that's only thanks to a quite frankly ridiculous level of parallelisation -and associated expenditure on CI. +This is often expressed as the "Test Pyramid", +whereby your test coverage is achieved with a large base of unit tests, +a smaller number of integration tests in the middle, +and a tiny number of functional tests at the top: <>. + +[[test_pyramid]] +.The Test Pyramid +image::images/test_pyramid.png["A Pyramid shape, with a large bottom layer of unit tests, a medium layer of integration tests, and a small peak of FTs"] + +Let's talk about why people say this, +and the trade-offs between different types of tests. -In this chapter, we'll discuss some of the pros & cons and trade-offs -of different types of tests for different sizes of applications, -and explain what the "Test Pyramid" is. //// PLAN: @@ -48,11 +46,33 @@ PLAN: - advertise my book //// +=== The Problem With Integration Tests -=== On the Benefits of a Fast Test Suite +As we've seen, Django tends to encourage us towards writing integration tests. +The Django test runner sets up a clean database for each test, +and tools like the Django test client make it easy to interact with our application +from top layer in, thus engaging with all the layers of the stack. + +The trouble is that once an application starts to grow beyond a certain size, +involving the database in every single test starts to carry an unacceptable cost, +in terms of the speed of execution if nothing else; +The database is hot lava, as Casey Kinsey put it in a memorable DjangoCon talk. +Casey's company was struggling with test suites that took several hours. +At PythonAnywhere, we had a functional test suite, at one point, that we only ran overnight. +At Kraken, the full test suite does only take about 45 minutes, +but that's only thanks to a quite frankly ridiculous level of parallelisation +and associated expenditure on CI. +But running even a single integration test takes a minimum of 25 seconds, +because of the size and complexity of the project (and its database). + +Does that mean we've been doing it wrong all along, as we go through the book? +Not necessarily. // instagram still runs on django + +=== On the Benefits of a Fast Test Suite + Let's talk for a minute about the benefits of fast tests. @@ -92,31 +112,22 @@ if you spend your time waiting for a slow test suite to run. Anything longer than a few seconds and you're going to let your attention wander, you context-switch, and the flow state is gone. And the flow state is a fragile dream. -Once it's gone, it takes at least 15 minutes to live again. +Once it's gone, it takes a while to get it back. -==== Slow Tests Don't Get Run as Often, Which Causes Bad Code +==== Slow Tests Means Slower Feedback, Which Causes Bad Code If your test suite is slow and ruins your concentration, the danger is that you'll start to avoid running your tests, -which may lead to bugs getting through. -Or, it may lead to our being shy of refactoring the code, -since we know that any refactor will mean having to wait for ages while all the tests run. -In either case, bad code can be the result. - - -==== We're Fine Now, but Integration Tests Get Slower Over Time +which means your feedback cycle gets even slower, +as you have to wait for CI to catch any accidental bugs or regressions +you might have introduced. -You might be thinking, OK, but our test suite has lots of integration -tests in it--over 50 of them, and it only takes 0.2 seconds to run. +In addition, it can lead to becoming shy of refactoring our code, +since we know that any refactor will mean having to wait for ages while all the tests run. -But remember, we've got a very simple app. -Once it starts to get more complex, -as your database grows more and more tables and columns, -integration tests will get slower and slower. -Having Django reset the database between each test will take longer and longer. +In either case, bad code can be the result. -// TODO mention Kraken tests ==== Don't Take It from Me @@ -126,6 +137,12 @@ https://www.youtube.com/watch?v=RAxiiRPHS9k[Fast Test, Slow Test]. I encourage you to watch it. + +//// +adfas + +///// + ==== And Unit Tests Drive Good Design But perhaps more importantly than any of this, @@ -135,8 +152,6 @@ can help us drive out better designs for our code, by forcing us to identify dependencies, and encouraging us towards a decoupled architecture, in a way that integrated tests don't. -((("", startref="UTbenefit26"))) - === The Problems with "Pure" Unit Tests @@ -199,6 +214,7 @@ to test our form, mocking out two Django model classes and using `side_effect` to check on the state of the world. If you're writing code that's totally under your own control, you're likely to design your internal APIs so that they are cleaner and require fewer contortions to test. +//// From 614670a15915395d3cbbe676e1107b71fd663a26 Mon Sep 17 00:00:00 2001 From: Harry Date: Wed, 26 Feb 2025 18:01:15 +0000 Subject: [PATCH 5/7] moar --- chapter_27_hot_lava.asciidoc | 249 ++++++++--------------------------- 1 file changed, 56 insertions(+), 193 deletions(-) diff --git a/chapter_27_hot_lava.asciidoc b/chapter_27_hot_lava.asciidoc index 8166128a..f2f95e9d 100644 --- a/chapter_27_hot_lava.asciidoc +++ b/chapter_27_hot_lava.asciidoc @@ -46,203 +46,75 @@ PLAN: - advertise my book //// -=== The Problem With Integration Tests - -As we've seen, Django tends to encourage us towards writing integration tests. -The Django test runner sets up a clean database for each test, -and tools like the Django test client make it easy to interact with our application -from top layer in, thus engaging with all the layers of the stack. - -The trouble is that once an application starts to grow beyond a certain size, -involving the database in every single test starts to carry an unacceptable cost, -in terms of the speed of execution if nothing else; -The database is hot lava, as Casey Kinsey put it in a memorable DjangoCon talk. -Casey's company was struggling with test suites that took several hours. -At PythonAnywhere, we had a functional test suite, at one point, that we only ran overnight. -At Kraken, the full test suite does only take about 45 minutes, -but that's only thanks to a quite frankly ridiculous level of parallelisation -and associated expenditure on CI. -But running even a single integration test takes a minimum of 25 seconds, -because of the size and complexity of the project (and its database). - -Does that mean we've been doing it wrong all along, as we go through the book? -Not necessarily. - -// instagram still runs on django - - -=== On the Benefits of a Fast Test Suite - -Let's talk for a minute about the benefits of fast tests. - - -==== Faster Tests Mean Faster Development - -Other things being equal, the faster your unit tests run, the better. -To a lesser extent, the faster _all_ your tests run, the better. - -I've outlined the TDD test/code cycle in this book. -You've started to get a feel for the TDD workflow, -the way you flick between writing tiny amounts of code and running your tests. -You end up running your unit tests several times a minute, -and your functional tests several times a day. - -So, on a very basic level, the longer they take, the more time you spend waiting -for your tests, and that will slow down your development. -But there's more to it than that. - - -==== The Holy Flow State - -Thinking sociology for a moment, we programmers have our own culture, -and our own tribal religion in a way. -It has many congregations within it -such as the cult of TDD to which you are now initiated. -There are the followers of vi and the heretics of emacs. -But one thing we all agree on, one particular spiritual practice, -our own transcendental meditation, is the holy flow state. -That feeling of pure focus, of concentration, -where hours pass like no time at all, -where code flows naturally from our fingers, -where problems are just tricky enough to be interesting -but not so hard that they defeat us... - -There is absolutely no hope of achieving flow -if you spend your time waiting for a slow test suite to run. -Anything longer than a few seconds and you're going to let your attention wander, -you context-switch, and the flow state is gone. -And the flow state is a fragile dream. -Once it's gone, it takes a while to get it back. - - -==== Slow Tests Means Slower Feedback, Which Causes Bad Code - -If your test suite is slow and ruins your concentration, -the danger is that you'll start to avoid running your tests, -which means your feedback cycle gets even slower, -as you have to wait for CI to catch any accidental bugs or regressions -you might have introduced. - -In addition, it can lead to becoming shy of refactoring our code, -since we know that any refactor will mean having to wait for ages while all the tests run. - -In either case, bad code can be the result. - - -==== Don't Take It from Me - -Gary Bernhardt, who has been in the testing game much longer that I have, -put these points eloquently in a talk called -https://www.youtube.com/watch?v=RAxiiRPHS9k[Fast Test, Slow Test]. -I encourage you to watch it. - - - -//// -adfas - -///// - -==== And Unit Tests Drive Good Design - -But perhaps more importantly than any of this, -remember the lesson from <>. -Going through the process of writing good, isolated unit tests -can help us drive out better designs for our code, -by forcing us to identify dependencies, -and encouraging us towards a decoupled architecture, -in a way that integrated tests don't. - - -=== The Problems with "Pure" Unit Tests - -((("unit tests", "drawbacks of “pure”"))) -All of this comes with a huge "but". -Writing isolated unit tests comes with its own pitfalls, -and avoiding them is a skill that takes time to develop. - - -==== Mocky Tests Can Be Harder to Read and Write - -Cast your mind back to the first isolated unit test we wrote. Wasn't it ugly? -Admittedly, things improved when we refactored things out into the forms, -but imagine if we hadn't followed through? -We'd have been left with a rather unreadable test in our codebase. -And even the final version of the tests we ended up with -contain some pretty mind-bending bits. - - -==== Isolated Tests Don't Automatically Test Integration - -As we saw a little later on, isolated tests by their nature only test the -unit under test, in isolation. They won't test the integration between -your units. - -This problem is well known, and there are ways of mitigating it. But, as -we saw, those mitigations involve a fair bit of hard work on the part of -the programmer--you need to remember to keep track of the interfaces -between your units, to identify the implicit contract that each component -needs to honour, and to write tests for those contracts as well -as for the internal functionality of your unit. - - -==== Unit Tests Seldom Catch Unexpected Bugs - -Unit tests will help you catch off-by-one errors and logic snafus, which are -the kinds of bugs we know we introduce all the time, so in a way we are -expecting them. But they don't warn you about some of the more unexpected -bugs. They won't remind you when you forgot to create a database migration. -They won't tell you when the middleware layer is doing some clever HTML-entity -escaping that's interfering with the way your data is rendered...something -like Donald Rumsfeld's unknown unknowns? - - -==== Mocky Tests Can Become Closely Tied to Implementation - -And finally, mocky tests can become very tightly coupled with the implementation. -If you choose to use `List.objects.create()` to build your objects but your -mocks are expecting you to use `List()` and `.save()`, you'll get failing tests -even though the actual effect of the code would be the same. If you're not -careful, this can start to work against one of the supposed benefits of having -tests, which was to encourage refactoring. You can find yourself having to -change dozens of mocky tests and contract tests when you want to change an -internal API. - -Notice that this may be more of a problem when you're dealing with an API -you don't control. You may remember the contortions we had to go through -to test our form, mocking out two Django model classes and using `side_effect` -to check on the state of the world. If you're writing code that's totally -under your own control, you're likely to design your internal APIs so that -they are cleaner and require fewer contortions to test. -//// - - +.Terminology: Different Types of Test +****************************************************************************** -==== But All These Problems Can Be Overcome +There's no standards body that we can go to for official definitions, +so there is a certain amount of fluidity to the way people use these terms, +but here's my best attempt at reflecting a consensus view +on what the different types of tests are + +Unit tests:: + The primary purpose of a unit test should be to verify the correctness + of a single "unit" of your code + People disagree over the optimal size of the unit, + but they tend to agree that "the database" is not usually part of "your code". + These tests should be "isolated" from any external + + +Integration tests:: + An integration test checks that the code you control is integrated + correctly with some external system which you don't control. + + +Functional tests (AKA End-to-end or System tests):: + If an integration test checks the interaaction with _one_ external system, + an end-to-end (aka system test) attempts to test that _all_ + the different components of the system are wired together. + In our app, the FTs check that our HTML renders correctly in a browser, + that any Javascript works, that our application is configured correctly, + and that it works all the way down to the database. + ((("system tests"))) + ((("end-to-end tests"))) + + +There are also acceptance tests, but they're an orthogonal categorisation system.footnote:[ +An acceptance test is meant to test that our system works +from the point of view of the user ("would the user accept this behaviour?"). +In our example, the FTs are playing the role of acceptance tests, +because we've chosen to cover almost all of the behaviour of our application with FTs. +But, as we'll see, that's not a choice you _have_ to make, +and under a different approach approach to test coverage, +_any_ type of test can play the role of an acceptance test. +The acceptance test is the test you can point to when a stakeholder +like a product owner comes along and says +"where is this business requirement or acceptance criterion tested?". +Some tests are only really meaningful to programmers, +they are instrumental to the ultimate goal. +Others are written in a way that's much more reflective of the user experience. +] -But, isolation advocates will come back and say, all that stuff can be -mitigated; you just need to get better at writing isolated tests, and, remember -the holy flow state? The holy flow state! -So do we have to choose one side or the other? -(((range="endofrange", startref="ix_unittestproscons"))) +****************************************************************************** -=== Synthesis: What Do We Want from Our Tests, Anyway? +=== What Do We Want from Our Tests, Anyway? ((("testing best practices"))) ((("Test-Driven Development (TDD)", "test goals"))) -Let's step back and have a think about what benefits we want our tests to -deliver. Why are we writing them in the first place? +Let's step back and have a think about what benefits we want our tests to deliver. +Why are we writing them in the first place? ==== Correctness We want our application to be free of bugs--both low-level logic errors, -like off-by-one errors, and high-level bugs like the software not ultimately delivering what our users want. We want to find out if we ever introduce -regressions which break something that used to work, and we want to find -that out before our users see something broken. We expect our tests to -tell us our application is correct. +like off-by-one errors, and high-level bugs +like the software not ultimately delivering what our users want. +We want to find out if we ever introduce regressions +which break something that used to work, +and we want to find that out before our users see something broken. +We expect our tests to tell us our application's behaviour is correct. ==== Clean, Maintainable Code @@ -270,15 +142,6 @@ And we don't want to feel like our tests are more of a hindrance than a help when it comes to evolving our codebase. -==== Evaluate Your Tests Against the Benefits You Want from Them - -I don't think there are any universal rules about how many tests you should -write and what the correct balance between functional, integrated, and isolated -tests should be. Circumstances vary between projects. But, by thinking about -all of your tests and asking whether they are delivering the benefits you want, -you can make some [keep-together]#decisions#. - - [[test-types-tradeoffs]] [options="header"] .How do different types of test help us achieve our objectives? From a0e08c7a6feabeb04a9093f0757b68dc2a0e14b3 Mon Sep 17 00:00:00 2001 From: Harry Date: Wed, 5 Mar 2025 17:26:55 +0000 Subject: [PATCH 6/7] add missing image --- images/test_pyramid.png | Bin 0 -> 119030 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/test_pyramid.png diff --git a/images/test_pyramid.png b/images/test_pyramid.png new file mode 100644 index 0000000000000000000000000000000000000000..8142343b2ac90ab7ad9256e23573322dbcac9d10 GIT binary patch literal 119030 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

aO(g~7Y54`=;hr#-yDxqO2mvr9+cK{uIk_%82 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 literal 0 HcmV?d00001 From acd0db4da72e9913ab46cd95d2e8917e9c7704a4 Mon Sep 17 00:00:00 2001 From: Harry Date: Thu, 6 Mar 2025 06:55:25 +0000 Subject: [PATCH 7/7] a bit of rewritten content on test objectives --- chapter_27_hot_lava.asciidoc | 75 +++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/chapter_27_hot_lava.asciidoc b/chapter_27_hot_lava.asciidoc index f2f95e9d..2584e6c3 100644 --- a/chapter_27_hot_lava.asciidoc +++ b/chapter_27_hot_lava.asciidoc @@ -59,7 +59,9 @@ Unit tests:: of a single "unit" of your code People disagree over the optimal size of the unit, but they tend to agree that "the database" is not usually part of "your code". - These tests should be "isolated" from any external + Ideally these tests should be "isolated" from anything outside the unit, + or in other words, it should not be possible for something "outside" of your unit + to cause your unit test to fail. Integration tests:: @@ -106,7 +108,12 @@ Let's step back and have a think about what benefits we want our tests to delive Why are we writing them in the first place? -==== Correctness +==== "Check That It Works" AKA Correctness + +A fundamental part of programming is that now and again +you need to check whether "it works". +Automated testing is the solution to the fact that checking things manually +quickly gets tedious, and unreliable. We want our application to be free of bugs--both low-level logic errors, like off-by-one errors, and high-level bugs @@ -114,32 +121,45 @@ like the software not ultimately delivering what our users want. We want to find out if we ever introduce regressions which break something that used to work, and we want to find that out before our users see something broken. -We expect our tests to tell us our application's behaviour is correct. +We expect our tests to tell us our application's behaviour is _correct_. + +==== Help to Write Clean, Maintainable Code -==== Clean, Maintainable Code +Once we've got code that works, +the next most important thing is that our code is easy to understand +and easy to change. +Tests help us to achieve this by giving us the confidence to refactor, +and TDD helps even more by forcing us to consider the design of our code +from the outside, before we write it. +But there is also something about the process of designing code _to be testable_ +which, hopefully, arguably, leads to better design as well. -We want our code to obey rules like YAGNI and DRY. -We want code that clearly expresses its intentions, -which is broken up into sensible components -that have well-defined responsibilities and are easily understood. -We want to keep complexity at bay, and cognitive load to a minimum. -We expect our tests to give us the confidence to refactor our application constantly, -so that we're never scared to try to improve its design, -and we would also like it if they would actively help us to find the right design. +That's really something that you only get from unit tests though, +and it's not a topic we could explore in great detail in this book, +but you should check out <>, +as well as my second book, +https://www.cosmicpython.com[Cosmic Python], ==== Productive Workflow -Finally, we want our tests to help enable a fast and productive workflow. -We want them to help take some of the stress out of development, -and we want them to protect us from stupid mistakes. -We want them to help keep us in the "flow" state not just because we enjoy it, -but because it's highly productive. -We want our tests to give us feedback about our work as quickly as possible, -so that we can try out new ideas and evolve them quickly. -And we don't want to feel like our tests are more of a hindrance than a help -when it comes to evolving our codebase. +Finally there's the workflow aspect. +In this book we've seen how you can get into a fast flow, +with the unit-test/code cycle, +and we've seen several examples of how the tests can take some of the stress out of development, +how they can save us from making stupid mistakes, +and how they can act as reminders of where we've got to and what to do next. + +There are two other aspects to consider here, +the first is the speed of the feedback cycle: +the faster our tests can give us feedback about our code, +the more productive and agile we can be. + +But we also want to make sure that our tests don't ever become a _brake_ on development. +When we want to evolve our codebase, we want to minimise the number +of makework changes that we need to make in our tests. + [[test-types-tradeoffs]] @@ -150,8 +170,10 @@ when it comes to evolving our codebase. |_Correctness_ a| -* Do I have enough functional tests to reassure myself that my application _really_ works, +* Do I have tests to tell me that my application _really_ works, from the point of view of the user? + A handful of functional tests (not too many!) + are the ultimate reassurance here. * Am I testing all the edge cases thoroughly? This feels like a job for low-level, isolated tests. * Do I have tests that check whether all my components fit together properly? @@ -159,11 +181,12 @@ a| |_Clean, maintainable code_ a| -* Are my tests giving me the confidence to refactor my code, fearlessly and frequently? +* Are my tests giving me the confidence to refactor my code, + fearlessly and frequently? * Are my tests helping me to drive out a good design? - If I have a lot of integration tests and few isolated tests, + If I have a lot of integration tests and few unit tests, are there any parts of my application where putting in the effort - to write more isolated tests would give me better feedback about my design? + to switch to unit tests would give me better feedback about my design? |_Productive workflow_ a| @@ -171,7 +194,7 @@ a| When do I get warned about bugs, and is there any practical way to make that happen sooner? * If I have a lot of high-level, functional tests that take a long time to run, - and I have to wait overnight to get feedback about accidental regressions, + and I have to wait ages to get feedback about accidental regressions, is there some way I could write some faster tests that would get me feedback quicker? * Can I run a subset of the full test suite when I need to? * Am I spending too much time waiting for tests to run,