For: Teamleads, Architects, Entrepreneurs and QA members that are searching for a path to higher quality.
Generally, testing is perceived as boring, time consuming and ‘expensive’. This is also the first question business people will ask when you propose it. ‘Fine, but how much does it cost?’. This article should give you some sort of a hand-hold to determine what it might bring you and if the time is right.
How to test your stuff, isn’t as valuable if you don’t have a solid understanding of the Why and When. I have written a post on how to implement TDD in a TypeScript build-process, about the how. Now it’s time for the reasons behind it.
When to start with automated testing
It’s in my opinion foolish to immediately start with writing tests when you start with creating a new product. Often you really don’t know what the product will become (you might think you do, but really, usually you don’t, read about this in The Lean Startup from Eric Ries). There will be many iterations of pivoting that will cause your application to go a completely different way when you build an MVP (Minimally Viable Product).
But once the product found it’s way in to the market, and the goals become more and more long-term, your focus will start to shift from creating new stuff, to make sure we create the good stuff. Code gets refactored all the time to be more performant and better readable. But stuff will break all the time.
At this moment your code will – and should – be tested to maintain a certain level of quality. This is the moment Automated Testing steps in.
Why would I do automated testing
I mean, developers know what they’ve done right? They can check what they’ve created?
That’s the general over-simplification we hear. It’s true in some sense, and happens always to reach your Acceptance Criteria, but it won’t suffice. With automated tests you can:
- Run automated tests before merging to stable to know you are safe and automated rollout to staging or even production (Continuous Integration / Deployment)
- Test against hundreds of browsers and their versions, on different devices and operating systems
- Prevent regression
- The tests define functionality. They are the place you can go to to find an example of integration
- Do code coverage checks that give you information on how much of your code is covered by tests.
- They cut time and reduce the risks that you have when going to production. It builds in a certain amount of certainty. Whenever a bug does slip in, you can write new tests to check for that issue. This makes sure that the exact bug doesn’t re-occur (hence regression tests)
What does the T/B DD stand for?
TDD means Test Driven Development
When you read it carefully, you see “Driven Development” trailing the first word “Test”. This basically means: write your tests before you start writing any code at all. So, what are the benefits of doing this?
- By writing your test first, you’ll have to think about the thing you are creating. Think about the outlines, the how and what. Since you are still not really hands-on, you also don’t have to improvise and be burdened by hacking stuff in to make it work. You just think about the feature or the unit that you want to add to the system. This makes your code mode atomically correct once you start writing and you’ll spot issues before they arise.
- Now we know wat we can expect from the thing we want to create, we start running the test. The test will fail since the code for your new test isn’t there yet.
- You iterate over your code to make your tests green, and if needed add other tests if the functionality isn’t sufficient yet, and start this process all over again.
- You’ll deliver code that is restricted to what’s asked from it, not what future questions might be. You’ll deliver code that works, and what others can rely on. All features are documented.
TDD is often synonym for Unit Testing. Unit testing means, each unit of your code should be testable as a separate black-box apart from the complete system. You’ll see that you’ll be mimicking the file structure of the original project. Don’t merge the two together although this might be tempting! Tests should run separate from your production code. Your code should never rely on your tests. Your tests should only rely on units of your code.
BDD stands for Behavioral Driven Development
So the ‘Driven Development’ is exactly the same as for TDD, but in this case we don’t test units, but the sum of their outcome. These units combined create an experience for the user, and your scrum stories rarely contain AC’s with the granularity of a Unit. To properly test the code, we’ll have to do integral tests that measure if all criteria for AC’s are met.
With BDD we:
- click through the website
- expect functionality to be there
- finish operations, like creating a basket and ordering
- test if the outcome is as desired.
- If not correct, take screenshot, log errors and alarm.
This means:
- have all AC written in a structural way
- test AC in human readable text against our production and test environment
- develop a feature base (since we already keep track of AC) that informs the next person about the what, why and how of all features in our application.
I can advise ChimpJS to do this for you, while writing your tests in Cucumber syntax. This is friendly for as well as Business as Tech. Here’s a great example of how that would look like!
What does testing cost?
So to finish with the first thing that will be asked. Investing in automated testing does cost money, but a lot less than humans doing the same thing.
The question really is, how much can you afford to screw up?
If the answer to that is: I don’t mind, then don’t do it. Because you wouldn’t hire a human to test either.
If the answer is: I do mind a bit but I don’t want to invest too much, then make sure that all software that is tightly related to KPIs is automatically tested. You will see that over time it will give you more than it costs you.
If testing is already an integral respected part of your deployment routine but not digitized yet, I would say: read this article again and draw your own conclusions.
Testing isn’t giving you 100% assurance. Nothing does. But you can always try to become better at what you do, and with that idea in mind be sure that you structurally test whenever changes are being made. I once spoke with a CTO that had a complete division of testers, that wrote tests apart from the development teams. To my recollection both teams where about equal in size. What we should learn from this is: when there is much at stake, you must do more to make sure things go right.
How much is for you at stake?
Let me know what you think in the comments! Want more of this? Use the Poll on the right of the screen, comment or contact me!