Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software...

56
Web: http://www.megadatasys.com assisted with templates and printing Advanced Software Engineering: Software Testing COMP 3705(L3) Sada Narayanappa Anneliese Andrews Thomas Thelin Carina Andersson

Transcript of Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software...

Page 1: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Web: http://www.megadatasys.com assisted with templates and printing

Advanced Software Engineering: Software Testing

COMP 3705(L3)

Sada Narayanappa

Anneliese Andrews Thomas Thelin

Carina Andersson

Page 2: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 2

LectureChapter 10 (Lab 3)

– Software inspections– Fault content estimation

Chapter 5 (Lab 4)– White-box testing techniques

Page 3: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 3

Definitions

•Software•Source code•All related artifacts – design docs etc.

•Testing •Revealing defects •Dynamic - Execution•Static - Reviews

Page 4: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 4

Why Review?Main objective

– Detect faultsOther objectives

– Inform– Educate– Learn from (others) mistakes

Faults affect software quality negatively

Page 5: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 5

Types of ReviewsFormal/Informal Technical/ManagerialWhen does it occur

– Colleague ask the other– Formally

Types– Inspection– Walkthrough

Benefits of Reviews:

• Increased productivity

• Higher customer satisfaction

• Teaching tool for junior staff

• Identification of reusable assets

Page 6: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 6

What to inspect?

Implementation

Analysis &Requirements

Design Integration & Function test

System Test

Inspection

Inspection

Inspection

Inspection

Page 7: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 7

Relative cost of faults

1-2

5

10

Maintenance 200

20

50

Source: Davis, A.M., “Software Requirements: analysis and specification”, 1990

Page 8: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 8

How did it start?Fagan inspections (IBM, early 1970’s, Checklist)Phases

– Overview, Preparation, Meeting, Rework, Follow-upFault searching at meeting! – Synergy

Roles– Author (designer), reader (coder), tester, moderator

Classification– Major and minor

Page 9: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 9

How did it start?Fagan 1976

– Inspections detected 82% of the faults– Unit testing detected 18% of the faults– Productivity was increased by 23%

Page 10: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 10

Getting the best from inspectionsThe author

– How do you react?– ”… is in the hot seat”

The development team– Better prepared – Feedback– Communication

Page 11: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 11

Getting the best from inspectionsThe inspection team

– Critical thinking– Ability to detect omissions– Who should participate in inspections?

Cost-effective verification– Minimising cost of correction– Is it cost-effective?

Page 12: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 12

InspectionsObjective/Goals:

– Detect faults– Collect data– Communicate information

Roles– Moderator– Reviewers (Inspectors)– Presenter– Author

Elements– Planned, structural meeting– Preparation important– Team – 3-6 people

Disadvantages– Short-term cost

Attentions to:– Quality– Adherence to standards– Testability – Traceability– Anything else ….?

Page 13: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 13

WalkthroughsObjective/Goals:

– Detect faults– Become familiar with the product

Roles– Presenter (author)– Reviewers (Inspectors)

Elements– Planned meeting– Team – 2-7 people– Brainstorm

Disadvantage– Find fewer faults

Page 14: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 14

Cognitive ViewProcess

– Comprehension – overview or preparation– Fault searching – preparation or meeting

Inexperienced reviewers– Concrete representation (syntax)

Experienced reviewers– Abstract representation (semantic)– Load less detailed information

Page 15: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 15

Reading Techniques– Ad hoc– Checklist– Active Design Review– Defect-based reading– Perspective-based reading– Usage-based reading

Page 16: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 16

Active design reviewActive design review (1990)

– Forces reviewers to actively inspect– Question-based

e.g. how can this be implemented

Page 17: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 17

Defect-based Reading

Page 18: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 18

Perspective-based Reading

ScenariosPurpose

– Decrease overlap– Improved effectiveness

Designer

Tester

User

Page 19: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 19

Usage-Based Reading

Model of usage

Design

Page 20: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 20

Inspection TechniquesN-fold inspections (1993)

– N independent groups inspect the document– Small groups

Phased inspections (1985)– Two or several inspection sessions– With or without fault correction in-between

Page 21: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 21

Inspection TechniquesStepwise abstraction (1982)

– Code– Decompose the code to subprograms– Each subprogram perform one function

Usability inspections– Focus on end user

e.g. can learn, availability, can understand– Several sub-techniques

e.g. Cognitive walk-through

Page 22: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 22

Inspections

EstimationEstimation

Individual inspection Meetin

g

Page 23: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 23

Capture-recapture

Page 24: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 24

Capture - Recapture

Page 25: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 25

Presenting the Information

Diagram representing

20

2

6

3

2

1

Reviewer 1

0

5

10

15

20

25

N D N-D R1 R2 R3

Overlap Diagram

^ ^

89

5

Reviewer 2

Reviewer 3

aviewersDatDNDN Re,,,^^−

N^ is the estimated number

Page 26: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 26

Capture-Recapture ModelsDegree of freedom

– Models – Estimators

Four basic models used for inspectionsPrerequisites for all models

– All reviewers work independently of each other– It is not allowed to inject or remove faults during inspection

Page 27: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 27

Prerequisites

Model 1, M0Reviewer 1Reviewer 2Reviewer 3 Detection probabilities

Fault number

Model 3, MtReviewer 1Reviewer 2Reviewer 3 Detection probabilities

Fault number

Model 2, MhReviewer 1Reviewer 2Reviewer 3 Detection probabilities

Fault number

Model 4, MthReviewer 1Reviewer 2Reviewer 3 Detection probabilities

Fault number

Page 28: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 28

Testing Approaches

requirements

input

events

output

Black Box Testing White Box Testing

Page 29: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 29

There are many possible paths!

loop < 20x

If-then-else

Selective Testing

Exhaustive testing

Page 30: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 30

a selected path

Control flow Control flow testingtesting

Data flow testingData flow testing

Loop testingLoop testing

FaultFault--based testingbased testing

Selective:Selective:

Selective testing

Page 31: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 31

Control flow – coverage

4

3

2

1

YAll possible combinations of

condition outcomes in each decision occur at least once

YYYEach condition in a decision takes

on all possible outcomes at least once

YYYEach decision takes on all

possible outcomes at least once

YYYYYEach statement is executed at

least once

Multiple condition coverage

Decision/condition coverage

Condition coverage

Decision coverage

Statement coverage

Page 32: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 32

Statement coverageExecute each statement at least once

Tools are used to monitor execution

Requirement may be:

– no dead code

Page 33: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 33

Decision/Branch coverageMcCabe cyclomaticThe number of independent paths needed to cover all paths at least once in a program

Count number of conditional expressions.If compound conditional expressions,

add one per compound item.

Visualize by drawing a flow graph

Alternative way: CC = #(edges) - #(nodes) +2 if-then-else

while-loop

case-of

Page 34: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 34

McCabe cyclomaticControl complexity vs Data complexity, an example:

Strings : array (1..4) of STRING:=("One","Two","Three","Four","Five");i:=1;loop

exit when Strings(i)=A;i:=i+1;

end loop;

CC = 2

case A iswhen "One"=> :=1;when "Two"=> :=2;when "Three"=>

:=3;when "Four"=>

:=4;when "Five"=>

:=5;end Case

CC = 5

Page 35: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 35

Test all possible conditions in a programA condition in a program may contain:

– Boolean operators and variables– Relational operators– Arithmetic expressions– ….

Condition Coverage

Page 36: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 36

Decision / Condition coverage

Decision1. A = 2; B = 300 (True)

2. A = 12; B = 300 (False)

Condition (Decision/Condition)1. A = 2; B = 300 (True)

2. A = 12; B = 200 (False)

Multiple condition1. A = 2; B = 200 (False)

2. A = 12; B = 200 (False)

3. A = 2; B = 300 (True)

4. A=12; B=300 (True)

If A<10 and B>250 then …

Page 37: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 37

Example (Decision coverage)

void f() {if(count > 10){

fixed_count = fixed_count + count;done = 1;

} else if(count >5){fixed_count --;

} else {fixed_count = count * 4;

} }

void f() {if(count > 10){

fixed_count = fixed_count + count;done = 1;

} else if(count >5){fixed_count --;

} else {fixed_count = count * 4;

} }

11

22

33

88

44

55 66

77

Page 38: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 38

Flow Graph

11

22

33

88

44

55 66

77

if(count > 10)

void f()

fixed_count = fixed_count + count;done = 1;

if(count >5)

fixed_count --;

fixed_count = count * 4;

return;

Page 39: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 39

11

22

33

88

44

55 66

77

Decision CoverageIndependent paths:(a) 1, 2, 3, 8(b) 1, 2, 4, 6, 7, 8(c) 1, 2, 4, 5, 7, 8

Test cases:(a) count 13(b) count 8(c) count 2

Page 40: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 40

Example programThe liability procedure:procedure liability (age, sex, married, premium);begin

premium := 500;if ((age < 25) and (sex = male) and (not married)) then

premium := premium + 1500;elsebegin

if (married or (sex = female)) thenpremium := premium – 200;

if ((age > 45) and (age < 65)) thenpremium := premium – 100;

end;end;

Page 41: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 41

Statement coverage

There are only two statements in this program, and any combinationof inputs will provide coverage for both statements.

Different definitions!!!

Test caseMarriedSexAgeStatement coverage

Page 42: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 42

Decision/Branch coverage

(2)*Female<= 45IF-3

(3)**> 45, < 65IF-3

(3) 50 M FFalseMale>= 25IF-2

(2)*Female*IF-2

(2) 23 F FFalseFemale< 25IF-1

(1) 23 M FFalseMale< 25IF-1

Test caseMarriedSexAgeDecision coverage

Page 43: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 43

Condition coverage

(3) 70 F F**> 45IF-3

(2)**< 65IF-3

(1)**<= 45IF-3

(3)**>= 65IF-3

(1)FalseFemale*IF-2

(2)TrueMale*IF-2

(2) 30 M TTrueMale>= 25IF-1

(1) 23 F FFalseFemale< 25IF-1

Test caseMarriedSexAgeDecision coverage

Page 44: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 44

Data Flow TestingIdentifies paths in the program that go from the assignment of a value to a variable to the use of such variable, to make sure that the variable is properly used.Definitions

– Def – assigned or changed– Uses – utilized (not changed)

Computation: (c-use)e.g. right-hand side of an assignment, an index of an array, parameter of a function.

Predicate: (p-use) branching the execution flow, e.g. in an if statement, while statement, for statement.

Example: All def-use paths (DU) requires that each DU chain is covered at least onceGoal is to cover all Def-Use Paths

Page 45: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 45

Data Flow Testing – Example

[1] void k() {[2] x = 11;[3] if (p(cond1)) {[4] y = x + 1;[5] } else if (q(cond2)) {[6] w = x + 3;[7] } else {[8] w = y + 1;[9] }[10]}

[1] void k() {[2] x = 11;[3] if (p(cond1)) {[4] y = x + 1;[5] } else if (q(cond2)) {[6] w = x + 3;[7] } else {[8] w = y + 1;[9] }[10]}

Considering x, there are two DU paths:

(a) [2]-[4](b) [2]-[6]

We need therefore to derive test cases to match the following conditions:

(a) k() is executed and p(cond1) is true

(b) k() is executed and p(cond1) is false and q(cond2) is true

Page 46: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 46

simple loop

nested loops

concatenated loops

unstructured loops

Loop testing

Page 47: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 47

Loop testing: simple loopsMinimum conditions - simple loops

1. skip the loop entirely2. only one pass through the loop3. two passes through the loop4. m passes through the loop m < n5. (n-1), n, and (n+1) passes through the loop

where n is the maximum number of allowable passes

Page 48: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 48

Nested loopsExtend simple loop testingReduce the number of tests:

– start at the innermost loop; set all other loops to minimum values– conduct simple loop test; add out of range or excluded values– work outwards while keeping inner nested loops to typicaltypical values– continue until all loops have been tested

Page 49: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 49

Concatenated loopsSame strategies as simple loops if the loops counters are independentSame strategies as nested loops if the loops counters depend on each other:

int k;for (k=0;k<10;k++k=0;k<10;k++) {

w();if p(m) break;

}for (;k<10;k++;k<10;k++) {

r();}

Page 50: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 50

Mutation testing (fault-based testing)A method for evaluation of testing effectiveness

1. Mutate the program using the mutation operators2. Run test suite on mutants3. Obtain statistics on live and dead mutants4. Create more test cases and iterate 2-4 until sufficient number of

mutants are killed

Page 51: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 51

Example mutation operatorsRelational operator replacementLogical operator replacementArithmetic operator replacementUnary operator removal/insertionComparable constant replacementComparable variable replacementComparable array replacement

Page 52: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 52

Examplenbrs = new int[range]

public int max(int[] a) {

int imax := 0;

for (int i = 1; i < range; i++)

if a[i] > a[imax]

imax:= i;

return imax;

}

213TC3

231TC2

321TC1

a[2]a[1]a[0]

Page 53: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 53

Relational operator mutantnbrs = new int[range]

public int max(int[] a) {

int imax := 0;

for (int i = 1; i < range; i++)

if a[i] >= a[imax]

imax:= i;

return imax;

}

213TC3

231TC2

321TC1

a[2]a[1]a[0]

Changed From:

a[i] > a[imax]

Page 54: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 54

Variable operator mutantnbrs = new int[range]

public int max(int[] a) {

int imax := 0;

for (int i = 1; i < range; i++)

if i > a[imax]

imax:= i;

return imax;

}

213TC3

231TC2

321TC1

a[2]a[1]a[0]

Changed From:

a[i] > a[imax]

Page 55: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 55

Variable operator mutantnbrs = new int[range]

public int max(int[] a) {

int imax := 0;

for (int i = 0; i < range; i++)

if a[i] > a[imax]

imax:= i;

return imax;

}

213TC3

231TC2

321TC1

a[2]a[1]a[0]

Changed From:

i = 1

Page 56: Advanced Software Engineering: Software Testingsnarayan/sada/teaching/COMP... · Advanced Software Engineering 50 Mutation testing (fault-based testing) A method for evaluation of

Advanced Software Engineering 56

Why is white-box testing not enough?Missing features

– Missing codeTiming and concurrency issuesDifferent states of the software

– Astronomical amount of different paths through the software– Different paths can reveal different defects

Variations of input conditionsVariations of dataQualities

– Performance– Robustness– Reliability– Usability– …