testing data structures n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Testing Data Structures PowerPoint Presentation
Download Presentation
Testing Data Structures

Loading in 2 Seconds...

play fullscreen
1 / 31

Testing Data Structures - PowerPoint PPT Presentation


  • 114 Views
  • Uploaded on

Testing Data Structures. CSE 373 Tao Xie Dept. of Computer Science and Engineering University of Washington, Seattle. Objectives. Master practical testing techniques use similar techniques to test students' own code at hand handle programming interview questions related to testing

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Testing Data Structures' - jessamine


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
testing data structures

Testing Data Structures

CSE 373

Tao Xie

Dept. of Computer Science and Engineering

University of Washington, Seattle

objectives
Objectives
  • Master practical testing techniques
    • use similar techniques to test students' own code at hand
    • handle programming interview questions related to testing
  • Master systematic testing techniques
    • apply both black-box and white-box testing techniques
    • effectively use the JUnit framework and code-coverage tool
testing setup

?

=

Testing Setup

Test inputs

Expected Outputs

Program

Outputs

Test 1

Test 1

void test1() {

BST t = new BST ();

t.insert(2); t.size();

t.remove(2); t.contain(2);

}

public class BST {

void insert(int v) { … }

void remove(int v) { … }

...

}

t.size(): 1

t.contain(2):false

t.size(): 1

t.contain(2):false

how is it different to test linkedlist than anagram
How is it different to test LinkedList than Anagram?
  • Testing LinkedList
    • Test a LinkedList’s get(int X), which returns the element at the specified position in this list.
  • Testing Anagram
    • Test a method which checks whether two words are anagrams of each other
    • Test a method which checks to see if a word has any anagrams in a dictionary of words
how is it different to test linkedlist than anagram1
How is it different to test LinkedList than Anagram?
  • Testing LinkedList
    • Test a LinkedList’s get(int X), which returns the element at the specified position in this list.
  • A data structure has object states

Input =

receiver-object state@entry

+

method arguments

Method Execution

Output =

receiver-object state@exit

method return

+

how is it different to test linkedlist than anagram2
How is it different to test LinkedList than Anagram?
  • Testing LinkedList
    • Test a LinkedList’s get(int X), which returns the element at the specified position in this list.
  • A data structure has object states
    • Implicit input for a method besides arguments
      • How to prepare object states? e.g. a LinkedList with size 5
      • What object states to prepare?
    • Implicit output for a method besides return
      • How to check object states?
classic unit test construction
Classic Unit Test Construction

public void testLinkedListXXX {

Construct the object state under test (OUT)

Optionally save the state of the OUT

Call the method under test (MUT)

if an exception was generated

Test for unhandled exceptions

else

Assertions on the return, OUT, and arguments

}

linkedlist add example
LinkedList add Example
  • How to know we get an expected new LinkedList object after calling add(5) on a LinkedList object (containing 1 and 5)?

public testLinkedListAdd3 () {

LinkedList s = new LinkedList();

s.add(1);

s.add(5);//s is now prepared as OUT

s.add(5);//MUT

assertTrue(?????);

...

assertTrue(?????);

}

Backup/regenerate OUT

LinedList b = s.clone();

OR

LinedList b= new LinkedList();

b.add(1);

b.add(5);

asserting object states
Asserting Object States
  • How to know we get an expected new LinkedList object after calling add(5) on a LinkedList object (containing 1 and 5)?
    • Invoke other non-void-return methods (observers) on the new object, e.g., assertTrue(s.contains(5)), assertTrue(s.getLast()==5), assertTrue(s.size()==3).
    • Invoke toString() on the new object, e.g., assertTrue(s.toString().equals(“1,5,5”))
    • Invoke equals() on the new object, e.g., assertTrue(!s.equals(…)). When we call s.add(5) and s.removeLast(5) on an object state S, we want to check the new object is equal to S. Need backup/clone S or regenerate S
testing techniques

?

=

Testing Techniques
  • Black-box testing
    • Equivalence Partitioning Testing
    • Boundary Value Testing
  • White-box testing
    • Statement coverage

program

Outputs

Expected Outputs

test inputs

t.size(): 1

t.contain(2):false

t.size(): 1

t.contain(2):false

void test99() {

BST t = new BST ();

t.insert(2); t.size();

}

public class BST {

void insert(int v) { … }

void remove(int v) { … }

...

}

example
Example

Consider a method findMax that is supposed to find the max element in a LinkedList:

We test the method on the following inputs and observe the outputs as shown:

Can we claim that the method is correct ?

From Diane Horton’s handout

example1
Example
  • It seems these 10 test cases are good enough; but in fact, they are not well chosen
  • We can easily construct a method that passes these then cases but fails in:
    • A very short list (i.e., of length 1, 2, or 3)
    • An empty list (i.e., of length 0)In fact, easy to forget to specify the method’s behavior for this type of “boundary” case
    • A list where the max elem is the first or last element.
    • A list where the max elem is negative
  • In fact, all 10 tests cover essentially the same situation
    • A list of moderate length, all positive integers, the max elem is somewhere in the middle

From Diane Horton’s handout

equivalence partitioning

2

1

3

4

Equivalence Partitioning
  • Input domain is usually too large for exhaustive testing.
  • Partition input domain into a finite number of sub-domains for the selection of test inputs.
  • Each sub-domain is known as an equivalence class and serves as a source of at least one test input.

Input domain

partitioned into four

sub-domains.

Input domain

Too many

test inputs.

Four test inputs, one

selected from each sub-domain.

how to partition
How to partition?
  • Inputs to a program provide clues to partitioning.
  • Example: given a LinkedList with size 10, get(int X) returns the element at the specified position in this list.
  • Prohibitively large input domain: X can assume a large number of values.

Which index X shall we test?

how to partition1
How to partition?
  • Example: given a LinkedList with size 10, get(int X) returns the element at the specified position in this list.
  • We expect LinkedList to
    • behave the same way for all X<0
    • behave the same way for all X>9
    • behave the similar way for all 0<=X<=9
  • Partition the input domain of P into three sub-domains.
how to partition2

One test case:

X=-3

Equivalence class

Equivalence class

Equivalence class

Another test case:

X=15

Another test case:

X=5

How to partition?

X>9

All test inputs in the X<0 sub-domain are considered equivalent. The assumption is that if one test input in this sub-domain reveals an error in the program, so will the others.

This is true of the test inputs in the X>9 sub-domain or the 0<=X<=9 sub-domain too.

Then we selected just enough tests to cover each partition.

X<0

0<=X<=9

guideline for partitioning
Guideline for Partitioning
  • Input condition specifies a range: create one for the valid case and two for the invalid cases.
    • e.g., for a<=X<=b the classes are
      • a<=X<=b (valid case)
      • X<a and X>b (the invalid cases)
  • Input condition specifies a value: create one for the valid value and two for incorrect values (below and above the valid value).
    • This may not be possible for certain data types, e.g., for boolean.
  • Input condition specifies a member of a set: create one for the valid value and one for the invalid (not in the set) value.
    • e.g., contains(Object o)
boundary value testing

One test case:

X=-3

Equivalence class

Equivalence class

Equivalence class

Another test case:

X=15

Another test case:

X=5

Boundary Value Testing
  • Errors tend to be concentrated at edges of input domain – look for boundary values as test inputs

X>9

X<0

0<=X<=9

  • X=0 and X=9 are boundaries. Inputs to the program might lie on the boundary or on either side of the boundary.
  • Lie on boundary: 0, 9
  • Lie on valid side of the boundary: 1, 8
  • Lie on Invalid boundary cases: -1, 10
testing arbitrary linkedlist
Testing Arbitrary LinkedList
  • Example: given a LinkedList with size 10, get(int X) returns the element at the specified position in this list.

Input: X

Input condition

?

  • 0<=X<=9
testing arbitrary linkedlist1
Testing Arbitrary LinkedList
  • Example: given a LinkedList with size 10, get(int X) returns the element at the specified position in this list.

Input: X

Inputs: X, S

Input condition

Input conditions

  • 0<=X<=9
  • s.size()>=0
  • 0<=X<= s.size()-1

What tests to generate?

another example
Another example
  • Example: given a LinkedList,contains(Object e) returns true if this list contains the specified element.

Inputs: e, S

Input conditions

?

another example1
Another example
  • Example: given a LinkedList,contains(Object e) returns true if this list contains the specified element.

Inputs: e, S

LinkedList s of size n

Input conditions

Input condition

  • s.size()>=0
  • e not in s e in s (e’s position)

Adapted from Norman Fenton’s slide

how many tests shall be generated
How many tests shall be generated?
  • Example: given a LinkedList,contains(Object e) returns true if this list contains the specified element.

Inputs: e, S

LinkedList s of size n

Input conditions

Input condition

  • s.size()>=0
  • e not in s e in s (e’s position)

Adapted from Norman Fenton’s slide

how many tests shall be generated1
How many tests shall be generated?
  • Example: given a LinkedList,remove(Object e) returns true if this list contains the specified element.

Inputs: e, S

LinkedList s of size n

Input conditions

Input condition

  • s.size()>=0
  • e not in s e in s (e’s position)

Adapted from Norman Fenton’s slide

findmax example revisited
findMax example revisited
  • Consider a method findMax that is supposed to find the max element in a LinkedList
  • We can easily construct a method that passes these then cases but fails in:
    • A very short list (i.e., of length 1, 2, or 3)
    • An empty list (i.e., of length 0)In fact, easy to forget to specify the method’s behavior for this type of “boundary” case
    • A list where the max elem is the first or last element.
    • A list where the max elem is negative
  • How can we generate these tests using the techniques we just learned?
  • what test conditions?  what tests?
findmax example revisited1
findMax example revisited
  • Consider a method findMax that is supposed to find the max element in a LinkedList
  • We can easily construct a method that passes these then cases but fails in:
    • A very short list (i.e., of length 1, 2, or 3)
    • An empty list (i.e., of length 0)In fact, easy to forget to specify the method’s behavior for this type of “boundary” case
    • A list where the max elem is the first or last element.
    • A list where the max elem is negative

Input: s

Input conditions: s.size()>=0, 0<=max’s position<s.size() MIN < max’s value < MAX

white box testing
White-Box Testing
  • Determining test cases from a knowledge of the internal logic of the software
  • Four main types of white-box testing
    • Statement Testing
    • Loop Testing
    • Path Testing
    • Branch Testing
white box testing1
White-Box Testing
  • Statement Testing: Test single statements
  • Loop Testing:
    • Cause execution of the loop to be skipped completely. (Exception: Repeat loops)
    • Loop to be executed exactly once
    • Loop to be executed more than once
  • Path testing:
    • Make sure all paths in the program are executed
  • Branch Testing (Conditional Testing): Make sure that each possible outcome from a condition is tested at least once

if (i == true)

System.out.println("YES");

else

System.out.println("NO");

Test cases: 1) i = true; 2) i = false

white box testing2
White-Box Testing
  • Statement Testing: Test single statements
  • Loop Testing:
    • Cause execution of the loop to be skipped completely. (Exception: Repeat loops)
    • Loop to be executed exactly once
    • Loop to be executed more than once
  • Path testing:
    • Make sure all paths in the program are executed
  • Branch Testing (Conditional Testing): Make sure that each possible outcome from a condition is tested at least once

if (i == true)

System.out.println("YES");

System.out.println("OK");

Test cases: 1) i = true; 2) i = false

jcoverage tool
JCoverage tool
  • Measure statement coverage
    • Know which statements haven’t been exercised
    • Then you can try to generate tests to exercise them
      • A challenging problem though for complex programs
  • Demo