Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How verbose/granular should your tests be? [closed]

I recently started a new project where I decided to adopt writing unit tests for most functions. Prior to this my testing was limited to sporadically writing test "functions" to ensure something worked as expected, and then never bothering to update the test functions, clearly not good.

Now that I've written a fair amount of code, and tests, I'm noticing that I'm writing a lot of tests for my code. My code is generally quite modular, in the sense that I try to code small functions that do something simple, and then chain them together in a larger function as required, again, accepted best practice.

But, I now end up writing tests for both the individual "building block" functions (quite small tests), as well as tests for the function that chains them together, and testing the result there as well, obviously the result will be different, but since the inputs are similar, I'm duplicating a lot of test code (the setting up the input portions , which are slightly different in each but not by much, since they're not identical I can't just use a text fixture..).

Another concern is I try to adhere quite strictly to test one thing per test, so I write a single test for every different feature within the function, for instance, if there's some extra input that can be passed to the function, but which is optional, I write one version which adds the input, one that doesn't and test them separately. The setup here is again mostly identical except for the input I added, again not exactly the same, so using a fixture doesn't feel "right".

Since this is my first project with everything being fully unit tested, I just wanted to make sure I was doing stuff correctly and that the code duplication in tests is to be expected.. so, my question is: Am I doing things correctly? If not, what should I change?

I code in C and C++.

On a side note, I love the testing itself, I'm far more confident of my code now.

Thanks!

like image 276
Rus Bergen Avatar asked Jul 08 '11 09:07

Rus Bergen


1 Answers

Your question tries to address many things, and I can try to answer only some of them.

  1. Try to get as high coverage as possible (ideally 100%)
  2. Do not use real resources for your unit test, or at least try to avoid it. You can use mocks and stubs for that.
  3. Do not unit test 3rd party libraries.
  4. You can break dependencies using dependency injections or functors. That way the size of your tests can decrease.
like image 132
BЈовић Avatar answered Oct 04 '22 22:10

BЈовић