Thoughts about software development

submited by
Style Pass
2021-07-05 06:30:13

Unit tests are the developers number one safety net. Let that sink in. This is the number one reason for writing unit tests. Unit tests are written by developers for developers to ensure that the code works as expected and handles happy and sad paths correctly. With enough unit test coverage the tests enable a safe environment for refactoring and rewriting code.

Unit test should test a single thing, a method or function call and it should test only one use case within. In other words a unit test should test a function with a single input. This is a important guideline to understand. When a unit test tests a function with single input it makes the test isolated, repeatable and predictable. Example of good tests:

@Test fun findsAddress() {   val address = findAddress("Stevens street 35", "Southport", "Australia")   assertThat(address).isNotNull() } @Test fun doesNotFindAddress() {   val address = findAddress("Stevens street 697", "Southport", "Australia")   assertThat(address).isNull() }

If a test contains multiple inputs for a single function it's not anymore isolated. Say a test has seven different inputs and it calls the testable function seven times but with the third input it fails. Because it fails with the third input the remaining four inputs are not tested. Now you have in your hands a test that is proven to work for the first two inputs and fail for the third but you have no  idea whether it works with the remaining four inputs or not. When you start to fix the implementation your safety net can fail for seven different inputs and if any of them fails you can never be sure if the remaining inputs work or not. Example of a bad test:

Leave a Comment