Programming Language Support for Automated Testing

18
Programming Language Support for Automated Testing Roy Patrick Tan Virginia Tech

description

Programming Language Support for Automated Testing. Roy Patrick Tan Virginia Tech. Software tools help us write bug-free programs. Compiler Syntax errors Type checking Formal Verification Need to write formal specifications Proofs usually need human intervention Unit testing - PowerPoint PPT Presentation

Transcript of Programming Language Support for Automated Testing

Page 1: Programming Language Support for Automated Testing

Programming Language Support for Automated

TestingRoy Patrick Tan

Virginia Tech

Page 2: Programming Language Support for Automated Testing

Software tools help us write bug-free programs

• Compiler– Syntax errors– Type checking

• Formal Verification– Need to write formal specifications– Proofs usually need human intervention

• Unit testing– Need to write unit tests – However, running unit tests can be automatic

Page 3: Programming Language Support for Automated Testing

We can use formal specs to generate unit tests

• Design-by-contract style specs (i.e. “executable” specifications)

• Generate test-case candidate using sequences of method calls

• Use postconditions as test-oracle

• Use preconditions to filter invalid tests

Page 4: Programming Language Support for Automated Testing

Sample Spec: Stackconcept Stack( Item ) {

model method sequence(): concept Sequence( Item ); method push( element: Item ) ensures sequence().equals( \old(sequence().insertLast( element.mathObject() ));

method pop( element: Item ) requires sequence().notEmpty() ensures \old(sequence()).equals( sequence().insertLast( element.mathObject() ));

method length(): Int ensures { \old(sequence()).equals(sequence()); length.equals(sequence().length()); };}

Page 5: Programming Language Support for Automated Testing

Model object lifetime as walks through a graph

• Every walk from init to finalize is an object lifetime -- can use as a test-case

• Some walks may be infeasible

• Generating all possible walks may be impossible

• Reseach problem: what set of walks will be good test-cases?

Page 6: Programming Language Support for Automated Testing

Automated-testing: what PL features do we need?

• Design-by-contract formal specs– Preconditions, postconditions, invariants should be

executable

• Enough features to be realistic, but not too much to be overwhelming– Encourage language features that make it easier

to write specs (separate specs and implementation)

– Eliminate language features that make it difficult to write specs (aliasing, null values)

Page 7: Programming Language Support for Automated Testing

Sulu• Main influences: RESOLVE, JML• Main differences from RESOLVE:

– object-oriented notation– spec language geared toward DBC

• Separation between specification (concepts) and implementation (realizations)

• Every object has a default initial state (no null values)

• Swapping ‘:=:’ as the main data movement operator

Page 8: Programming Language Support for Automated Testing

Digression: What’s wrong with assignment?

• Consider this java snippet:int a, b;a = 1;b = a;b = b + 1;

• After these operations what is the value of a?

• What is the value of b?

Page 9: Programming Language Support for Automated Testing

Object assignment is different from scalar assignment

• Now consider this java snippetjava.util.Stack a, b;

a = new java.util.Stack();

b = new java.util.Stack();

b = a;

b.push(“Hello”);

• What does b contain after these statements?• What about a?

Page 10: Programming Language Support for Automated Testing

Aliasing is evil• Scalar assignment in Java creates a

copy of the value• Object assignment creates an alias to

the same object, not a copy.• Aliasing is a big source of bugs!• Simple example, squaring a matrix:

matrix_multiply(a,a);

• Aliasing breaks modularity of reasoning

Page 11: Programming Language Support for Automated Testing

Is there a different way?• Copying preserves modularity of

reasoning but can be inefficient• Aliasing is efficient, but breaks

modularity of reasoning• Swapping!

– a :=: b– The pre-value of a becomes the post-value

of b, and vice versa

Page 12: Programming Language Support for Automated Testing

Swapping as an alternative to assignment?

• Swapping is efficient– Internally, compiler can make every swap

constant time.

• Swapping does not break modularity of reasoning– No aliases

Page 13: Programming Language Support for Automated Testing

Sulu Example:Using the Stack componentclass StringStack extends concept Stack(String) realization LinkedList();

x.push("Hello");x.push("World");x.push("!");

var c: Console;

x.pop(z);c.println(z);x.pop(z);c.println(z);x.pop(z);c.println(z);

Output:

!

World

Hello

Page 14: Programming Language Support for Automated Testing

Stack implementationrealization LinkedList() implements Stack( Item ) {

/* A linked-list node is a pair containing the item to store and a pointer to another node*/

class Node extends concept Pair( Item, concept ChainPointer(Node) realization Builtin() ) realization Obvious();

var top: concept ChainPointer(Node) realization Builtin(); var count: Int;

method pop( element: Item ) { //”dereference” the top pointer var topNode: Node; top.swapEntry( topNode );

//get the value at the top of //the stack and put in element topNode.swapFirst( element );

//set the value of top to the //next-pointer topNode.swapSecond( top );

count := count.minus( 1 );}

Page 15: Programming Language Support for Automated Testing

Stack implementationrealization LinkedList() implements Stack( Item ) {

/* A linked-list node is a pair containing the item to store and a pointer to another node*/

class Node extends concept Pair( Item, concept ChainPointer(Node) realization Builtin() ) realization Obvious();

var top: concept ChainPointer(Node) realization Builtin(); var count: Int;

method pop( element: Item ) { //”dereference” the top pointer var topNode: Node; top.swapEntry( topNode );

//get the value at the top of //the stack and put in element topNode.swapFirst( element );

//set the value of top to the //next-pointer topNode.swapSecond( top );

count := count.minus( 1 );}

Pointers are just another component,No special language constructs for pointers

Page 16: Programming Language Support for Automated Testing

Stack implementationrealization LinkedList() implements Stack( Item ) {

/* A linked-list node is a pair containing the item to store and a pointer to another node*/

class Node extends concept Pair( Item, concept ChainPointer(Node) realization Builtin() ) realization Obvious();

var top: concept ChainPointer(Node) realization Builtin(); var count: Int;

method pop( element: Item ) { //”dereference” the top pointer var topNode: Node; top.swapEntry( topNode );

//get the value at the top of //the stack and put in element topNode.swapFirst( element );

//set the value of top to the //next-pointer topNode.swapSecond( top );

count := count.minus( 1 );}

Swapping is the main data-movement operator

Page 17: Programming Language Support for Automated Testing

Stack implementationrealization LinkedList() implements Stack( Item ) {

/* A linked-list node is a pair containing the item to store and a pointer to another node*/

class Node extends concept Pair( Item, concept ChainPointer(Node) realization Builtin() ) realization Obvious();

var top: concept ChainPointer(Node) realization Builtin(); var count: Int;

method pop( element: Item ) { //”dereference” the top pointer var topNode: Node; top.swapEntry( topNode );

//get the value at the top of //the stack and put in element topNode.swapFirst( element );

//set the value of top to the //next-pointer topNode.swapSecond( top );

count := count.minus( 1 );}

Assignment is only allowed with methodreturn values.

Page 18: Programming Language Support for Automated Testing

What’s next?

• Fully implement specification language

• Implement test-case generation algorithms (all-pairs, all-triples, others?)

• Run experiments

• Graduate