08120: Programming 2: SoftwareTesting and Debugging Dr Mike Brayshaw
17 Slides184.50 KB
08120: Programming 2: SoftwareTesting and Debugging Dr Mike Brayshaw
Software Testing We study it because we want to get better at it and write better programs Software Development Organisations can spend up to 40% of time testing In critical domains (e.g. flight control, nuclear reactor) costs can be 3 to 5 times costs of all other steps added together – It is expensive – We need to get it right
Do we always need to test? some people claim no – – – – use of formal methods use of rigorous engineering use of high level paradigm program specification Yes we do there may be unseen errors (e.g. in spec) the software may evolve, the world may change, the software may change (new platform or compiler) to err is human, programmers make mistakes, even good ones!!!
Objectives of Testing Is it always a destructive process - are you just trying to break a system? What are trying to find problems and Errors To do so we need to think what are good test cases – a good test case is something that “has a high probability of finding a yet undiscovered error” (Somerville, pp. 610) A successful tests is one that uncovers a hitherto undetected error
What will it reveal? If successful errors! It allows us to test the software against its specification We can check its performance Indirectly it gives insight into the reliability and quality of the software
So how do you go about testing 1 First Approach Does it do the job? – does it meet its functional requirements – test each function that the software is designed to implement and see if its up for the job this is called black box testing
So how do you go about testing 2 Second Approach Does it work correctly internally? – test how the innards work – is it implemented as on the technical specification – inspect the code itself this is known as white box testing
A systematic approach to testing using White Box and Black Box In Black Box testing we can take the functional requirements of the software and check these In White Box testing or if we know the internal workings of the program we can take a close look at its procedural detail to check its working methods are correct White box testing is very expensive and exhaustive testing is not possible for non-trivial problems Use a combination of white and black box testing
White Box Testing Check all independent paths thru the code Check both sides of logical decisions like Booleans Check all loop with normal values and at limits Check internal data structures
Why go to such lengths? Problems with workhorse code are likely to have been trapped and cured long ago, it’s the seldom used stuff that can still hide problems We may have the wrong intuition about the logical path the program is taking. Stuff that we never expected to be executed could be doing so on a regular basis. Hence the need for path testing. – this may also reveal efficiency issues – unreachable code
Path Testing 1 We can find the number of different flow of control paths through the program The upper bound - cyclomatic complexity metric - defines the number of independent paths thru a program this also gives an upper bound on the number of tests we need to perform to garentee coverage of all program statements
Path Testing 2 For a given program to test Work out the flow of control for the program Work out cyclomatic complexity Work out a set of linear independent paths Make test cases that will force the program to go down a particular route
Producing a Call Tree: Analysing your program structure Starting with the first procedure (often called main in some languages) draw the calling structure Will show structure of the program Easy to automate (Standard utility in many systems) Finds unused code In OOP can show hierarchy of objects show what inherits what from where allows development of browsers (e.g. BlueJ)
Condition and Loop Testing Can use our existing path detection algorithm to exhaustively white box test conditions For loops we can check for bounds, upper and lower limit. This can be thought of stress testing your loops Instrumenting Your Code
Black Box Testing Does the software meet is functional requirements? Check its input or output is correct Is the system sensitive to different types of data What rates and volumes can the system handle Does it handle boundaries ok? This can be done by software testers who just continually use and re-use the software to make sure it is correct
Development of a Test suit Test all the functional requirements of the software Pushes it through all the moves that you want the program to make Can make an output file that can be compared to previous run throughs so you know you code is correct
Comparison Testing When we need to be sure Two (or more) software teams Same requirements, write two independant programs and compare the behaviour of the two If the work in the same manner then this is a check the all is well In extreme make teams use different language, platforms, or to be really sure different paradigms (e.g. a logic language like Prolog)