Advanced Software Testing Techniques Based On Combinatorial Design