80
Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE

Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Embed Size (px)

Citation preview

Page 1: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.1

CHAPTER 14

IMPLEMENTATION PHASE

Page 2: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.2

Overview

Choice of programming language Fourth generation languages Good programming practice Coding standards Module reuse Module test case selection Black-box module-testing techniques Glass-box module-testing techniques

Page 3: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.3

Overview (contd)

Code walkthroughs and inspections Comparison of module-testing techniques Cleanroom Potential problems when testing objects Management aspects of module testing When to rewrite rather than debug a module CASE tools for the implementation phase Air Gourmet Case Study: Black-box test cases Challenges of the implementation phase

Page 4: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.4

Implementation Phase

Programming-in-the-many Choice of Programming Language

– Language is usually specified in contract But what if the contract specifies

– The product is to be implemented in the “most suitable” programming language

What language should be chosen?

Page 5: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.5

Choice of Programming Language (contd)

Example – QQQ Corporation has been writing COBOL

programs for over 25 years– Over 200 software staff, all with COBOL expertise– What is “most suitable” programming language?

Obviously COBOL

Page 6: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.6

Choice of Programming Language (contd)

What happens when new language (e.g., C++) is introduced– New hires needed– Retrain existing professionals– Future products in C++– Maintain existing COBOL products– Two classes of programmers

» COBOL maintainers (despised)» C++ developers (usually paid more)

– Need expensive software and hardware to run it– 100s of person-years of expertise with COBOL

wasted

Page 7: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.7

Choice of Programming Language (contd)

Only possible conclusion– COBOL is the “most suitable” programming

language And yet, the “most suitable” language for the

latest project may be C++– COBOL is suitable for only DP applications

How to choose a programming language?– Cost-benefit analysis– Compute costs, benefits of all relevant languages

Page 8: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.8

Choice of Programming Language (contd)

Which is the most appropriate object-oriented language?– C++ is (unfortunately) C-like– Java enforces the object-oriented paradigm– Training in the object-oriented paradigm is

essential before adopting any object-oriented language

What about choosing a fourth generation language (4GL)?

Page 9: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.9

Fourth Generation Languages

First generation languages– Machine languages

Second generation languages– Assemblers

Third generation languages– High-level languages (COBOL, FORTRAN, C, C++)

Fourth generation languages (4GLs)– Non-procedural high-level languages built around

database systems– Application specific languages– E.g., database query languages such as SQL; Focus,

Metafont, PostScript, RPG-II, S, IDL-PV/WAVE, Gauss, Mathematica

Page 10: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.10

Fourth Generation Languages (contd)

One 3GL statement is equivalent to 5–10 assembler statements

Each 4GL statement intended to be equivalent to 30 or even 50 assembler statements

It was hoped that 4GLs would– Speed up application-building – Applications easy, quick to change

» Reducing maintenance costs

– Simplify debugging – Make languages user friendly

» Leading to end-user programming

Page 11: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.11

Productivity Increases with a 4GL?

The picture is not uniformly rosy Problems with

– Poor management techniques– Poor design methods

James Martin (who coined the term 4GL) suggests use of– Prototyping– Iterative design– Computerized data management– Computer-aided structuring

Is he right? Does he (or anyone else) know?

Page 12: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.12

Actual Experiences with 4GLs

Playtex used ADF, obtained an 80 to 1 productivity increase over COBOL– However, Playtex then used COBOL for later

applications 4GL productivity increases of 10 to 1 over

COBOL have been reported – However, there are plenty of reports of bad

experiences

Page 13: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.13

Actual Experiences with 4GLs (contd)

Attitudes of 43 Organizations to 4GLs – Use of 4GL reduced users’ frustrations– Quicker response from DP department – 4GLs slow and inefficient, on average– Overall, 28 organizations using 4GL for over 3 years

felt that the benefits outweighed the costs

Page 14: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.14

Fourth Generation Languages (contd)

Market share– No one 4GL dominates the software market– There are literally hundreds of 4GLs– Dozens with sizable user groups

Reason– No one 4GL has all the necessary features

Conclusion – Care has to be taken in selecting the appropriate 4GL

Page 15: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.15

Good Programming Practice

Use of “consistent” and “meaningful” variable names– “Meaningful” to future maintenance programmer– “Consistent” to aid maintenance programmer

Page 16: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.16

Good Programming Practice Example

Module contains variables freqAverage, frequencyMaximum, minFr, frqncyTotl

Maintenance programmer has to know if freq,

frequency, fr, frqncy all refer to the same thing– If so, use identical word, preferably frequency, perhaps

freq or frqncy, not fr– If not, use different word (e.g., rate) for different quantity

Can use frequencyAverage, frequencyMyaximum, frequencyMinimum, frequencyTotal

Can also use averageFrequency, maximumFrequency, minimumFrequency, totalFrequency

All four names must come from the same set

Page 17: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.17

Good Programming Practice (contd)

Issue of self-documenting code– Exceedingly rare

Key issue: Can module be understood easily and unambiguously by – SQA team– Maintenance programmers– All others who have to read the code

Page 18: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.18

Good Programming Practice (contd)

Example – Variable xCoordinateOfPositionOfRobotArm

– Abbreviated to xCoord

– Entire module deals with the movement of the robot arm– But does the maintenance programmer know this?

Page 19: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.19

Prologue Comments

Mandatory at top of every single module– Minimum information

» Module name» Brief description of what the module does» Programmer’s name» Date module was coded» Date module was approved, and by whom» Module parameters» Variable names, in alphabetical order, and uses» Files accessed by this module» Files updated by this module» Module i/o» Error handling capabilities» Name of file of test data (for regression testing)» List of modifications made, when, approved by whom» Known faults, if any

Page 20: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.20

Other Comments

Suggestion– Comments are essential whenever code is written in a

non-obvious way, or makes use of some subtle aspect of the language

Nonsense!– Recode in a clearer way– We must never promote/excuse poor programming– However, comments can assist maintenance

programmers Code layout for increased readability

– Use indentation– Better, use a pretty-printer– Use blank lines

Page 21: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.21

Nested if Statements

Example– Map consists of two squares. Write code to determine

whether a point on the Earth’s surface lies in map square

1 or map square 2, or is not on the map

Page 22: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.22

Nested if Statements (contd)

Solution 1. Badly formatted

Page 23: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.23

Nested if Statements (contd)

Solution 2. Well-formatted, badly constructed

Page 24: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.24

Nested if Statements (contd)

Solution 3. Acceptably nested

Page 25: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.25

Nested if Statements (contd)

Combination of if-if and if-else-if statements is usually difficult to read

Simplify: The if-if combinationif <condition1>

if <condition2>

is frequently equivalent to the single conditionif <condition1> && <condition2>

Rule of thumb– if statements nested to a depth of greater than

three should be avoided as poor programming practice

Page 26: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.26

Programming Standards

Can be both a blessing and a curse Modules of coincidental cohesion arise from

rules like – “Every module will consist of between 35 and 50

executable statements” Better

– “Programmers should consult their managers before constructing a module with fewer than 35 or more than 50 executable statements”

Page 27: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.27

Remarks on Programming Standards

No standard can ever be universally applicable Standards imposed from above will be ignored Standards must be checkable by machine

Page 28: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.28

Remarks on Programming Standards (contd)

Examples of good programming standards– “Nesting of if statements should not exceed a

depth of 3, except with prior approval from the team leader”

– “Modules should consist of between 35 and 50 statements, except with prior approval from the team leader”

– “Use of gotos should be avoided. However, with prior approval from the team leader, a forward goto may be used for error handling”

Page 29: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.29

Remarks on Programming Standards (contd)

Aim of standards is to make maintenance easier– If it makes development difficult, then must be modified– Overly restrictive standards are counterproductive– Quality of software suffers

Page 30: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.30

Software Quality Control

After preliminary testing by the programmer, the module is handed over to the SQA group

Page 31: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.31

Module Reuse

The most common form of reuse

Page 32: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.32

Module Test Case Selection

Worst way—random testing Need systematic way to construct test cases

Page 33: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.33

Module Test Case Selection (contd)

Two extremes to testing

1. Test to Specifications – also called black-box, data-driven, functional, or

input/output driven testing)– Ignore code. Use specifications to select test cases

2. Test to Code – also called glass-box, logic-driven, structured, or

path-oriented testing)– Ignore specifications. Use code to select test cases

Page 34: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.34

Feasibility of Testing to Specifications

Example– Specifications for data processing product include 5

types of commission and 7 types of discount – 35 test cases

Cannot say that commission and discount are computed in two entirely separate modules—the structure is irrelevant

Page 35: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.35

Feasibility of Testing to Specifications

Suppose specs include 20 factors, each taking on 4 values– 420 or 1.1 1012 test cases– If each takes 30 seconds to run, running all test cases

takes > 1 million years Combinatorial explosion makes testing to

specifications impossible

Page 36: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.36

Feasibility of Testing to Code

Each path through module must be executed at least once– Combinatorial explosion

Page 37: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.37

Feasibility of Testing to Code (contd)

Flowchart has over 1012 different paths

Page 38: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.38

Feasibility of Testing to Code (contd)

Can exercise every path without detecting every fault

Page 39: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.39

Feasibility of Testing to Code (contd)

Path can be tested only if it is present Weaker Criteria

– Exercise both branches of all conditional statements– Execute every statement

Page 40: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.40

Coping with the Combinatorial Explosion

Neither testing to specifications nor testing to code is feasible

The art of testing:– Select a small, manageable set of test cases to

» Maximize chances of detecting fault, while » Minimizing chances of wasting test case

– Every test case must detect a previously undetected fault

Page 41: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.41

Coping with the Combinatorial Explosion

We need a method that will highlight as many faults as possible– First black-box test cases (testing to

specifications)– Then glass-box methods (testing to code)

Page 42: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.42

Black-Box Module Testing Methods

Equivalence Testing Example

– Specifications for DBMS state that product must handle any number of records between 1 and 16,383 (214–1)

– If system can handle 34 records and 14,870 records, then probably will work fine for 8,252 records

If system works for any one test case in range (1..16,383), then it will probably work for any other test case in range– Range (1..16,383) constitutes an equivalence class

Any one member is as good a test case as any other member of the class

Page 43: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.43

Equivalence Testing (contd)

Range (1..16,383) defines three different equivalence classes:– Equivalence Class 1: Fewer than 1 record– Equivalence Class 2: Between 1 and 16,383 records– Equivalence Class 3: More than 16,383 records

Page 44: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.44

Boundary Value Analysis

Select test cases on or just to one side of the boundary of equivalence classes – This greatly increases the probability of detecting

fault

Page 45: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.45

Database Example

Test case 1: 0 records Member of equivalence class 1 (and adjacent to boundary value)

Test case 2: 1 record Boundary value Test case 3: 2 records Adjacent to boundary

value Test case 4: 723 records Member of

equivalence class 2

Page 46: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.46

Boundary Value Analysis of Output Specs

Example: In 2001, the minimum Social Security (OASDI) deduction from any one paycheck was $0.00, and the maximum was $4,984.80

– Test cases must include input data which should result in deductions of exactly $0.00 and exactly $4,984.80

– Also, test data that might result in deductions of less than $0.00 or more than $4,984.80

Page 47: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.47

Overall Strategy

Equivalence classes together with boundary value analysis to test both input specifications and output specifications– Small set of test data with potential of uncovering

large number of faults

Page 48: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.48

Glass-Box Module Testing Methods

Structural testing– Statement coverage– Branch coverage– Linear code sequences– All-definition-use path coverage

Page 49: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.49

Structural Testing: Statement Coverage

Statement coverage: – Series of test cases to check every statement– CASE tool needed to keep track

Weakness– Branch statements

Both statements can be executed without the fault showing up

Page 50: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.50

Structural Testing: Branch Coverage

Series of tests to check all branches (solves above problem)– Again, a CASE tool is needed

Structural testing: path coverage

Page 51: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.51

Linear Code Sequences

In a product with a loop, the number of paths is very large, and can be infinite– We want a weaker condition than all paths but that

shows up more faults than branch coverage Linear code sequences

– Identify the set of points L from which control flow may jump, plus entry and exit points

– Restrict test cases to paths that begin and end with elements of L

– This uncovers many faults without testing every path

Page 52: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.52

All-definition-use-path Coverage

Each occurrence of variable, zz say, is labeled either as– The definition of a variable

zz = 1 or read (zz)

– or the use of variable

y = zz + 3 or if (zz < 9) errorB ()

Identify all paths from the definition of a variable to the use of that definition– This can be done by an automatic tool

A test case is set up for each such path

Page 53: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.53

All-definition-use-path Coverage (contd)

Disadvantage:– Upper bound on number of paths is 2d, where d is

the number of branches In practice

– The actual number of paths is proportional to d in real cases

This is therefore a practical test case selection technique

Page 54: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.54

Infeasible Code

It may not be possible to test a specific statement– May have an

infeasible path (“dead code”) in the module

Frequently this is evidence of a fault

Page 55: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.55

Measures of Complexity

Quality assurance approach to glass-box testing – Module m1 is more “complex” than module m2

Metric of software complexity – Highlights modules mostly likely to have faults

If complexity is unreasonably high, then redesign, reimplement– Cheaper and faster

Page 56: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.56

Lines of Code

Simplest measure of complexity Underlying assumption:

– Constant probability p that a line of code contains a fault

Example– Tester believes line of code has 2% chance of

containing a fault.– If module under test is 100 lines long, then it is

expected to contain 2 faults Number of faults is indeed related to the

size of the product as a whole

Page 57: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.57

Other Measures of Complexity

Cyclomatic complexity M (McCabe)– Essentially the number of decisions (branches) in the

module – Easy to compute– A surprisingly good measure of faults (but see later)

Modules with M > 10 have statistically more errors (Walsh)

Page 58: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.58

Software Science Metrics

[Halstead] Used for fault prediction – Basic elements are the number of

operators and operands in the module

Widely challenged Example

Page 59: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.59

Problem with These Metrics

Both Software Science, cyclomatic complexity:– Strong theoretical challenges– Strong experimental challenges– High correlation with LOC

Thus we are measuring LOC, not complexity Apparent contradiction

– LOC is a poor metric for predicting productivity No contradiction — LOC is used here to predict

fault rates, not productivity

Page 60: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.60

Code Walkthroughs and Inspections

Rapid and thorough fault detection– Up to 95% reduction in maintenance costs

[Crossman, 1982]

Page 61: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.61

Comparison: Module Testing Techniques

Experiments comparing – Black-box testing– Glass-box testing– Reviews

(Myers, 1978) 59 highly experienced programmers– All three methods equally effective in finding faults– Code inspections less cost-effective

(Hwang, 1981)– All three methods equally effective

Page 62: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.62

Comparison: Module Testing Techniques (contd)

Tests of 32 professional programmers, 42 advanced students in two groups (Basili and Selby, 1987)

Professional programmers– Code reading detected more faults– Code reading had a faster fault detection rate

Advanced students, group 1– No significant difference between the three methods

Advanced students, group 2– Code reading and black-box testing were equally good– Both outperformed glass-box testing

Page 63: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.63

Comparison: Module Testing Techniques (contd)

Conclusion– Code inspection is at least as successful at detecting

faults as glass-box and black-box testing

Page 64: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.64

Cleanroom

Different approach to software development Incorporates

– Incremental process model– Formal techniques– Reviews

Page 65: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.65

Cleanroom (contd)

Case study 1820 lines of FoxBASE (U.S. Naval

Underwater Systems Center, 1992)– 18 faults detected by “functional verification”– Informal proofs– 19 faults detected in walkthroughs before

compilation– NO compilation errors– NO execution-time failures

Page 66: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.66

Cleanroom (contd)

Fault counting procedures differ: Usual paradigms

– Count faults after informal testing (once SQA starts) Cleanroom

– Count faults after inspections (once compilation starts)

Page 67: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.67

Cleanroom (contd)

Report on 17 Cleanroom products [Linger, 1994]– 350,000 line product, team of 70, 18 months– 1.0 faults per KLOC– Total of 1 million lines of code– Weighted average: 2.3 faults per KLOC– “[R]emarkable quality achievement”

Page 68: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.68

Testing Objects

We must inspect classes, objects We can run test cases on objects Classical module

– About 50 executable statements– Give input arguments, check output arguments

Object– About 30 methods, some with 2, 3 statements– Do not return value to caller—change state– It may not be possible to check state—information

hiding– Method determine balance—need to know accountBalance

before, after

Page 69: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.69

Testing Objects (contd)

Need additional methods to return values of all state variables– Part of test plan– Conditional compilation

Inherited method may still have to be tested

Page 70: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.70

Testing Objects (contd)

Java implementation of tree hierarchy

Page 71: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.71

Testing Objects (contd)

Top half When displayNodeContents is invoked in BinaryTree, it

uses RootedTree.printRoutine

Page 72: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.72

Testing Objects (contd)

Bottom half When displayNodeContents is invoked in method

BalancedBinaryTree, it uses BalancedBinaryTree.printRoutine

Page 73: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.73

Testing Objects (contd)

Bad news– BinaryTree.displayNodeContents must be retested from

scratch when reused in method BalancedBinaryTree

– Invokes totally new printRoutine

Worse news– For theoretical reasons, we need to test using totally

different test cases

Page 74: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.74

Testing Objects (contd)

Two testing problems: Making state variables visible

– Minor issue Retesting before reuse

– Arises only when methods interact– We can determine when this retesting is needed

[Harrold, McGregor, and Fitzpatrick, 1992] Not reasons to abandon the paradigm

Page 75: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.75

Module Testing: Management Implications

We need to know when to stop testing– Cost–benefit analysis– Risk analysis– Statistical techniques

Page 76: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.76

When to Rewrite Rather Than Debug

When a module has too many faults– It is cheaper to redesign, recode

Risk, cost of further faults

Page 77: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.77

Fault Distribution In Modules Is Not Uniform

[Myers, 1979]– 47% of the faults in OS/370 were in only 4% of the

modules [Endres, 1975]

– 512 faults in 202 modules of DOS/VS (Release 28)– 112 of the modules had only one fault– There were modules with 14, 15, 19 and 28 faults,

respectively – The latter three were the largest modules in the product,

with over 3000 lines of DOS macro assembler language – The module with 14 faults was relatively small, and very

unstable– A prime candidate for discarding, recoding

Page 78: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.78

Fault Distribution In Modules Not Uniform (contd)

For every module, management must predetermine maximum allowed number of faults during testing

If this number is reached– Discard– Redesign– Recode

Maximum number of faults allowed after delivery is ZERO

Page 79: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.79

Air Gourmet Case Study: Black-Box Test Cases

Sample black-box test cases Appendix J contains complete set

Page 80: Slide 14.1 CHAPTER 14 IMPLEMENTATION PHASE. Slide 14.2 Overview l Choice of programming language l Fourth generation languages l Good programming practice

Slide 14.80

Challenges of the Implementation Phase

Module reuse needs to be built into the product from the very beginning

Reuse must be a client requirement Software project management plan must

incorporate reuse