On Tue, Mar 05, 2013 at 05:42:55PM -0800, Alex Huang wrote:
> With the discussion in the BVT thread and other evidence from the check-ins, 
> I think there are some confusion on when to and what to write in a unit test.
> 
> Unit tests are a philosophy thing and I usually stay away from things like 
> that.  If you are interested in writing the right type unit tests, here's my 
> $.02.
> 
> Unit tests are for
> 
> -          Guaranteeing the component is upholding its contract.
> 
> -          Illustrating how the component is to be used.
> 
> -          Mocking up failure scenarios
> 
> -          Explaining something that people might not understand if they look 
> inside your code.
> 
> When to write a unit test:
> 
> -          Write it at the component level because that's where the value is. 
>  You can test everything under the sun but basically code changes all of the 
> time.  What you really want
> 
> -          Write it for an interface.  For example, if you have AgentManager 
> and AgentManagerImpl, the methods you should test is in AgentManager.  And a 
> lot of this goes back to your design.  I have seen quite a bit of code that 
> just adds all the methods from the class to the interface.  It's just 
> something you do rather than something you think before doing.  That's just 
> wrong and it increases the number of unit tests you have to write.
> 
> These are usually what you need to test for when writing unit tests.
> 
> -          Errors in the incoming parameters...<no duh!>
> 
> -          Different positive paths for your code...<to state the obvious>.
> 
> -          The one that people don't seem to do is to inject results into the 
> components that the component being tested is dependent on.  This forces 
> component being tested to travel a different path.  Most people recognize 
> incoming parameters causing a different path but does not recognize that 
> results from the components being used can cause a different path.
> 
> How to recognize a good unit test?
> 
> -          The mock objects do not always return true or positive result.
> 
> -          The unit test sets something for the mock object, test the method; 
> sets something else for the mock objects and then test the method again.  
> This means the tester is testing the component handling different returns 
> from the components it is using.
> 
> -          The unit test makes a call to the component, and checks the mock 
> object to see if certain things are called.  White box testing there.
> 
> -          The unit test has asserts for catching exceptions or negative 
> returns (negative paths are tested)
> 
> -          The unit test has comments that tell you what and why you're 
> testing
> 
> -          The unit test asserts tells you why the assert should not fail
> 
> -          You won the blame game by saying look I have a test case for 
> exactly that.
> 
> Misconceptions about unit tests.
> 
> -          You only write it when you write the component.  Actually, a good 
> unit test is one that's progressively built up.  You found a bug, you write a 
> test to make sure the bug is fixed.  If you've gotten to that stage, then 
> you've pretty much reach guru status.
> 
> --Alex

+1 to this whole list.  Want to add it to the wiki to institutionalize
it?

Reply via email to