Presentation is loading. Please wait.

Presentation is loading. Please wait.

CSC 480 Software Engineering Lecture 15 Oct 21, 2002.

Similar presentations


Presentation on theme: "CSC 480 Software Engineering Lecture 15 Oct 21, 2002."— Presentation transcript:

1 CSC 480 Software Engineering Lecture 15 Oct 21, 2002

2 White-box Testing Based on knowledge of structural details Objective and coverage  Every statement has been executed at least once  Every linearly independent path has been traversed at least once Path coverage ensures statement coverage

3 Flow Chart vs. Flow Graph

4 Binary search (Java) This is an encapsulation of a binary search function that takes an array of ordered objects and a key and returns an object with 2 attributes namely index - the value of the array index found - a boolean indicating whether or not the key is in the array An object is returned because it is not possible in Java to pass basic types by reference to a function and so return two values the key is -1 if the element is not found 1 2 3 4 5 6 7 8 9 8

5 Binary search flow graph

6 1, 2, 3, 8, 9 1, 2, 3, 4, 6, 7, 2 1, 2, 3, 4, 5, 7, 2 1, 2, 3, 4, 6, 7, 2, 8, 9 Test cases should be derived so that all of these paths are executed A dynamic program analyser may be used to check that paths have been executed Independent paths

7 Cyclomatic Number In graph-theoretic terms, the cyclomatic number of a graph G is defined as C = E – N + 2P where  N is the number of nodes  E is the number of edges  P is the number of connected components (usually, 1)

8 Cyclomatic Complexity McCabe suggested that the number C can be used as a source-code metric  that reflects the complexity of a program’s control flow C defines the number of linearly independent paths in a program  It can be used as an upper bound for the number of tests that must be conducted

9 Alternative Ways to Compute C There are other ways that can be used to determine the cyclomatic number C  C = P + 1 where P is the number of predicate nodes contained in the flow graph  C = R where R is the number of regions into which the flow graph divides the plane

10 Integration testing Tests complete systems or subsystems composed of integrated components Integration testing should be black-box testing with tests derived from the specification Main difficulty is localising errors Incremental integration testing reduces this problem

11 Incremental integration testing

12 Approaches to integration testing Top-down testing  Start with high-level system and integrate from the top-down replacing individual components by stubs where appropriate Bottom-up testing  Integrate individual components in levels until the complete system is created In practice, most integration involves a combination of these strategies

13 Top-down testing

14 Bottom-up testing

15 Takes place when modules or sub-systems are integrated to create larger systems Objectives are to detect faults due to interface errors or invalid assumptions about interfaces Particularly important for object-oriented development as objects are defined by their interfaces Interface testing

16

17 Interfaces types Parameter interfaces  Data passed from one procedure to another Shared memory interfaces  Block of memory is shared between procedures Procedural interfaces  Sub-system encapsulates a set of procedures to be called by other sub-systems Message passing interfaces  Sub-systems request services from other sub- systems

18 Interface errors Interface misuse  A calling component calls another component and makes an error in its use of its interface e.g. parameters in the wrong order Interface misunderstanding  A calling component embeds assumptions about the behaviour of the called component which are incorrect Timing errors  The called and the calling component operate at different speeds and out-of-date information is accessed

19 Interface testing guidelines Design tests so that parameters to a called procedure are at the extreme ends of their ranges Always test pointer parameters with null pointers Design tests which cause the component to fail Use stress testing in message passing systems In shared memory systems, vary the order in which components are activated

20 Stress testing Exercises the system beyond its maximum design load. Stressing the system often causes defects to come to light Stressing the system test failure behaviour.. Systems should not fail catastrophically. Stress testing checks for unacceptable loss of service or data Particularly relevant to distributed systems which can exhibit severe degradation as a network becomes overloaded

21 The components to be tested are object classes that are instantiated as objects Larger grain than individual functions so approaches to white-box testing have to be extended No obvious ‘top’ to the system for top-down integration and testing Object-oriented testing

22 Testing levels Testing operations associated with objects Testing object classes Testing clusters of cooperating objects Testing the complete OO system

23 Object class testing Complete test coverage of a class involves  Testing all operations associated with an object  Setting and interrogating all object attributes  Exercising the object in all possible states Inheritance makes it more difficult to design object class tests as the information to be tested is not localised

24 Writing A TestCase import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class MoneyTest extends TestCase { private Money f12CHF; private Money f14CHF; private Money f28USD; protected void setUp() { f12CHF= new Money(12, "CHF"); f14CHF= new Money(14, "CHF"); f28USD= new Money(28, "USD"); }

25 Writing testMethod ’s public void testSimpleAdd() { Money m12CHF= new Money(12, "CHF"); Money m14CHF= new Money(14, "CHF"); Money expected= new Money(26, "CHF"); Money result= m12CHF.add(m14CHF); assert(expected.equals(result)); } // [12 CHF] + [14 CHF] + [28 USD] == {[26 CHF][28 USD]} public void testMoneyMoneyBag() { Money bag[]= { f26CHF, f28USD }; MoneyBag expected= new MoneyBag(bag); assertEquals(expected, f12CHF.add(f28USD.add(f14CHF))); }

26 TestSuite & Running Tests public static Test suite() { TestSuite suite = new TestSuite(); suite.addTest(new MoneyTest("testMoneyEquals")); suite.addTest(new MoneyTest("testSimpleAdd")); return suite; } public static void main(String args[]) { junit.swingui.TestRunner.run(suite()); }

27 Object integration Levels of integration are less distinct in object- oriented systems Cluster testing is concerned with integrating and testing clusters of cooperating objects Identify clusters using knowledge of the operation of objects and the system features that are implemented by these clusters

28 Approaches to cluster testing Use-case or scenario testing  Testing is based on a user interactions with the system  Has the advantage that it tests system features as experienced by users Object interaction testing  Tests sequences of object interactions that stop when an object operation does not call on services from another object

29 Association – The Bank Client App BankClientMainBankClientFrame BankClientConnector request(String cmd):String

30 Scenario-based testing Identify scenarios from use-cases and supplement these with interaction diagrams that show the objects involved in the scenario Consider the scenario in the weather station system where a report is generated

31 Collect weather data


Download ppt "CSC 480 Software Engineering Lecture 15 Oct 21, 2002."

Similar presentations


Ads by Google