CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely...

34
CS Software Development Unit Testing Ferdinand Vesely October , F. Vesely CS October , /

Transcript of CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely...

Page 1: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

CS 4500Software Development

Unit Testing

Ferdinand Vesely

October 4, 2019

F. Vesely CS 4500 October 4, 2019 1 / 33

Page 2: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

The Big Picture

Page 3: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Software Veri�cation & Validation

• A wider process – various activities

Verification & Validation

Reviews TestingFormal

Verification. . .

F. Vesely CS 4500 October 4, 2019 3 / 33

Page 4: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Software Veri�cation & Validation

Goal

Ensure that the system meets expectations.

F. Vesely CS 4500 October 4, 2019 4 / 33

Page 5: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Software Veri�cation & Validation

ValidationAre we building the right product?

• Does the system deliver functionality expected by stakeholders?• E.g., acceptance testing

Veri�cationAre we building the product right?

• Does the system meet its speci�cation?• Formal veri�cation, testing

F. Vesely CS 4500 October 4, 2019 5 / 33

Page 6: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Veri�cation: Approaches

Formal Veri�cationWith respect to a (formal) speci�cation:1. Model checking• enumerate all states• show that each state satis�es desired properties

2. Deductive veri�cation• speci�cation + implementation⇒ proof obligations

Caveat: How do we know the spec is adequate?

F. Vesely CS 4500 October 4, 2019 6 / 33

Page 7: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Veri�cation: Testing

• Show program behaves as intended• Discover defects• Execute program with arti�cial data• Check the results: Errors? Anomalies?

F. Vesely CS 4500 October 4, 2019 7 / 33

Page 8: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Limitations

“Testing can only show the presence of er-rors, not their absence”

- Dijkstra

F. Vesely CS 4500 October 4, 2019 8 / 33

Page 9: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Stages

1. Development TestingÏ system is tested during development to discover bugs and defects

2. Release TestingÏ complete version of the system before releaseÏ separate team

3. User TestingÏ Alpha testingÏ Beta testingÏ Acceptance testing

F. Vesely CS 4500 October 4, 2019 9 / 33

Page 10: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Development Testing

Page 11: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Levels

Unit

• individual programunits

• functionality ofroutines andcomponents

Integration

• gradually integratecomponents

• test as each newcomponentintegrated

System

• test the system as awhole

• closest to user’sexperience of thesystem

F. Vesely CS 4500 October 4, 2019 11 / 33

Page 12: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Unit Testing

• Test individual units in isolation• Defect testing process:

Ï Discover faults or defectsÏ Where behavior incorrect / not conforming to specÏ Success: bug discovered

• Units:Ï Individual functions / methodsÏ Modules / object classes

F. Vesely CS 4500 October 4, 2019 12 / 33

Page 13: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Module / Class Testing

Complete coverage:• Test all operations associate with a module / object• Set / interrogate all object attributes• Exercise all possible states

Ï simulate all events which cause a state change

Inheritance• Information is not localized• Not enough to test in parent class and assume operation works insubclasses

F. Vesely CS 4500 October 4, 2019 13 / 33

Page 14: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Manual Testing?

• Possible to test manually. . .• Usually not necessary at unit level• Slows down development

F. Vesely CS 4500 October 4, 2019 14 / 33

Page 15: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Unit Test Automation

• Whenever possible: automate• Tests run and checked without manual intervention• Automation frameworks, e.g., the xUnit family

F. Vesely CS 4500 October 4, 2019 15 / 33

Page 16: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Unit Test Setup

Driver

Unit under test

Stub / mockStub / mock

Results

Test cases

F. Vesely CS 4500 October 4, 2019 16 / 33

Page 17: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Test Case Execution

1. SetupÏ set up environment / context for the test

2. TestÏ invoke the unit under testÏ check assertion on the result

3. TeardownÏ tear down the environment

F. Vesely CS 4500 October 4, 2019 17 / 33

Page 18: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Test Case Execution

Stack<int> testStack;...void testNewStackEmpty() {

testStack = new Stack<int>(); // setup

assertTrue(testStack.empty()); // test

delete testStack; // teardown}

void tests() {testNewStackEmpty();testPushThenPopEmpty();...

}

F. Vesely CS 4500 October 4, 2019 18 / 33

Page 19: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

xUnit

• unit test automation frameworks• simpli�es administration of tests• origin: Smalltalk• JUnit, unittest (Python), cppunit, OUnit, . . .

F. Vesely CS 4500 October 4, 2019 19 / 33

Page 20: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

xUnit

Concepts:1. Fixture / context

Ï provides environment for each testÏ set up and teardown

2. Test caseÏ executes a scenarioÏ checks assertions

3. Test suiteÏ collections of test cases with a common �xtureÏ order of test cases should not matter

4. Runner (driver)Ï run test suites, report results

F. Vesely CS 4500 October 4, 2019 20 / 33

Page 21: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Mock Objects

class EmptyMockStack extends Stack<int> {public boolean empty() {log.println("empty()");return true;

}

public void push(int elt) {log.println("push(" + elt +")");

}...

}

F. Vesely CS 4500 October 4, 2019 21 / 33

Page 22: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Choosing Test Cases

• Exhaustive tests for routines – usually not feasible• E.g., a numeric function with two 32-bit integer arguments:Total number of combinations?

232 ×232 = 264 = 18,446,744,073,709,551,616

• Do we need to test all of those cases?

F. Vesely CS 4500 October 4, 2019 22 / 33

Page 23: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Choosing Test Cases

• Exhaustive tests for routines – usually not feasible• E.g., a numeric function with two 32-bit integer arguments:Total number of combinations?

232 ×232 = 264 = 18,446,744,073,709,551,616

• Do we need to test all of those cases?

F. Vesely CS 4500 October 4, 2019 22 / 33

Page 24: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Choosing Test Cases

• Test cases should:(a) show that component does what it’s supposed to(b) reveal defects if there are any

• Corresponding types of unit test cases:(a) exercise / exhibit normal operation(b) check problem cases, check abnormal inputs – do they cause a crash

F. Vesely CS 4500 October 4, 2019 23 / 33

Page 25: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Strategies for Choosing Test Cases

Partition testing• Identify groups of input with common characteristics• These should be processed the same way by SUT• Choose from each group

Guideline-based testing• Based on previous experience with common errors

F. Vesely CS 4500 October 4, 2019 24 / 33

Page 26: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Partition Testing

• Inputs and outputs – fall into di�erent classes• Where members of a class are related – equivalence classes• Each class – equivalence partition / domain• Program behaves equivalently for each member of the same class• Test cases from each partition

F. Vesely CS 4500 October 4, 2019 25 / 33

Page 27: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Partition Testing

• Consider bool validPassword(String pass)

• Should return true if:(a) 8 ≤ pass.length() ≤ 15(b) contains at least one digit

• Otherwise false• Exception on non-latin1 characters

F. Vesely CS 4500 October 4, 2019 26 / 33

Page 28: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Partition Testing

validPassword input partitions:(a) valid: only contains latin1 and

1. both (a) and (b)2. (b) and pass.length() < 8

3. (b) and pass.length() > 15

4. (a) and pass does not contain a digit5. pass.length() < 8 and does not contain a digit6. pass.length() > 15 and does not contain a digit

(b) invalid:

1. pass contains a Latin1 character

F. Vesely CS 4500 October 4, 2019 27 / 33

Page 29: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Partition Testing

Depending on need and input type:1. Choose a normal value from each partition (“middle”)2. Choose boundary values – below and above

E.g.,• "" (false),• "1234" (false),• "1234567" (false),• "12345678" (true)

F. Vesely CS 4500 October 4, 2019 28 / 33

Page 30: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Testing Guidelines

General, e.g.,:• Choose inputs that force the system to generate all error messages• Design inputs that cause input bu�ers to over�ow• Repeat the same input or series of inputs numerous times• Force invalid outputs to be generated• Force computation results to be too large or too small

F. Vesely CS 4500 October 4, 2019 29 / 33

Page 31: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Testing Guidelines

Speci�c, e.g., for sequences:1. Test with singleton sequences

Ï Programmers sometimes think of sequences as containing more than onevalue

2. Use di�erent sequences of di�erent sizes in di�erent testsÏ Reduce chance of hiding errors because of accidental characteristics of theinput

3. Ensure that �rst, middle, and last elements of the sequence areaccessed

Ï Reveals problems at partition boundaries

F. Vesely CS 4500 October 4, 2019 30 / 33

Page 32: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

Property-based Testing

• Generative testing• Not supplying speci�c inputs and expected outputs• Write properties about code• Engine generates random inputs• Check if properties hold• Originally: QuickCheck in Haskell• Java: junit-quickcheck (https://pholser.github.io/junit-quickcheck/)• Python: Hypothesis (https://hypothesis.readthedocs.io/en/latest/)

F. Vesely CS 4500 October 4, 2019 31 / 33

Page 33: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

QuickCheck in Haskell

For example:

prop_commutativeAdd :: Int -> Int -> Boolprop_commutativeAdd x y = x + y == y + x

prop_reverseReverse :: [Int] -> Boolprop_reverseReverse xs = reverse (reverse xs) == xs

> quickCheck prop_commutativeAdd+++ OK, passed 100 tests.> quickCheck prop_reverseReverse+++ OK, passed 100 tests.

F. Vesely CS 4500 October 4, 2019 32 / 33

Page 34: CS 4500 Software Development - Vesely · CS 4500 Software Development Unit Testing Ferdinand Vesely October 4, 2019 F. Vesely CS 4500 October 4, 20191/33

QuickCheck in Java

@RunWith(JUnitQuickcheck.class)public class StringProperties {

@Property public void concatenationLength(String s1, String s2) {assertEquals(s1.length() + s2.length(),

(s1 + s2).length());}

}

F. Vesely CS 4500 October 4, 2019 33 / 33