jeudi 19 février 2015

how to unittest with thorough test coverage

I am trying to get into unit testing with python (though my question is not specific to python). I want to add a test for function I already have - I know I should do it the other way round, but here I am, in need for unit tests for existing code.


Here is my function:



def my_function(value):
"""
value: tuple or string
"""
is_tuple = False
my_value = value
if isinstance(value, tuple):
my_value = value[0]
is_tuple = True
return(is_tuple, my_value)


Here is my test



import unittest
class TestMyFunction(unittest.TestCase):
def test_my_function(self):
sv_tupel = my_function(('foo','bar'))
sv_tupel_res = (True, 'foo')
sv_single = my_function('foo bar')
sv_single_res = (False, 'foo bar')
self.assertEqual(sv_tupel, sv_tupel_res)
self.assertEqual(sv_single, sv_single_res)


Now I have tested two cases of input, but there are of course a lot more. I could maybe also test if the function fails if the input is not what it is expected to be.


So my question is, what is the general practise/good practise to get a thorough test coverage. In this example the input and output is rather simple and so is the result, but a tested unit could be more complex. So I wonder how to write a test that gets all the possible corner cases and input variants without manually listing them explicitly. Or is that just the way it has to be? Do people in general just pick a few corner cases, and add more if it turns out the test was not thorough enough?


Also, for the two cases that I tested, should I write two tests, or is it just one since it tests one function?


I am aware that answers might be opinionated, but I would still be interested what others think.


Aucun commentaire:

Enregistrer un commentaire