On software testing
"write expressive tests that establish clear boundaries, run quickly & reliably, and only fail for useful reasons." -- Justin Searls
"I'm pretty convinced that the biggest single contributor to improved software in my lifetime wasn't object-orientation or higher-level languages or functional programming or strong typing or MVC or anything else: It was the rise of testing culture." -- Tim Bray
From undergrad and my first internships, automated testing has been an important part of my career as a software engineer. Much of my 6 years working at Google was devoted to improving test automation, and one of the things that attracted me to Very Good Ventures was their focus on testability in creating confidence and building excellent products.
In my continued learning, I went down quite a testing philosophy rabbit hole today. I started here and it led to lots of interesting views about unit vs integration tests, stub vs mock, coverage, TDD/BDD, etc. In addition to the two quotes above, here are a few key takeaways for me:
Follow up: I *really* like the way Rifat Ordulu talked about integration tests (for about 2 min) at 22:55 in his recent Fluttercon talk https://www.droidcon.com/2023/08/07/the-good-the-bad-and-the-ugly-side-of-selecting-flutter/ My understanding of what he said: Your goals will greatly inform which types of tests you should emphasize. - A small team that knows the codebase thoroughly, needs to move quickly, and mostly needs automated tests to ensure overall functionality before release may appropriately rely on a "diamond" or "crab" distribution with lots of integration tests. - If your objective (like Rifat's team's) is to enable many engineers to confidently make changes in a large codebase, a "pyramid" structure with more unit tests makes more sense.