another important boundary condition to think about is aliasing considerfor examplethe code def copy( )"""assumes are lists mutates to be copy of ""while len( #remove all elements from pop(#remove last element of for in #append ' elements to initially empty append(eit will work most of the timebut not when and refer to the same list any test suite that did not include call of the form copy(ll)would not reveal the bug glass-box testing black-box testing should never be skippedbut it is rarely sufficient without looking at the internal structure of the codeit is impossible to know which test cases are likely to provide new information consider the following trivial exampledef isprime( )"""assumes is nonnegative int returns true if is primefalse otherwise""if < return false for in range( )if % = return false return true looking at the codewe can see that because of the test if < the values and are treated as special casesand therefore need to be tested without looking at the codeone might not test isprime( )and would therefore not discover that the function call isprime( returns falseerroneously indicating that is not prime glass-box test suites are usually much easier to construct than black-box test suites specifications are usually incomplete and often pretty sloppymaking it challenge to estimate how thoroughly black-box test suite explores the space of interesting inputs in contrastthe notion of path through code is well definedand it is relatively easy to evaluate how thoroughly one is exploring the space there arein factcommercial tools that can be used to objectively measure the completeness of glass-box tests glass-box test suite is path-complete if it exercises every potential path through the program this is typically impossible to achievebecause it depends upon the number of times each loop is executed and the depth of each recursion for examplea recursive implementation of factorial follows different path for each possible input (because the number of levels of recursion will differ